/*******************************************************************************
 * 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.extensions;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.gef.EditPartFactory;
import org.eclipse.wst.wsdl.ui.internal.actions.IWSDLToolbarAction;

public class WSDLEditorConfiguration {
	  public static final String WSDLEDITORCONFIGURATIONEXTENSIONID = "org.eclipse.wst.wsdl.ui.WSDLEditorExtensionConfiguration"; //$NON-NLS-1$
	  public static final String INTERNALEDITORCONFIGURATION_EXTENSIONID = "org.eclipse.wst.wsdl.ui.internalEditorConfiguration"; //$NON-NLS-1$
	  public static final String CLASSNAME = "class"; //$NON-NLS-1$
	  public static final String ADAPTERFACTORY = "adapterFactory"; //$NON-NLS-1$
	  public static final String TOOLBARACTION = "toolbarAction"; //$NON-NLS-1$
	  public static final String FIGUREFACTORY = "figureFactory"; //$NON-NLS-1$
	  public static final String EDITPARTFACTORY = "editPartFactory"; //$NON-NLS-1$

	  List definedExtensionsList = null;

	  public WSDLEditorConfiguration()
	  {

	  }

	  public AdapterFactory getAdapterFactory()
	  {
	    if (definedExtensionsList == null)
	    {
	      readWSDLConfigurationRegistry();
	    }
	    if (!definedExtensionsList.isEmpty())
	    {
	      return ((WSDLEditorExtensionProperties) definedExtensionsList.get(0)).getAdapterFactory();
	    }
	    return null;
	  }

	  public EditPartFactory getEditPartFactory()
	  {
	    if (definedExtensionsList == null)
	    {
	      readWSDLConfigurationRegistry();
	    }
	    if (!definedExtensionsList.isEmpty())
	    {
	      return ((WSDLEditorExtensionProperties) definedExtensionsList.get(0)).getEditPartFactory();
	    }
	    return null;
	  }

//	  public IExtendedFigureFactory getFigureFactory()
//	  {
//	    if (definedExtensionsList == null)
//	    {
//	      readWSDLConfigurationRegistry();
//	    }
//	    if (!definedExtensionsList.isEmpty())
//	    {
//	      return ((WSDLEditorExtensionProperties) definedExtensionsList.get(0)).getFigureFactory();
//	    }
//	    return null;
//	  }

	  public List getToolbarActions()
	  {
	    if (definedExtensionsList == null)
	    {
	      readWSDLConfigurationRegistry();
	    }
	    if (!definedExtensionsList.isEmpty())
	    {
	      return ((WSDLEditorExtensionProperties) definedExtensionsList.get(0)).getActionList();
	    }
	    return Collections.EMPTY_LIST;
	  }

	  protected Object loadClass(IConfigurationElement element, String classString)
	  {
	    String pluginId = element.getDeclaringExtension().getContributor().getName();

	    try
	    {
	      Class theClass = Platform.getBundle(pluginId).loadClass(classString);
	      Object instance = theClass.newInstance();

	      return instance;
	    }
	    catch (Exception e)
	    {

	    }
	    return null;
	  }

	  public void readWSDLConfigurationRegistry()
	  {
	    definedExtensionsList = new ArrayList();
	    updateList(INTERNALEDITORCONFIGURATION_EXTENSIONID);
	    updateList(WSDLEDITORCONFIGURATIONEXTENSIONID);
	  }
	  
	  public void updateList(String ID)
	  {
	    IConfigurationElement[] wsdlEditorExtensionList = Platform.getExtensionRegistry().getConfigurationElementsFor(ID);

	    boolean definedExtensionsExist = (wsdlEditorExtensionList != null && wsdlEditorExtensionList.length > 0);

	    definedExtensionsList = new ArrayList();

	    if (definedExtensionsExist)
	    {
	      for (int i = 0; i < wsdlEditorExtensionList.length; i++)
	      {
	        WSDLEditorExtensionProperties properties = new WSDLEditorExtensionProperties();
	        definedExtensionsList.add(properties);

	        IConfigurationElement element = wsdlEditorExtensionList[i];
	        String adapterFactoryClass = element.getAttribute(ADAPTERFACTORY);
	        if (adapterFactoryClass != null)
	        {
	          Object object = loadClass(element, adapterFactoryClass);
	          if (object instanceof AdapterFactory)
	          {
	            properties.setAdapterFactory((AdapterFactory) object);
	          }
	        }

//	        String figureFactoryClass = element.getAttribute(FIGUREFACTORY);
//	        if (figureFactoryClass != null)
//	        {
//	          Object object = loadClass(element, figureFactoryClass);
//	          IExtendedFigureFactory figureFactory = null;
//	          if (object instanceof IExtendedFigureFactory)
//	          {
//	            figureFactory = (IExtendedFigureFactory) object;
//	            properties.setFigureFactoryList(figureFactory);
//	          }
//	        }
	        
	        String editPartFactoryClass = element.getAttribute(EDITPARTFACTORY);
	        if (editPartFactoryClass != null)
	        {
	          Object object = loadClass(element, editPartFactoryClass);
	          EditPartFactory editPartFactory = null;
	          if (object instanceof EditPartFactory)
	          {
	            editPartFactory = (EditPartFactory) object;
	            properties.setEditPartFactoryList(editPartFactory);
	          }
	        }

	        IConfigurationElement[] toolbarActions = element.getChildren(TOOLBARACTION);
	        List actionList = new ArrayList();
	        if (toolbarActions != null)
	        {
	          for (int j = 0; j < toolbarActions.length; j++)
	          {
	            IConfigurationElement actionElement = toolbarActions[j];
	            String actionClass = actionElement.getAttribute(CLASSNAME);
	            IWSDLToolbarAction action = null;
	            if (actionClass != null)
	            {
	              Object object = loadClass(actionElement, actionClass);
	              if (object instanceof IWSDLToolbarAction)
	              {
	                action = (IWSDLToolbarAction) object;
	                actionList.add(action);
	              }
	            }
	          }
	        }
	        properties.setActionList(actionList);



	      }
	    }
	  }
	}
