/*******************************************************************************
 * 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;

import java.io.IOException;
import java.util.List;

import junit.framework.TestCase;

import org.eclipse.core.resources.ResourcesPlugin;
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.jdt.core.JavaModelException;
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.api.IWsDomLoadListener;
import org.eclipse.jst.ws.jaxws.dom.runtime.persistence.IProjectSelector;
import org.eclipse.jst.ws.jaxws.dom.runtime.persistence.JaxWsWorkspaceResource;
import org.eclipse.jst.ws.jaxws.testutils.project.TestProject;
/**
 * This test might be executed in non-clean workspace. Thus it should try to ignore any existing projects and work with the test proejcts it creates.
 * @author Hristo Sabev
 *
 */
public class JaxWsWorkspaceResourceTests extends TestCase
{
	private TestProject testProject;
	private IPackageFragment pf;
	private IJavaModel javaModel;
	
	@Override
	public void setUp() throws Exception {
		super.setUp();
		testProject = new TestProject();
		testProject.createSourceFolder("src");
		pf = testProject.createPackage("com.sap.test.smoke");
		javaModel = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
	}
	
	/**
	 * Verifies that a simple project with one web service class and one sei can be parsed
	 *
	 */
	public void test_Smoke_OneWsAndOneSei() throws JavaModelException, IOException
	{
		testProject.createType(pf, "Sei1.java", "@javax.jws.WebService public interface Sei1 {}");
		testProject.createType(pf, "WebService1.java", "@javax.jws.WebService(endpointInterface=\"com.sap.test.smoke.Sei1\") public class WebService1{}");
		final JaxWsWorkspaceResource target = createJaxWsWorkspaceResource(testProject);
		target.load(null);
		
		//find the test project and work only with it. ignore any other projects in the workspace
		final List<IWebServiceProject> projects = target.getDOM().getWebServiceProjects();
		IWebServiceProject testWsProject = null;
		for (IWebServiceProject aProject : projects)
		{
			if (aProject.getName().equals(testProject.getJavaProject().getElementName()))
			{
				testWsProject = aProject;
				break;
			}
		}
		if (testWsProject == null)
		{
			fail("WebServiceProject wit name " + testProject.getJavaProject().getElementName() + "is not found in the model");
		}
		
		final List<IServiceEndpointInterface> seis = testWsProject.getServiceEndpointInterfaces();
		assertTrue("More than 1 sei found in the model, while only one test sei was used", seis.size() == 1);
		assertEquals("The sei in the model is with different name", "Sei1", seis.get(0).getName());
		assertEquals("The sei in the model is with different implementation", "com.sap.test.smoke.Sei1", seis.get(0).getImplementation());
		final List<IWebService> webServices = testWsProject.getWebServices();
		assertTrue("More than 1 web service found in the model, while only one test web service was used", webServices.size() == 1);
		assertEquals("The web service in the model is with different name", "WebService1Service", webServices.get(0).getName());
		assertEquals("The web service in the model is with different implementation", "com.sap.test.smoke.WebService1", webServices.get(0).getImplementation());
		assertSame("The service endpoint found in the model is not the same instance as the sei of the web service", webServices.get(0).getServiceEndpoint(), seis.get(0));
	}
	
	public void test_DomLoadedForNoProcessedProjects() throws IOException
	{
		final JaxWsWorkspaceResource target = new JaxWsWorkspaceResource(javaModel) 
		{

			@Override
			public IProjectSelector[] getProjectSelectors()
			{
				return new IProjectSelector[] { new IProjectSelector() 
				{

					public boolean approve(IJavaProject prj)
					{
						return false;
					}
				}};
			}
			
		};
		target.load(null);
		assertNotNull(target.getDOM());
		assertEquals(0, target.getDOM().getWebServiceProjects().size());
	}
	
	private JaxWsWorkspaceResource createJaxWsWorkspaceResource(final TestProject testProject)
	{
		return new JaxWsWorkspaceResource(javaModel) 
		{
			@Override
			public IProjectSelector[] getProjectSelectors() 
			{
				return new IProjectSelector[] {new IProjectSelector()
				{
					public boolean approve(IJavaProject prj) {
						return prj.getElementName().equals(testProject.getJavaProject().getElementName());
					}
				}};
			}
		};
	}
	
	protected class LoadListener implements IWsDomLoadListener
	{
		boolean startCalled;
		boolean finishedCalled;
		
		public void finished() {
			finishedCalled = true;
		}

		public void started() {
			startCalled = true;
		}
	}
	
}
