/*******************************************************************************
 * Copyright (c) 2003, 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
 *******************************************************************************/
/*
 * Created on Mar 30, 2004
 *
 * To change the template for this generated file go to
 * Window - Preferences - Java - Code Generation - Code and Comments
 */
package org.eclipse.jst.j2ee.internal.deploy;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
import org.eclipse.jst.j2ee.model.IModelProvider;
import org.eclipse.jst.j2ee.model.ModelProviderManager;
import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.project.facet.core.IFacetedProject;
import org.eclipse.wst.common.project.facet.core.IProjectFacet;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
import org.eclipse.wst.server.core.IRuntime;

/**
 * @author cbridgha
 * 
 * To change the template for this generated type comment go to Window - Preferences - Java - Code
 * Generation - Code and Comments
 */
public class DeployerRegistry {
	/**
	 *  
	 */
	private static DeployerRegistry INSTANCE;
	private HashMap deployModuleExtensions = new HashMap();
	private HashMap facetExceptions = new HashMap();

	public DeployerRegistry() {
		super();
	}

	/**
	 * @param deployer
	 * @param facetExclusions 
	 * @param serverTarget
	 * @param natureID
	 */
	public void register(IConfigurationElement deployer, List serverTargets, List natures, List facetExclusions) {
		HashMap targetDeployers;
		for (Iterator iter = natures.iterator(); iter.hasNext();) {
			String natureID = (String) iter.next();
			for (Iterator iterator = serverTargets.iterator(); iterator.hasNext();) {
				String runtimeID = (String) iterator.next();
				targetDeployers = getDeployModuleExtensions(natureID);
				getTargetDeployers(targetDeployers, runtimeID).add(deployer);
			}
		}
		//Now register exclusions if any
		List facets = getFacetExceptions(deployer);
		for (Iterator iterator = facetExclusions.iterator(); iterator.hasNext();) {
			String facetID = (String) iterator.next();
			if (!facets.contains(facetID))
				facets.add(facetID);
		}	
	}
	
	/**
	 * @param deployer
	 * @param serverTarget
	 * @param natureID
	 */
	public void register(IConfigurationElement deployer, List serverTargets, List natures) {
		register(deployer, serverTargets, natures, new ArrayList());
	}

	private List getDeployers(String natureID, String serverTarget) {
		HashMap targetDeployers = getDeployModuleExtensions(natureID);
		return getTargetDeployers(targetDeployers, serverTarget);
	}

	public static DeployerRegistry instance() {
		if (INSTANCE == null) {
			INSTANCE = new DeployerRegistry();
			readRegistry();
		}
		return INSTANCE;
	}

	/**
	 *  
	 */
	private static void readRegistry() {
		DeployerRegistryReader reader = new DeployerRegistryReader();
		reader.readRegistry();
	}

	/**
	 * @return a list of IVirtualComponent's
	 */
	public static List getSelectedModules(Object[] mySelections) {
		List modules = new ArrayList();
		for (int i = 0; i < mySelections.length; i++) {
			Object object = mySelections[i];
			if (object instanceof EObject) {
				object = ProjectUtilities.getProject(object);
			}
			if (object instanceof IProject) {
				IVirtualComponent component = ComponentCore.createComponent((IProject)object);
				IModelProvider modelProvider = null;
					
				modelProvider = ModelProviderManager.getModelProvider(component.getProject());
				if (modelProvider == null)
					continue;
				// we just happen to know it
				EObject root = (EObject) modelProvider.getModelObject();
				
				if (root == null || modules.contains(component))
					continue;
				// Order Ears first...
				if (JavaEEProjectUtilities.isEARProject(component.getProject()))
					modules.add(0, component);
				else
					modules.add(component);
			
			}
		}
		return modules;
	}

	/**
	 * @param targetDeployers
	 * @param serverTarget
	 */
	private List getTargetDeployers(HashMap targetDeployers, String serverTarget) {
		if (targetDeployers.get(serverTarget) == null)
			targetDeployers.put(serverTarget, new ArrayList());
		return (List) targetDeployers.get(serverTarget);
	}

