/*******************************************************************************
 * 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 org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.common.util.EList;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.JavaModelException;
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.IWebService;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.SOAPBindingParameterStyle;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.SOAPBindingStyle;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.SOAPBindingUse;
import org.eclipse.jst.ws.jaxws.testutils.jobs.JobUtils;
import org.eclipse.jst.ws.jaxws.utils.JaxWsUtils;

public class WsSynchronizationTest extends SynchronizationTestFixture 
{
	public void test_changedWSnameSynched() throws JavaModelException, CoreException
	{
		target.startSynchronizing();
		final ICompilationUnit ws1CU = testPrj1.getJavaProject().findType(ws1.getImplementation()).getCompilationUnit();
		testUtil.setContents(ws1CU, "@javax.jws.WebService(serviceName=\"WS1NewName\", endpointInterface=\"com.sap.test.modelsync1.Sei1\") public class WS1 {}");
		JobUtils.waitForJobs();
		
		assertEquals("WS1NewName", ws1.getName());
		assertSame(sei1, ws1.getServiceEndpoint());
		assertSame(ws1, domUtil.findWsByImplName(wsPrj1, ws1.getImplementation()));
	}	
	
	public void test_changedNameOfImplicitInterface() throws Exception
	{
		target.startSynchronizing();
		final IPackageFragment modelSync3 = testPrj1.createPackage("com.sap.test.modelsync3");
		final ICompilationUnit ws3CU = testPrj1.createType(modelSync3, "WS3.java", "@javax.jws.WebService(serviceName=\"WS3Name\", name=\"ImplicitInterfaceName\") public class WS3 {}").getCompilationUnit();
		JobUtils.waitForJobs();
		
		final IWebService ws3 = domUtil.findWsByImplName(wsPrj1, ws3CU.findPrimaryType().getFullyQualifiedName());
		final IServiceEndpointInterface implSei = ws3.getServiceEndpoint();
		assertTrue(implSei.isImplicit());
		testUtil.setContents(ws3CU, "@javax.jws.WebService(serviceName=\"WS3Name\", name=\"ImplicitInterfaceNewName\") public class WS3 {}");
		JobUtils.waitForJobs();
		
		assertSame(implSei, ws3.getServiceEndpoint());
		assertTrue(implSei.isImplicit());
		assertEquals("ImplicitInterfaceNewName", implSei.getName());
	}
	
	public void test_changedTargetNamespaceSynched() throws Exception
	{
		target.startSynchronizing();
		assertEquals(JaxWsUtils.composeJaxWsTargetNamespaceByPackage(prj1PckName), ws1.getTargetNamespace());
		
		final ICompilationUnit wsCU = testPrj1.getJavaProject().findType(ws1.getImplementation()).getCompilationUnit();
		testUtil.setContents(wsCU, "@javax.jws.WebService(serviceName=\"WS1Name\", targetNamespace=\"http://com.sap./test\") public class WS1 {}");
		JobUtils.waitForJobs();
		
		assertEquals("targetNamespace not synchronized", "http://com.sap./test", ws1.getTargetNamespace());
	}
	
	public void test_changedPortNameSynched() throws Exception
	{
		target.startSynchronizing();
		final ICompilationUnit wsCU = testPrj1.getJavaProject().findType(ws1.getImplementation()).getCompilationUnit();
		assertEquals("WS1Port", ws1.getPortName());
		
		testUtil.setContents(wsCU, "@javax.jws.WebService(portName=\"ChangedPortName\") public class WS1 {}");;
		JobUtils.waitForJobs();
		
		assertEquals("portName not synchronized", "ChangedPortName", ws1.getPortName());
	}
	
	public void test_changedWsdlLocationSynched() throws Exception
	{
		target.startSynchronizing();
		final ICompilationUnit wsCU = testPrj1.getJavaProject().findType(ws1.getImplementation()).getCompilationUnit();
		assertEquals(null, ws1.getWsdlLocation());
		
		testUtil.setContents(wsCU, "@javax.jws.WebService(wsdlLocation=\"C:/changed/wsdl/location\") public class WS1 {}");;
		JobUtils.waitForJobs();
		
		assertEquals("wsdlLocation not synchronized", "C:/changed/wsdl/location", ws1.getWsdlLocation());
	}	
	
	public void test_changedImplicitSeiSoapBinding() throws Exception
	{
		target.startSynchronizing();
		final ICompilationUnit wsCU = testPrj1.getJavaProject().findType(ws1.getImplementation()).getCompilationUnit();
		
		testUtil.setContents(wsCU, "@javax.jws.WebService() public class WS1 {}");
		JobUtils.waitForJobs();
		
		final IServiceEndpointInterface sei = ws1.getServiceEndpoint();
		assertEquals(SOAPBindingStyle.DOCUMENT, sei.getSoapBindingStyle());
		assertEquals(SOAPBindingUse.LITERAL, sei.getSoapBindingUse());
		assertEquals(SOAPBindingParameterStyle.WRAPPED, sei.getSoapBindingParameterStyle());

		testUtil.setContents(wsCU, "@javax.jws.soap.SOAPBinding(style=Style.RPC, use=Use.ENCODED, parameterStyle=ParameterStyle.BARE)\n" + 
				"@javax.jws.WebService() public class WS1 {}");
		JobUtils.waitForJobs();
		
		assertEquals(SOAPBindingStyle.RPC, sei.getSoapBindingStyle());
		assertEquals(SOAPBindingUse.ENCODED, sei.getSoapBindingUse());
		assertEquals(SOAPBindingParameterStyle.BARE, sei.getSoapBindingParameterStyle());	
	}
	
	public void test_ContructorIsNotIncludedInWebMethods() throws CoreException
	{
		target.startSynchronizing();
		final ICompilationUnit wsCU = testPrj1.getJavaProject().findType(ws1.getImplementation()).getCompilationUnit();
		
		testUtil.setContents(wsCU, "@javax.jws.WebService()public class WS1{public WS1(){};public WS1(String s){}public void myMethod(){}}");
		JobUtils.waitForJobs();
		
		final IServiceEndpointInterface sei = ws1.getServiceEndpoint();
		final EList<IWebMethod> methods = sei.getWebMethods();
		assertEquals("One method expected in the SEI", 1, methods.size());
		assertEquals("Unpexpected method name in SEI", "myMethod", methods.iterator().next().getName());
	}
}
