/*******************************************************************************
 * Copyright (c) 2001, 2006 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.wsdl.ui.internal.adapters;

import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
import org.eclipse.wst.wsdl.Binding;
import org.eclipse.wst.wsdl.BindingFault;
import org.eclipse.wst.wsdl.BindingInput;
import org.eclipse.wst.wsdl.BindingOperation;
import org.eclipse.wst.wsdl.BindingOutput;
import org.eclipse.wst.wsdl.Definition;
import org.eclipse.wst.wsdl.ExtensibilityElement;
import org.eclipse.wst.wsdl.Fault;
import org.eclipse.wst.wsdl.Import;
import org.eclipse.wst.wsdl.Input;
import org.eclipse.wst.wsdl.Message;
import org.eclipse.wst.wsdl.MessageReference;
import org.eclipse.wst.wsdl.Operation;
import org.eclipse.wst.wsdl.Output;
import org.eclipse.wst.wsdl.Part;
import org.eclipse.wst.wsdl.Port;
import org.eclipse.wst.wsdl.PortType;
import org.eclipse.wst.wsdl.Service;
import org.eclipse.wst.wsdl.binding.http.HTTPAddress;
import org.eclipse.wst.wsdl.binding.soap.SOAPAddress;
import org.eclipse.wst.wsdl.ui.internal.adapters.basic.W11Binding;
import org.eclipse.wst.wsdl.ui.internal.adapters.basic.W11BindingMessageReference;
import org.eclipse.wst.wsdl.ui.internal.adapters.basic.W11BindingOperation;
import org.eclipse.wst.wsdl.ui.internal.adapters.basic.W11Description;
import org.eclipse.wst.wsdl.ui.internal.adapters.basic.W11EndPoint;
import org.eclipse.wst.wsdl.ui.internal.adapters.basic.W11Import;
import org.eclipse.wst.wsdl.ui.internal.adapters.basic.W11Interface;
import org.eclipse.wst.wsdl.ui.internal.adapters.basic.W11Message;
import org.eclipse.wst.wsdl.ui.internal.adapters.basic.W11MessageReference;
import org.eclipse.wst.wsdl.ui.internal.adapters.basic.W11Operation;
import org.eclipse.wst.wsdl.ui.internal.adapters.basic.W11ParameterForPart;
import org.eclipse.wst.wsdl.ui.internal.adapters.basic.W11Service;
import org.eclipse.wst.wsdl.ui.internal.adapters.basic.W11Type;
import org.eclipse.wst.wsdl.ui.internal.adapters.specialized.W11AddressExtensibilityElementAdapter;
import org.eclipse.wst.wsdl.ui.internal.adapters.specialized.W11ExtensibilityElementAdapter;
import org.eclipse.wst.wsdl.ui.internal.asd.facade.IMessageReference;
import org.eclipse.xsd.XSDConcreteComponent;
import org.eclipse.xsd.XSDSchema;

public class WSDLAdapterFactory extends AdapterFactoryImpl
{
  static WSDLAdapterFactory instance;
  
  public static WSDLAdapterFactory getInstance()
  {
    if (instance == null)
    {
      instance = new WSDLAdapterFactory();
    }  
    return instance;
  }
  
  public Adapter createAdapter(Notifier target)
  {
	  Adapter adapter = null;

	  if (target instanceof Definition) {
		  adapter = new W11Description();
	  }
	  else if (target instanceof Service) {
		  adapter = new W11Service();
	  }
	  else if (target instanceof Binding) {
		  adapter = new W11Binding();
	  }
      else if (target instanceof BindingOperation) {
          adapter = new W11BindingOperation();
      }
      else if (target instanceof BindingInput ||
               target instanceof BindingOutput ||
               target instanceof BindingFault)
      {  
		  adapter = new W11BindingMessageReference();
	  }
	  else if (target instanceof Port) {
		  adapter = new W11EndPoint();
	  }
      else if (target instanceof PortType) {
          adapter = new W11Interface();
      }  
	  else if (target instanceof Operation) {
		  adapter = new W11Operation();
	  }
	  else if (target instanceof MessageReference)
	  {
	    int kind = -1;
	    if (target instanceof Input)
	    {
	      kind = IMessageReference.KIND_INPUT;
	    }
	    else if (target instanceof Output)
	    {
	      kind = IMessageReference.KIND_OUTPUT;
	    }
	    else if (target instanceof Fault)
	    {
	      kind = IMessageReference.KIND_FAULT;
	    }
	    adapter = new W11MessageReference(kind);
	  }
	  else if (target instanceof Import) {
		  adapter = new W11Import();
	  }
	  else if (target instanceof XSDSchema) {
		  adapter = new W11Type();
	  }
	  else if (target instanceof Message) {
		  adapter = new W11Message();
	  }
      else if (target instanceof Part)
      {
    	  adapter = new W11ParameterForPart(); 
      }
      else if (target instanceof Message || 
               target instanceof XSDConcreteComponent)
      {
        // not we only need this adapter to serve as an 'otherThingsToListenTo' adapter
        // for use by the W11MessageReference when computing a parameter list
        adapter = new WSDLBaseAdapter();
      }  
      else if (target instanceof SOAPAddress ||
               target instanceof HTTPAddress)
      {
        // TODO.. we need to enable the factory to delegate to extension language adapter factories
        // there should be no references to SOAP or HTTP stuff from within this class
        //
        adapter = new W11AddressExtensibilityElementAdapter();        
      }         
      else if (target instanceof ExtensibilityElement)
      {
        adapter = new W11ExtensibilityElementAdapter();
      }  
	  if (adapter == null)
	  {
	    System.out.println("NO ADAPTER CREATED FOR " + target);    //$NON-NLS-1$
	    Thread.dumpStack();
	  }

	  return adapter;		  
  }
  
  public Adapter adapt(Notifier target)
  {
    return adapt(target, this);
  }
}