	/**
	 * @param natureID
	 * @return
	 */
	private HashMap getDeployModuleExtensions(String natureID) {
		if (getDeployModuleExtensions().get(natureID) == null)
			getDeployModuleExtensions().put(natureID, new HashMap());
		return (HashMap) getDeployModuleExtensions().get(natureID);
	}

	/**
	 * @return Returns the deployExtensions.
	 */
	public HashMap getDeployModuleExtensions() {
		return deployModuleExtensions;
	}

	/**
	 * @param deployExtensions
	 *            The deployExtensions to set.
	 */
	public void setDeployModuleExtensions(HashMap deployExtensions) {
		this.deployModuleExtensions = deployExtensions;
	}

	/**
	 * @param module
	 * @param runtime
	 * @return
	 */
	public List getDeployModuleExtensions(EObject module, IRuntime runtime) {
		IVirtualComponent comp = ComponentUtilities.findComponent(module);
		return getDeployModuleExtensions(comp.getProject(), runtime);
	}

	/**
	 * @param module
	 * @param runtime
	 * @return
	 */
	public List getDeployModuleExtensions(IProject project, IRuntime runtime) {
		String typeID = ""; //$NON-NLS-1$
		if (JavaEEProjectUtilities.isEARProject(project))
			typeID = J2EEProjectUtilities.ENTERPRISE_APPLICATION;
		else if (JavaEEProjectUtilities.isApplicationClientProject(project))
			typeID = J2EEProjectUtilities.APPLICATION_CLIENT;
		else if (JavaEEProjectUtilities.isDynamicWebProject(project))
			typeID = J2EEProjectUtilities.DYNAMIC_WEB;
		else if (JavaEEProjectUtilities.isStaticWebProject(project))
			typeID = J2EEProjectUtilities.STATIC_WEB;
		else if (JavaEEProjectUtilities.isEJBProject(project))
			typeID = J2EEProjectUtilities.EJB;
		else if (JavaEEProjectUtilities.isJCAProject(project))
			typeID = J2EEProjectUtilities.JCA;
		else if (JavaEEProjectUtilities.isUtilityProject(project))
			typeID = J2EEProjectUtilities.UTILITY;
		
		String runtimeID = null;
		if (runtime == null)
			runtimeID = "None"; //$NON-NLS-1$
		else
			runtimeID = runtime.getRuntimeType().getId();
		List deployers = getDeployers(typeID, runtimeID);
		return getFilteredDeployers(project,deployers); 
	}

	private List getFilteredDeployers(IProject project, List deployers) {
		IFacetedProject fProj = null;
		try {
			fProj = ProjectFacetsManager.create(project);
		} catch (CoreException e) {
			org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin.logError(e);
		}
		if (fProj == null) return deployers;
		List filteredDeployers = new ArrayList();
		for (Iterator iterator = deployers.iterator(); iterator.hasNext();) {
			boolean excludeDeployer = false;
			IConfigurationElement deployer = (IConfigurationElement) iterator.next();
			List exclusions = getFacetExceptions(deployer);
			if (exclusions.isEmpty())
				filteredDeployers.add(deployer);
			else {
				for (Iterator iterator2 = exclusions.iterator(); iterator2.hasNext();) {
					String exclusion = (String) iterator2.next();
					IProjectFacet facet = null;
					try {
						facet = ProjectFacetsManager.getProjectFacet(exclusion);
					} catch (IllegalArgumentException e) {
						//Facet id not found
						// Don't log as this could be expected.....
					}
					if (facet != null && fProj.hasProjectFacet(facet)) {
						excludeDeployer = true;
					}
				}
				if (!excludeDeployer)
					filteredDeployers.add(deployer);
			}
			
		}
		return filteredDeployers;
	}

	
	private List getFacetExceptions(IConfigurationElement deployer) {
		if (facetExceptions.get(deployer) == null)
			facetExceptions.put(deployer, new ArrayList());
		return (List)facetExceptions.get(deployer);
	}

}
