/*******************************************************************************
 * 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.persistence.sync;

import static org.eclipse.jst.ws.jaxws.dom.runtime.persistence.WSAnnotationFeatures.WS_ANNOTATION;

import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;

import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaModel;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jst.ws.jaxws.dom.runtime.DomUtil;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.DomFactory;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.DomPackage;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IDOM;
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.runtime.persistence.ICompilationUnitHandler;
import org.eclipse.jst.ws.jaxws.dom.runtime.persistence.IModelElementSynchronizer;
import org.eclipse.jst.ws.jaxws.dom.runtime.persistence.JaxWsWorkspaceResource;
import org.eclipse.jst.ws.jaxws.dom.runtime.persistence.JaxWsWorkspaceResource.ServiceModelData;
import org.eclipse.jst.ws.jaxws.utils.annotations.IAnnotation;
import org.eclipse.jst.ws.jaxws.utils.annotations.IAnnotationInspector;
import org.eclipse.jst.ws.jaxws.utils.logging.ILogger;

public abstract class AbstractModelSynchronizer implements IModelElementSynchronizer
{
	private final SeiSynchronizer seiLoader;

	private final WsSynchronizer wsLoader;

	private final JaxWsWorkspaceResource resource;

	private IDOM domBeingLoaded;

	private final ServiceModelData serviceData;

	private final DomUtil util;

	public AbstractModelSynchronizer(JaxWsWorkspaceResource resource, ServiceModelData serviceData)
	{
		this.resource = resource;
		this.util = new DomUtil();
		this.serviceData = serviceData;
		this.seiLoader = new SeiSynchronizer(this);
		this.wsLoader = new WsSynchronizer(this);
	}

	public DomFactory domFactory()
	{
		return DomFactory.eINSTANCE;
	}

	public IDOM getDomBeingLoaded()
	{
		if (domBeingLoaded == null)
		{
			domBeingLoaded = domFactory().createIDOM();
		}
		return domBeingLoaded;
	}

	public IJavaModel javaModel()
	{
		return resource.javaModel();
	}

	public ILogger logger()
	{
		return resource.logger();
	}

	public JaxWsWorkspaceResource resource()
	{
		return resource;
	}

	public ServiceModelData serviceData()
	{
		return serviceData;
	}

	public DomUtil util()
	{
		return util;
	}

	protected void processCompilationUnit(final IWebServiceProject wsProject, final ICompilationUnit cu) throws JavaModelException
	{
		try {
			resource.disableSaving();
			
			if (cu.findPrimaryType() == null || !(cu.findPrimaryType().isInterface() || cu.findPrimaryType().isClass()))
			{
				if (logger().isDebug())
				{
					logger().logDebug("no primary type in compilation unit" + cu.getPath().toOSString());//$NON-NLS-1$
				}
				return;
			} 
						
			final IAnnotationInspector inspector = resource().newAnnotationInspector(cu.findPrimaryType());
			final IAnnotation<IType> wsAnnotation = inspector.inspectType(WS_ANNOTATION);
			if (wsAnnotation == null)
			{
				if (logger().isDebug())
				{
					logger().logDebug("no " + WS_ANNOTATION + " annotation found on type " + cu.findPrimaryType().getFullyQualifiedName());//$NON-NLS-1$//$NON-NLS-2$
				}
				return;
			}
			
			recordHierarchy(cu.findPrimaryType());
			
			if (wsAnnotation.getAppliedElement().isInterface())
			{
				// handle class changed to interface
				removeWsModelElements(wsProject, wsAnnotation.getAppliedElement().getFullyQualifiedName(), false);
				
				seiLoader.synchronizeInterface(wsProject, wsAnnotation, inspector);
			} else if (wsAnnotation.getAppliedElement().isClass())
			{
				// handle interface changed to class
				removeSeiModelElements(wsProject, wsAnnotation.getAppliedElement().getFullyQualifiedName(), false, true);
				
				// if the annotation has changed and endpointInterface has been added the existing
				// SEI in the project should be removed
				final IWebService ws = wsLoader.synchronizeWebService(wsProject, wsAnnotation, inspector);
				if (ws!=null && (ws.getServiceEndpoint()==null || !ws.getServiceEndpoint().isImplicit())) {
					removeSeiModelElements(wsProject, ws.getImplementation(), false, false);
				}
			} else
			{
				if (logger().isDebug())
				{
					logger().logDebug("annotation " + WS_ANNOTATION + " is put on type "//$NON-NLS-1$//$NON-NLS-2$
									+ wsAnnotation.getAppliedElement().getFullyQualifiedName()
									+ "which is neither interface, nor a class. Ignorring!");//$NON-NLS-1$
				}
			}			
		} finally {
			resource.enableSaving();
		}
	}
	
	/**
	 * Removes web services from the model.
	 * @param wsProject
	 * @param implBaseName
	 */
	protected void removeWsModelElements(final IWebServiceProject wsProject, final String implBaseName, final boolean isForPackage) 
	{
		final Iterator<IWebService> wsIter = wsProject.getWebServices().iterator();
		while (wsIter.hasNext())
		{
			final IWebService ws = wsIter.next();
			if (ws.getImplementation().equals(implBaseName) || 
				(isForPackage && ws.getImplementation().startsWith(implBaseName)))
			{
				serviceData().clearHierarchy(ws.getImplementation());
				wsIter.remove();
				if (ws.getServiceEndpoint() != null)
				{
					ws.getServiceEndpoint().getImplementingWebServices().remove(ws);
				}
				serviceData().unmap(ws);
			}
		}
	}
	
	/**
	 * Removes SEI's with <code>implBaseName</code> implementation from the model.
	 * @param wsProject
	 * @param implBaseName
	 * @param onlyExplicit if <code>true</code> implicit interfaces are not removed from model, otherwise both are removed.
	 */
	protected void removeSeiModelElements(final IWebServiceProject wsProject, final String implBaseName, final boolean isForPackage, final boolean onlyExplicit) 
	{
		final Iterator<IServiceEndpointInterface> seiIter = wsProject.getServiceEndpointInterfaces().iterator();
		while (seiIter.hasNext())
		{
			final IServiceEndpointInterface sei = seiIter.next();
			if (sei.getImplementation().equals(implBaseName) ||
				(isForPackage && sei.getImplementation().startsWith(implBaseName)))
			{
				if ((onlyExplicit && sei.isImplicit())) {
					continue;
				}
				serviceData().clearHierarchy(sei.getImplementation());
				sei.getImplementingWebServices().clear();
				seiIter.remove();
			}
		}
	}	

	void recordHierarchy(IType type) throws JavaModelException
	{
		final Collection<ICompilationUnit> compilationUnits = new LinkedList<ICompilationUnit>();
		
		for (IType superType : type.newSupertypeHierarchy(null).getAllSupertypes(type)) {
			compilationUnits.add(superType.getCompilationUnit());
		}
			
		serviceData().recordHierarchy(type.getFullyQualifiedName(), compilationUnits);
	}


	protected IWebServiceProject createProject(final IJavaProject jprj)
	{
		final IWebServiceProject thisProject = domFactory().createIWebServiceProject();
		util().setFeatureValue(thisProject, DomPackage.IWEB_SERVICE_PROJECT__NAME, jprj.getElementName());

		util().addToCollectionFeature(getDomBeingLoaded(), DomPackage.IDOM__WEB_SERVICE_PROJECTS, thisProject);
		return thisProject;
	}

	protected class LoaderCompilationUnitHandler implements ICompilationUnitHandler
	{
		public void started()
		{
		}

		public void finished()
		{
			resource().getContents().add(getDomBeingLoaded());
		}

		protected IWebServiceProject wsProject;

		public void handle(final IJavaProject jprj)
		{
			wsProject = createProject(jprj);
		}

		public void handle(final ICompilationUnit cu)
		{
			try
			{
				processCompilationUnit(wsProject, cu);
			} catch (JavaModelException jme)
			{
				logger().logError("Unable to parse the content of compilation unit" + cu.getPath().toOSString(), jme); //$NON-NLS-1$
			}
		}
	}
}
