/*******************************************************************************
 * Copyright (c) 2009 by SAP AG, Walldorf. 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.ws.jaxws.dom.integration.navigator;

import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.util.EList;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IServiceEndpointInterface;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IWebService;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IWebServiceProject;
import org.eclipse.jst.ws.jaxws.dom.ui.DomItemProviderAdapterFactory;

/**
 * Factory that adapts DOM objects with Item provider adapters. For {@link ISEIChildList} and 
 * {@link IWebServiceChildList} it creates specific adapter for other DOM objects delegates to
 * {@link DomItemProviderAdapterFactory}.
 * 
 * @author
 */
public class CustomDomItemProviderAdapterFactory extends DomItemProviderAdapterFactory 
{
	/**
	 * The singleton instance
	 */
	public static final CustomDomItemProviderAdapterFactory INSTANCE = new CustomDomItemProviderAdapterFactory();
	
	/**
	 * Constructor
	 */
	private CustomDomItemProviderAdapterFactory() 
	{
		super();
		
		supportedTypes.add(IWebServiceChildList.class);
		supportedTypes.add(ISEIChildList.class);
	}
	
	protected Adapter createIWebServiceChildListAdapter(final IWebServiceProject wsProj) 
	{
		return new IWebServiceChildList()
			{
				public EList<IWebService> getWSChildList()
				{
					return wsProj.getWebServices();
				}

				public Notifier getTarget() 
				{
					return wsProj;
				}

				public boolean isAdapterForType(Object type) 
				{
					return false;
				}

				public void notifyChanged(Notification notification) 
				{
					// no processing needed currently
				}

				public void setTarget(Notifier newTarget) 
				{
					// no processing needed currently
				}
			};
	}
	
	protected Adapter createISEIChildListAdapter(final IWebServiceProject wsProj) 
	{
		return new ISEIChildList()
			{
				public EList<IServiceEndpointInterface> getSEIChildList()
				{
					return wsProj.getServiceEndpointInterfaces();
				}

				public Notifier getTarget() 
				{
					return wsProj;
				}

				public boolean isAdapterForType(Object type) 
				{
					return false;
				}

				public void notifyChanged(Notification notification) 
				{
					// no processing needed currently
				}

				public void setTarget(Notifier newTarget) 
				{
					// no processing needed currently
				}
			};
	}
	
	@Override
	public Adapter adapt(Notifier notifier, Object type)
	{
		if (notifier instanceof IWebServiceProject && type instanceof Class)
		{
			if(type.equals(IWebServiceChildList.class))
			{
				return adaptIWebServiceChildList((IWebServiceProject)notifier);
			}
			else if(type.equals(ISEIChildList.class))
			{
				return adaptISEIChildList((IWebServiceProject)notifier);
			}
		}
		
		return super.adapt(notifier, type);
	}
	
	protected Adapter adaptISEIChildList(final IWebServiceProject wsProject)
	{
		for(Adapter adapter : wsProject.eAdapters())
		{
			if(adapter instanceof ISEIChildList) {
				return adapter;
			}
		}
		
		final Adapter adapter = createISEIChildListAdapter(wsProject);
		associate(adapter, wsProject);
		
		return adapter;
	}
	
	protected Adapter adaptIWebServiceChildList(final IWebServiceProject wsProject)
	{
		for(Adapter adapter : wsProject.eAdapters())
		{
			if(adapter instanceof IWebServiceChildList) {
				return adapter;
			}
		}
		
		final Adapter adapter = createIWebServiceChildListAdapter(wsProject);
		associate(adapter, wsProject);
		
		return adapter;		
	}
}
