/*******************************************************************************
 * 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.tests.dom.persistence.sync;

import java.util.ArrayList;
import java.util.Collection;

import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceDescription;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jdt.core.IJavaModel;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jst.ws.jaxws.dom.runtime.DomUtil;
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.JaxWsWorkspaceResource;
import org.eclipse.jst.ws.jaxws.dom.runtime.tests.dom.persistence.DomTestUtils;
import org.eclipse.jst.ws.jaxws.testutils.jmock.MockObjectTestCase;
import org.eclipse.jst.ws.jaxws.testutils.jobs.JobUtils;
import org.eclipse.jst.ws.jaxws.testutils.project.TestEjb3Project;
import org.eclipse.jst.ws.jaxws.testutils.project.TestProject;

public class SynchronizationTestFixture extends MockObjectTestCase
{
	protected TestProject testPrj1; 
	protected TestProject testPrj2;
	protected JaxWsWorkspaceResource target;
	protected IJavaModel javaModel;
	
	protected static final String prj1PckName = "com.sap.test.modelsync1";	
	protected static final String prj2PckName = "com.sap.test.modelsync2";
	
	protected static final String ws1ImplName = prj1PckName + ".WS1";
	protected static final String sei1ImplName = prj1PckName + ".Sei1";
	protected static final String ws2ImplName = prj2PckName + ".WS2";
	protected static final String sei2ImplName = prj2PckName + ".Sei2";	
	
	protected IWebServiceProject wsPrj1;
	protected IWebService ws1;
	protected IServiceEndpointInterface sei1;
	
	protected IWebServiceProject wsPrj2;
	protected IWebService ws2;
	protected IServiceEndpointInterface sei2;
	protected Collection<String> allowedProjects;
	
	protected DomUtil domUtil =  new DomUtil();
	protected DomTestUtils testUtil =  new DomTestUtils();

	public void setUp() throws Exception
	{
		allowedProjects = new ArrayList<String>(3);
		javaModel = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
		target = createTarget();
		testPrj1 = new TestProject(new TestEjb3Project("TestProject1").getProject());
		testPrj1.createSourceFolder("src");
		final IPackageFragment modelSync1 = testPrj1.createPackage("com.sap.test.modelsync1");
		final String javaModelErrorMessage = "Java Model Error. Just created type not found in the java model";
		assertNotNull(javaModelErrorMessage, testPrj1.createType(modelSync1, "Sei1.java", "@javax.jws.WebService(name=\"Sei1Name\") public interface Sei1 {}"));
		assertNotNull(javaModelErrorMessage, testPrj1.createType(modelSync1, "WS1.java", "@javax.jws.WebService(serviceName=\"WS1Name\", endpointInterface=\"com.sap.test.modelsync1.Sei1\") public class WS1 {}"));
				
		testPrj2 = new TestProject(new TestEjb3Project("TestProject2").getProject());
		testPrj2.createSourceFolder("src");
		final IPackageFragment modelSync2 = testPrj2.createPackage("com.sap.test.modelsync2");
		assertNotNull(javaModelErrorMessage, testPrj2.createType(modelSync2, "Sei2.java", "@javax.jws.WebService(name=\"Sei2Name\") public interface Sei2 {}"));
		assertNotNull(javaModelErrorMessage, testPrj2.createType(modelSync2, "WS2.java", "@javax.jws.WebService(serviceName=\"WS2Name\", endpointInterface=\"com.sap.test.modelsync1.Sei2\") public class WS2 {}"));
		
		allowedProjects.add(testPrj1.getJavaProject().getElementName());
		allowedProjects.add(testPrj2.getJavaProject().getElementName());
		JobUtils.waitForJobs();
		
		target.load(null);
		wsPrj1 = domUtil.findProjectByName(target.getDOM(), testPrj1.getJavaProject().getElementName());
		assertNotNull(wsPrj1);
		
		assertEquals(1, wsPrj1.getServiceEndpointInterfaces().size());
		assertEquals(1, wsPrj1.getWebServices().size());
				
		ws1 = domUtil.findWsByImplName(wsPrj1, ws1ImplName);
		assertNotNull(ws1);
		sei1 = domUtil.findSeiByImplName(wsPrj1, sei1ImplName);
		assertNotNull(sei1);
		wsPrj2 = domUtil.findProjectByName(target.getDOM(), testPrj2.getJavaProject().getElementName());
		assertNotNull(wsPrj2);
		assertEquals(1, wsPrj2.getServiceEndpointInterfaces().size());
		assertEquals(1, wsPrj2.getWebServices().size());
		
		ws2 = domUtil.findWsByImplName(wsPrj2, ws2ImplName);
		assertNotNull(ws2);
		sei2 = domUtil.findSeiByImplName(wsPrj2, sei2ImplName);
		assertNotNull(sei2);
	}
	
	@Override
	public void beforeTestCase() throws CoreException
	{
		enableAutoBuild(ResourcesPlugin.getWorkspace(), false);
	}
	
	@Override
	public void afterTestCase() throws CoreException
	{
		enableAutoBuild(ResourcesPlugin.getWorkspace(), true);
	}
	
	private void enableAutoBuild(IWorkspace ws, boolean enable) throws CoreException
	{
		final IWorkspaceDescription desc = ws.getDescription();
		desc.setAutoBuilding(enable);
		ws.setDescription(desc);
	}
	
	protected Adapter findAdapter(EObject object, Class<?> clazz) {
		for (Adapter adapter: object.eAdapters()) {
			if (adapter.isAdapterForType(clazz)) {
				return adapter; 
			}
		}
		
		return null;
	}
		
	@Override
	public void tearDown() throws CoreException
	{
		target.stopSynchronizing();
		testPrj1.dispose();
		testPrj2.dispose();
	}
	
	private JaxWsWorkspaceResource createTarget()
	{
		return new JaxWsWorkspaceResource(javaModel) 
		{

			@Override
			public boolean approveProject(IJavaProject prj) {
				for (String allowedPrj : allowedProjects)
				{
					if (prj.getElementName().equals(allowedPrj))
					{
						return true;
					}
				}
				return false;
			}
		};
	}	
}
