blob: d96e96a1d541b777605de64dd06e8e5610adee51 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2004 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
/*
* Created on Jan 27, 2004
*
* To change the template for this generated file go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/
package org.eclipse.jst.j2ee.internal.reference;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jst.j2ee.application.operations.AddUtilityProjectToEARDataModel;
import org.eclipse.jst.j2ee.common.CommonFactory;
import org.eclipse.jst.j2ee.common.CommonPackage;
import org.eclipse.jst.j2ee.common.Description;
import org.eclipse.jst.j2ee.common.EJBLocalRef;
import org.eclipse.jst.j2ee.common.EjbRef;
import org.eclipse.jst.j2ee.common.EjbRefType;
import org.eclipse.jst.j2ee.common.XMLResource;
import org.eclipse.jst.j2ee.ejb.EJBJar;
import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
import org.eclipse.jst.j2ee.internal.client.impl.ClientFactoryImpl;
import org.eclipse.jst.j2ee.internal.common.operations.JARDependencyDataModel;
import org.eclipse.jst.j2ee.internal.common.operations.JARDependencyOperation;
import org.eclipse.jst.j2ee.internal.earcreation.AddUtilityJARMapCommand;
import org.eclipse.jst.j2ee.internal.earcreation.EARNatureRuntime;
import org.eclipse.jst.j2ee.internal.project.J2EEModuleNature;
import org.eclipse.jst.j2ee.internal.project.J2EENature;
import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
import org.eclipse.jst.j2ee.moduleextension.EarModuleManager;
import org.eclipse.jst.j2ee.moduleextension.EjbModuleExtension;
import org.eclipse.wst.common.frameworks.operations.WTPOperation;
import org.eclipse.wst.common.internal.emfworkbench.integration.ModifierHelper;
import org.eclipse.wst.common.internal.emfworkbench.operation.ModelModifierOperation;
import com.ibm.wtp.common.logger.proxy.Logger;
import com.ibm.wtp.emf.workbench.ProjectUtilities;
/**
* @author dfholttp
*
* To change the template for this generated type comment go to Window - Preferences - Java - Code
* Generation - Code and Comments
*/
public class EJBReferenceCreationOperation extends ModelModifierOperation {
protected IProject ownerProject;
protected IProject targetProject; //referencing project
protected AddUtilityJARMapCommand addUtilityJarMapCommand = null;
protected JARDependencyOperation jarDependencyOperation = null;
protected String refName = null;
protected String refType = null;
protected String refHome = null;
protected String refRemote = null;
protected String des = null;
protected String refLink = null;
protected IProject newClientProject;
/**
* @param dataModel
*/
public EJBReferenceCreationOperation(EJBReferenceDataModel dataModel) {
super(dataModel);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.wst.common.internal.emfworkbench.operation.ModelModifierOperation#doInitialize(org.eclipse.core.runtime.IProgressMonitor)
*/
protected void doInitialize(IProgressMonitor monitor) {
super.doInitialize(monitor);
setUpDataForCommand();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.wst.common.internal.emfworkbench.operation.ModelModifierOperation#postExecuteCommands()
*/
protected void postExecuteCommands(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
super.postExecuteCommands(monitor);
if (jarDependencyOperation != null)
jarDependencyOperation.run(monitor);
}
protected void addHelpers() throws CoreException {
ModifierHelper baseHelper = null;
if (!operationDataModel.getBooleanProperty(EJBReferenceDataModel.IS_LOCAL))
baseHelper = createEjbRefHelper();
else
baseHelper = createEJBLocalRefHelper();
modifier.addHelper(baseHelper);
if (((EJBReferenceDataModel) operationDataModel).shouldCreateClientJar())
copyClientJarToEAR(ownerProject);
updateJARDependencyIfNecessary();
}
protected ModifierHelper createEJBLocalRefHelper() {
ModifierHelper helper = new ModifierHelper();
EJBLocalRef ref = CommonPackage.eINSTANCE.getCommonFactory().createEJBLocalRef();
ref.setName(refName);
ref.setType(EjbRefType.get(refType));
ref.setLocal(refRemote);
ref.setLocalHome(refHome);
ref.setLink(refLink);
Integer version = (Integer) operationDataModel.getProperty(EJBReferenceDataModel.J2EE_VERSION);
if (version != null && version.intValue() <= J2EEVersionConstants.J2EE_1_3_ID) {
ref.setDescription(des);
} else {
Description descriptionObj = CommonFactory.eINSTANCE.createDescription();
descriptionObj.setValue(des);
ref.getDescriptions().add(descriptionObj);
}
helper.setOwner((EObject) operationDataModel.getProperty(EJBReferenceDataModel.OWNER));
helper.setFeature(CommonPackage.eINSTANCE.getJNDIEnvRefsGroup_EjbLocalRefs());
//TODO:implement in was ext
//modifier.addHelper(createEJBRefBindingHelper(ref, owner,
// getEJBModel().getSelectedEnterpriseBean()));
helper.setValue(ref);
return helper;
}
protected ModifierHelper createEjbRefHelper() {
ModifierHelper helper = new ModifierHelper();
EjbRef ref = CommonPackage.eINSTANCE.getCommonFactory().createEjbRef();
ref.setName(refName);
ref.setType(EjbRefType.get(refType));
ref.setHome(refHome);
ref.setRemote(refRemote);
ref.setLink(refLink);
helper.setOwner((EObject) operationDataModel.getProperty(EJBReferenceDataModel.OWNER));
Integer version = (Integer) operationDataModel.getProperty(EJBReferenceDataModel.J2EE_VERSION);
if (version != null && version.intValue() <= J2EEVersionConstants.J2EE_1_3_ID) {
ref.setDescription(des);
} else {
Description descriptionObj = CommonFactory.eINSTANCE.createDescription();
descriptionObj.setValue(des);
ref.getDescriptions().add(descriptionObj);
}
switch (((EJBReferenceDataModel) operationDataModel).getDeploymentDescriptorType()) {
case XMLResource.APP_CLIENT_TYPE :
helper.setFeature(ClientFactoryImpl.getPackage().getApplicationClient_EjbReferences());
break;
case XMLResource.EJB_TYPE :
helper.setFeature(CommonPackage.eINSTANCE.getJNDIEnvRefsGroup_EjbRefs());
break;
case XMLResource.WEB_APP_TYPE :
helper.setFeature(CommonPackage.eINSTANCE.getJNDIEnvRefsGroup_EjbRefs());
break;
}
helper.setValue(ref);
return helper;
}
private void copyClientJarToEAR(IProject ownerProj) throws CoreException {
IProject clientProj = newClientProject;
if (clientProj == null) {
EjbModuleExtension ejbExt = EarModuleManager.getEJBModuleExtension();
if (ejbExt == null)
return;
clientProj = ejbExt.getDefinedEJBClientJARProject(targetProject);
if (clientProj == null) {
WTPOperation clientOp = ejbExt.createEJBClientJARProject(targetProject);
try {
clientOp.run(null);
} catch (InvocationTargetException e) {
//TODO: do something w/ log
e.printStackTrace();
} catch (InterruptedException e) {
//TODO: do something w/ log
e.printStackTrace();
}
clientProj = ejbExt.getDefinedEJBClientJARProject(targetProject);
}
setNewClientProject(clientProj);
}
if (clientProj != null) {
J2EENature ownerNature = J2EENature.getRegisteredRuntime(ownerProj);
if (ownerNature != null && ownerNature instanceof J2EEModuleNature) {
EARNatureRuntime[] natures = ((J2EEModuleNature) ownerNature).getReferencingEARProjects();
for (int i = 0; i < natures.length; i++) {
addUtilityJarIfNecessary(clientProj, natures[i]);
}
}
}
}
private void addUtilityJarIfNecessary(IProject clientProj, EARNatureRuntime nature) {
if (!J2EEProjectUtilities.hasProjectMapping(nature, clientProj)) {
IProject earProject = nature.getProject();
String clientUri = J2EEProjectUtilities.getUtilityJARUriInFirstEAR(clientProj);
AddUtilityProjectToEARDataModel uDataModel = AddUtilityProjectToEARDataModel.createAddToEARDataModel(earProject.getName(), clientProj);
uDataModel.setProperty(AddUtilityProjectToEARDataModel.ARCHIVE_URI, clientUri);
try {
runNestedDefaultOperation(uDataModel, new NullProgressMonitor());
// addUtilityJarMapCommand = new AddUtilityJARMapCommand(earProject, clientUri,
// clientProj);
// modifier.addAdditionalCommand(addUtilityJarMapCommand);
} catch (InvocationTargetException e) {
Logger.getLogger().logError(e);
} catch (InterruptedException e) {
Logger.getLogger().logError(e);
}
}
}
public void updateJARDependencyIfNecessary() {
if (ownerProject != null && J2EEProjectUtilities.getReferencingEARProjects(ownerProject) != null) {
//TODO: handle multiple ears
EARNatureRuntime earNature = J2EEProjectUtilities.getFirstReferencingEARProject(ownerProject);
if (earNature == null)
return;
IProject earProject = earNature.getProject();
JARDependencyDataModel dataModel = new JARDependencyDataModel();
dataModel.setProperty(JARDependencyDataModel.PROJECT_NAME, ownerProject.getName());
dataModel.setIntProperty(JARDependencyDataModel.JAR_MANIPULATION_TYPE, JARDependencyDataModel.JAR_MANIPULATION_ADD);
dataModel.setProperty(JARDependencyDataModel.EAR_PROJECT_NAME, earProject.getName());
EjbModuleExtension ejbExt = EarModuleManager.getEJBModuleExtension();
String clientProjectName = null;
if (ejbExt != null) {
EJBJar ejbJar = ejbExt.getEJBJar(targetProject);
if (ejbJar != null) {
IProject referencedProject = J2EEProjectUtilities.getProject(ejbJar);
clientProjectName = ejbJar.getEjbClientJar();
if (clientProjectName != null && !clientProjectName.equals("")) { //$NON-NLS-1$
if (newClientProject != null) {
referencedProject = newClientProject;
clientProjectName = referencedProject.getName();
} else {
clientProjectName = referencedProject.getName();
}
} else {
clientProjectName = referencedProject.getName();
}
}
dataModel.setProperty(JARDependencyDataModel.REFERENCED_PROJECT_NAME, clientProjectName);
} else {
dataModel.setProperty(JARDependencyDataModel.REFERENCED_PROJECT_NAME, targetProject.getName());
}
jarDependencyOperation = new JARDependencyOperation(dataModel);
}
}
private void setUpDataForCommand() {
ownerProject = ProjectUtilities.getProject((EObject) operationDataModel.getProperty(EJBReferenceDataModel.OWNER));
targetProject = ProjectUtilities.getProject((EObject) operationDataModel.getProperty(EJBReferenceDataModel.TARGET));
refName = operationDataModel.getStringProperty(EJBReferenceDataModel.REF_NAME);
refType = operationDataModel.getStringProperty(EJBReferenceDataModel.REF_TYPE);
if (!operationDataModel.getBooleanProperty(EJBReferenceDataModel.TARGET_IN_DIFFERENT_EAR))
refLink = operationDataModel.getStringProperty(EJBReferenceDataModel.LINK);
refHome = operationDataModel.getStringProperty(EJBReferenceDataModel.HOME_INTERFACE);
refRemote = operationDataModel.getStringProperty(EJBReferenceDataModel.REMOTE_INTERACE);
des = operationDataModel.getStringProperty(EJBReferenceDataModel.DESCRIPTION);
}
/**
* @param project
*/
public void setNewClientProject(IProject project) {
newClientProject = project;
}
//TODO: reimplement in was.ext
// protected ModifierHelper createEJBRefBindingHelper(EjbRef aRef, EObject owner, EnterpriseBean
// linkedEjb) {
// boolean isEJBOwner = owner instanceof EnterpriseBean;
// boolean isWebOwner = owner instanceof WebApp;
// IProject linkedProject;
// boolean hasEJBClientJar, isInDiffEar;
// if (isEJBOwner || isWebOwner) {
// linkedProject = ProjectUtilities.getProject(linkedEjb);
// hasEJBClientJar = EJBNatureRuntime.getRuntime(linkedProject).hasEJBClientJARProject();
// isInDiffEar = getEJBModel().isInDifferentEAR();
// }
//
// if (aRef == null || owner == null || linkedEjb == null)
// return null;
// String jndiName = getJndiName(linkedEjb);
// if (jndiName == null) {
// return null;
// }
//
// ModifierHelper modifier = new ModifierHelper();
// if (isEJBOwner)
// modifier.setFeature(EjbbndFactoryImpl.getPackage().getEnterpriseBeanBinding_EjbRefBindings());
// else if (isWebOwner)
// modifier.setFeature(WebappbndPackage.eINSTANCE.getWebAppBinding_EjbRefBindings());
// else
// modifier.setFeature(ClientbndFactoryImpl.getPackage().getApplicationClientBinding_EjbRefs());
// CommonbndPackage pack = CommonbndFactoryImpl.getPackage();
// modifier.addAttribute(pack.getEjbRefBinding_BindingEjbRef(), aRef);
// modifier.addAttribute(pack.getEjbRefBinding_JndiName(), jndiName);
// if (isEJBOwner) {
// EnterpriseBeanBinding ejbBinding = EJBBindingsHelper.getEjbBinding((EnterpriseBean) owner);
// modifier.setOwner(ejbBinding);
// new JNDINameValueHolder(aRef, jndiName, ejbBinding);
// } else if (isWebOwner) {
// WebAppBinding webBinding = WebAppBindingsHelper.getWebAppBinding((WebApp) owner);
// modifier.setOwner(webBinding);
// } else
// modifier.setOwner(ApplicationClientBindingsHelper.getApplicationClientBinding((ApplicationClient)
// owner));
// return modifier;
// }
}