blob: 5cfda8a09f738a028433b054f142c8abf4ffb577 [file] [log] [blame]
/***********************************************************************
* Copyright (c) 2008 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.jee.model.ejb.tests;
import java.util.HashMap;
import java.util.Map;
import junit.framework.TestSuite;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
import org.eclipse.jst.j2ee.ejb.internal.operations.AddSessionBeanOperation;
import org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties;
import org.eclipse.jst.j2ee.ejb.internal.operations.NewSessionBeanClassDataModelProvider;
import org.eclipse.jst.j2ee.ejb.internal.operations.StateType;
import org.eclipse.jst.j2ee.ejb.project.operations.IEjbFacetInstallDataModelProperties;
import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.EjbClientJarCreationDataModelProvider;
import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.IEjbClientJarCreationDataModelProperties;
import org.eclipse.jst.j2ee.model.IModelProvider;
import org.eclipse.jst.j2ee.model.ModelProviderManager;
import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetInstallDataModelProperties;
import org.eclipse.jst.javaee.ejb.EJBJar;
import org.eclipse.jst.jee.model.internal.Ejb3ModelProvider;
import org.eclipse.jst.jee.model.tests.AbstractAnnotationModelTest;
import org.eclipse.jst.jee.model.tests.AbstractTest;
import org.eclipse.jst.jee.model.tests.SynchronousModelChangedListener;
import org.eclipse.jst.jee.model.tests.TestUtils;
import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
import org.eclipse.wst.common.project.facet.core.IFacetedProject;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
/**
* @author Kiril Mitov k.mitov@sap.com
*
*/
public class EJB3MergedModelProviderTest extends AbstractAnnotationModelTest {
private static final String EJB_PROJECT_NAME = EJB3MergedModelProviderTest.class.getSimpleName();
private static final String EAR_PROJECT_NAME = EJB_PROJECT_NAME + "ear";
private static final String CLIENT_NAME = EJB_PROJECT_NAME + "Client";
public static TestSuite suite() throws Exception {
TestSuite suite = new TestSuite(EJB3MergedModelProviderTest.class);
setUpProject();
return suite;
}
// @BeforeClass
public static void setUpProject() throws Exception {
ProjectUtil.createEARProject(EAR_PROJECT_NAME);
IProject project = ProjectUtil.createEJBProject(EJB_PROJECT_NAME, EAR_PROJECT_NAME, CLIENT_NAME,
J2EEVersionConstants.EJB_3_0_ID, true);
IFacetedProject facetedProject = ProjectFacetsManager.create(project);
IProject clientProject = ResourcesPlugin.getWorkspace().getRoot().getProject(CLIENT_NAME);
createProjectContent(facetedProject.getProject());
createClientProjectContent(clientProject);
}
private static void createClientProjectContent(IProject clientProject) throws Exception {
IJavaProject javaProject = JavaCore.create(clientProject);
IFolder comFolder = javaProject.getProject().getFolder("ejbModule/com");
comFolder.create(true, true, new NullProgressMonitor());
comFolder.getFolder("sap").create(true, true, null);
IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(comFolder);
IPackageFragment fragment = root.createPackageFragment("sap", true, new NullProgressMonitor());
createSessionBeanLocal(fragment);
}
// @AfterClass
public static void tearDownAfterClass() throws InterruptedException {
AbstractTest.deleteProject(EJB3MergedModelProviderTest.class.getSimpleName());
}
private static void createProjectContent(IProject project) throws Exception {
IJavaProject javaProject = JavaCore.create(project);
IFolder comFolder = javaProject.getProject().getFolder("ejbModule/com");
comFolder.create(true, true, new NullProgressMonitor());
comFolder.getFolder("sap").create(true, true, null);
IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(comFolder);
IPackageFragment fragment = root.createPackageFragment("sap", true, new NullProgressMonitor());
createSessionBean(fragment);
}
// @Before
public void setUp() throws Exception {
super.setUp();
if (facetedProject == null)
return;
fixture = ModelProviderManager.getModelProvider(facetedProject.getProject());
clientProject = ResourcesPlugin.getWorkspace().getRoot().getProject(CLIENT_NAME);
}
// @After
public void tearDown() throws Exception {
}
// @Test
public void testAddBeanWithOperation() throws Exception {
final String ejbProjectName = this.getClass().getSimpleName() + this.getName();
final String clientName = ejbProjectName + "Client";
IProject project = ProjectUtil.createEJBProject(ejbProjectName, ejbProjectName + "ear", clientName,
J2EEVersionConstants.EJB_3_0_ID, true);
IDataModelOperation operation = createBeanOperation("testAddBeanWithOperation", "com.sap", project.getName());
IModelProvider provider = ModelProviderManager.getModelProvider(project);
EJBJar result = (EJBJar) provider.getModelObject();
assertEquals(new Integer(0), new Integer(result.getEnterpriseBeans().getSessionBeans().size()));
executeAndWait(operation, provider);
result = (EJBJar) provider.getModelObject();
assertEquals(new Integer(1), new Integer(result.getEnterpriseBeans().getSessionBeans().size()));
assertNotNull(TestUtils.getSessionBean(result, "testAddBeanWithOperation"));
}
// @Test
public void testAddBeanWithOperationPreserveListeners() throws Exception {
final String ejbProjectName = this.getClass().getSimpleName() + this.getName();
IProject project = ProjectUtil.createEJBProject(ejbProjectName, null, J2EEVersionConstants.EJB_3_0_ID, true);
IModelProvider provider = ModelProviderManager.getModelProvider(project);
IDataModelOperation operation = createBeanOperation("testAddBeanWithOperationPreserveListeners1", "com.sap",
project.getName());
SynchronousModelChangedListener preservedListener = new SynchronousModelChangedListener(2);
provider.addListener(preservedListener);
executeAndWait(operation, provider);
assertNotNull(TestUtils.getSessionBean((EJBJar) provider.getModelObject(),
"testAddBeanWithOperationPreserveListeners1"));
int oldReceivedEvents = preservedListener.getReceivedEvents().size();
operation = createBeanOperation("testAddBeanWithOperationPreserveListeners2", "com.sap", project.getName());
executeAndWait(operation, provider);
assertNotNull(TestUtils.getSessionBean((EJBJar) provider.getModelObject(),
"testAddBeanWithOperationPreserveListeners2"));
assertTrue(preservedListener.getReceivedEvents().size() > oldReceivedEvents);
}
// /**
// * Execute an operation on the model. Change the dd. The listeners should
// * not be removed. https://bugs.eclipse.org/bugs/show_bug.cgi?id=241496
// *
// * @throws Exception
// */
// public void testPreserveListenersChangeDD() throws Exception {
// final String ejbProjectName = this.getClass().getSimpleName() +
// this.getName();
// final IProject project = createEjbProjectWithoutClient(ejbProjectName,
// ejbProjectName + "ear");
// final IDataModel model = createModelEjbProjectWithClient(ejbProjectName);
// SynchronousModelChangedListener preserveListener = new
// SynchronousModelChangedListener(2);
//
// IModelProvider provider = ModelProviderManager.getModelProvider(project);
// provider.addListener(preserveListener);
// IFile ejbJarXml = project.getFile("ejbModule/META-INF/ejb-jar.xml");
// String content = TestUtils.getFileContent(ejbJarXml);
// executeAndWait(model.getDefaultOperation(), provider);
// assertNotNull(((EJBJar) provider.getModelObject()).getEjbClientJar());
//
// int oldEventsSize = preserveListener.getReceivedEvents().size();
// AbstractTest.saveFile(ejbJarXml, content);
// assertTrue(preserveListener.waitForEvents());
// assertTrue(preserveListener.getReceivedEvents().size() > oldEventsSize);
// assertNull(((EJBJar) provider.getModelObject()).getEjbClientJar());
// provider.removeListener(preserveListener);
// }
private IDataModel createModelEjbProjectWithClient(final String ejbProjectName) {
final IDataModel model = DataModelFactory.createDataModel(new EjbClientJarCreationDataModelProvider());
model.setProperty(IEjbClientJarCreationDataModelProperties.EJB_PROJECT_NAME, ejbProjectName);
model.setProperty(IEjbClientJarCreationDataModelProperties.PROJECT_NAME, CLIENT_NAME + "newName");
return model;
}
private IProject createEjbProjectWithoutClient(final String ejbProjectName, final String earProjectName)
throws Exception {
Map<String, Object> facetModelProperties = new HashMap<String, Object>();
facetModelProperties.put(IEjbFacetInstallDataModelProperties.CREATE_CLIENT, false);
facetModelProperties.put(IJ2EEFacetInstallDataModelProperties.GENERATE_DD, true);
final IProject project = ProjectUtil.createEJBProject(ejbProjectName, earProjectName, facetModelProperties,
J2EEVersionConstants.EJB_3_0_ID, true);
return project;
}
public void testCreateClientProjectWithOperation() throws Exception {
final String ejbProjectName = this.getClass().getSimpleName() + this.getName();
final IProject project = createEjbProjectWithoutClient(ejbProjectName, ejbProjectName + "ear");
final IModelProvider provider = new Ejb3ModelProvider(project);
provider.getModelObject();
final IDataModel model = createModelEjbProjectWithClient(ejbProjectName);
executeAndWait(model.getDefaultOperation(), provider);
EJBJar result = (EJBJar) provider.getModelObject();
assertEquals(CLIENT_NAME + "newNameClient" + ".jar", result.getEjbClientJar());
}
private void executeAndWait(IDataModelOperation operation, IModelProvider provider) throws InterruptedException,
ExecutionException {
SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
provider.addListener(listener);
operation.execute(null, null);
assertTrue(listener.waitForEvents());
provider.removeListener(listener);
}
// @Test
// public void testChangeClientProject() throws Exception {
// final String ejbProjectName = this.getClass().getSimpleName() +
// this.getName();
// final String clientName = ejbProjectName + "Client";
// IProject project = ProjectUtil.createEJBProject(ejbProjectName,
// ejbProjectName + "ear", clientName,
// J2EEVersionConstants.EJB_3_0_ID, true);
//
// IFile dd =
// facetedProject.getProject().getFile("ejbModule/META-INF/ejb-jar.xml");
// final String ddWithClient = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
// +
// "<ejb-jar xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://java.sun.com/xml/ns/javaee\" xmlns:ejb=\"http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd\" xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd\" version=\"3.0\">"
// + "<ejb-client-jar>" + clientName + ".jar</ejb-client-jar></ejb-jar>";
// final String ddNoClient = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
// +
// "<ejb-jar xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://java.sun.com/xml/ns/javaee\" xmlns:ejb=\"http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd\" xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd\" version=\"3.0\">"
// + "</ejb-jar>";
// // load the model
// IModelProvider provider = ModelProviderManager.getModelProvider(project);
//
// EJBJar result = (EJBJar) provider.getModelObject();
// /*
// * From now on the model provider should not listener for changes in
// * the client project since it is not described in the deployment
// * descriptor.
// */
// saveFileAndUpdate(dd, ddNoClient, provider);
//
// /*
// * Change the interface. The model should not be updated.
// */
// final String remoteInterface = "package com.sap;" +
// "import javax.ejb.Remote;"
// + "@Remote public interface SessionBeanLocal {}";
// IFile interfaceFile =
// clientProject.getFile("ejbModule/com/sap/SessionBeanLocal.java");
// SynchronousModelChangedListener listener = new
// SynchronousModelChangedListener(1);
// provider.addListener(listener);
// AbstractTest.saveFile(interfaceFile, remoteInterface);
// assertFalse(listener.waitForEvents());
// provider.removeListener(listener);
// result = (EJBJar) provider.getModelObject();
// SessionBean bean = TestUtils.getSessionBean(result, "SessionBean");
// assertEquals(new Integer(1), new
// Integer(bean.getBusinessLocals().size()));
// assertTrue(bean.getBusinessRemotes().isEmpty());
//
// /*
// * The deployment descriptor is changed. The bean should now contain the
// * interface in the remotes list
// */
// saveFileAndUpdate(dd, ddWithClient, provider);
// bean = TestUtils.getSessionBean(result, "SessionBean");
// assertEquals(new Integer(1), new
// Integer(bean.getBusinessRemotes().size()));
// assertTrue(bean.getBusinessLocals().isEmpty());
//
// // revet the changes
// saveFileAndUpdate(facetedProject.getProject().getFile("ejbModule/com/sap/SessionBean.java"),
// beanContent);
// saveFileAndUpdate(interfaceFile, localInterfaceContent);
// }
// /**
// * Create an ejb project with a client project. Add a session bean to the
// * project. After creating the ejb project a client project is created. The
// * modify method of the provider is called passing a runnable for setting
// * the ejbClient. This is the current implementation of how a client is
// * create.
// *
// * The test doing exactly this. Create an ear project. Create and ejb
// * project with a client project. Check that the model nows about the
// * ejbClient project. Then add a session bean to the ejb project. The
// * listener must be notified.
// *
// * @throws Exception
// */
// public void testAddSessionBean() throws Exception {
// final String ejbProjectName = this.getClass().getSimpleName() + this.getName();
//
// // create the project
// ProjectUtil.createEARProject(ejbProjectName + "ear", true);
// IProject project = ProjectUtil.createEJBProject(ejbProjectName, ejbProjectName + "ear", ejbProjectName
// + "client", J2EEVersionConstants.EJB_3_0_ID, true);
// IFolder comFolder = project.getFolder("ejbModule/com");
// comFolder.create(true, true, null);
// comFolder.getFolder("sap").create(true, true, null);
//
// // get the model provider
// IModelProvider provider = ModelProviderManager.getModelProvider(project);
// EJBJar result = (EJBJar) provider.getModelObject();
// assertEquals(ejbProjectName + "Client.jar", result.getEjbClientJar());
// IDataModelOperation operation = createBeanOperation("testAddSessionBeanClientExists", "com.sap", project
// .getName());
// executeAndWait(operation, provider);
//
// result = (EJBJar) provider.getModelObject();
// assertNotNull(TestUtils.getSessionBean(result, "testAddSessionBeanClientExists"));
// }
protected IDataModelOperation createBeanOperation(String className, String javaPackage, String projectName) {
NewSessionBeanClassDataModelProvider dataProvider = new NewSessionBeanClassDataModelProvider();
IDataModel dataModel = DataModelFactory.createDataModel(dataProvider);
dataModel.setStringProperty(INewSessionBeanClassDataModelProperties.CLASS_NAME, className);
dataModel.setStringProperty(INewSessionBeanClassDataModelProperties.STATE_TYPE, StateType.STATELESS.toString());
dataModel.setStringProperty(INewSessionBeanClassDataModelProperties.EJB_NAME, className);
dataModel.setStringProperty(INewSessionBeanClassDataModelProperties.JAVA_PACKAGE, javaPackage);
dataModel.setStringProperty(INewSessionBeanClassDataModelProperties.PROJECT_NAME, projectName);
AddSessionBeanOperation operation = new AddSessionBeanOperation(dataModel);
return operation;
}
}