/*******************************************************************************
 * 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.runtime.util;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jst.ws.jaxws.dom.runtime.DomUtil;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.DomPackage;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IServiceEndpointInterface;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IWebMethod;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IWebParam;
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.utils.ContractChecker;


/**
 * Class that takes care for mapping DOM objects to Eclipse resources. 
 * 
 * @author Georgi Vachkov
 */
public class Dom2ResourceMapper
{
	/** the singleton instance */
	public static final Dom2ResourceMapper INSTANCE = new Dom2ResourceMapper();
	
	private DomSwitch<String> implClassFinderSwitch;
	
	/**
	 * Singleton Constructor 
	 */
	private Dom2ResourceMapper() {	
		this.implClassFinderSwitch = createImplFinderSwitch();
	}
	
	/**
	 * Finds underlying {@link IResource} for this DOM object
	 * @param eObject the DOM object
	 * @return found resource or <code>null</code>
	 * @throws JavaModelException
	 */
	public IResource findResource(final EObject eObject) throws JavaModelException
	{
		ContractChecker.nullCheckParam(eObject);
		switch (eObject.eClass().getClassifierID()) 
		{
		case DomPackage.IWEB_SERVICE:
		case DomPackage.ISERVICE_ENDPOINT_INTERFACE: 
		case DomPackage.IWEB_METHOD: 
		case DomPackage.IWEB_PARAM:	
			final IType type = findType(eObject); 
			return type==null ? null : type.getResource();
		case DomPackage.IWEB_SERVICE_PROJECT:
			return findProject((IWebServiceProject)eObject);
		}

		return null;
	}
	
	/**
	 * Finds IProject instance for the web service project represented by <code>wsProject</code>
	 * @param wsProject the project DOM object
	 * @return found resource or <code>null</code>
	 */
	public IProject findProject(final IWebServiceProject wsProject)
	{
		if (wsProject == null) {
			return null;
		}

		return ResourcesPlugin.getWorkspace().getRoot().getProject(wsProject.getName());
	}
	
	/**
	 * Finds underlying {@link IType} instance for this <code>eObject</code> 
	 * @param eObject the DOM object
	 * @return the IType containing this <code>eObject</code> or <code>null</code>
	 * @throws JavaModelException
	 */
	public IType findType(final EObject eObject) throws JavaModelException 
	{
		ContractChecker.nullCheckParam(eObject);
		
		final IProject project = findProject(DomUtil.INSTANCE.findWsProject(eObject));
		final IJavaProject javaProject = JavaCore.create(project);
		final String fqName = implClassFinderSwitch.doSwitch(eObject);
		if (javaProject==null || fqName == null) {
			return null;
		}
		
		return javaProject.findType(fqName);
	}

	private DomSwitch<String> createImplFinderSwitch()
	{
		return new DomSwitch<String>()
		{
			@Override
			public String caseIWebService(IWebService ws) {
				return ws.getImplementation();
			}
			
			@Override
			public String caseIServiceEndpointInterface(IServiceEndpointInterface sei) {
				return sei == null ? null : sei.getImplementation();
			}
			
			@Override
			public String caseIWebMethod(IWebMethod wm) {
				return wm == null ? null : caseIServiceEndpointInterface((IServiceEndpointInterface) wm.eContainer());
			}	
			
			@Override
			public String caseIWebParam(IWebParam wp) {
				return caseIWebMethod((IWebMethod)wp.eContainer());
			}
		};
	}
}
