blob: e2101b2405abfdbf5b8cab894436f252f577637d [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
**************************************************************************************************/
package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.util.URI;
import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
import org.eclipse.jem.util.logger.proxy.Logger;
import org.eclipse.jst.j2ee.application.internal.operations.AddComponentToEnterpriseApplicationDataModel;
import org.eclipse.jst.j2ee.application.internal.operations.AddComponentToEnterpriseApplicationOperation;
import org.eclipse.jst.j2ee.application.internal.operations.FlexibleJavaProjectCreationDataModel;
import org.eclipse.jst.j2ee.application.internal.operations.JavaUtilityComponentCreationOperation;
import org.eclipse.jst.j2ee.application.internal.operations.UpdateManifestDataModel;
import org.eclipse.jst.j2ee.application.internal.operations.UpdateManifestOperation;
import org.eclipse.jst.j2ee.ejb.internal.modulecore.util.EJBArtifactEdit;
import org.eclipse.jst.j2ee.internal.common.operations.JARDependencyDataModel;
import org.eclipse.jst.j2ee.internal.common.operations.JARDependencyOperation;
import org.eclipse.jst.j2ee.internal.ejb.impl.EJBJarImpl;
import org.eclipse.wst.common.modulecore.ModuleCore;
import org.eclipse.wst.common.modulecore.ModuleCoreFactory;
import org.eclipse.wst.common.modulecore.ReferencedComponent;
import org.eclipse.wst.common.modulecore.UnresolveableURIException;
import org.eclipse.wst.common.modulecore.WorkbenchComponent;
import org.eclipse.wst.common.modulecore.internal.util.IModuleConstants;
import org.eclipse.wst.common.modulecore.resources.IVirtualContainer;
import org.eclipse.wst.common.modulecore.resources.IVirtualFile;
public class EJBClientComponentCreationOperation extends JavaUtilityComponentCreationOperation {
public static final String metaInfFolderDeployPath = "/"; //$NON-NLS-1$
/**
* @param dataModel
*/
public EJBClientComponentCreationOperation(EJBClientComponentDataModel dataModel) {
super(dataModel);
}
protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
EJBClientComponentDataModel dm = (EJBClientComponentDataModel)getOperationDataModel();
//createProjectIfNecessary(dm.getComponentName());
createProjectIfNecessary(dm.getStringProperty(EJBClientComponentDataModel.PROJECT_NAME));
super.execute(IModuleConstants.JST_UTILITY_MODULE, monitor);
runAddToEAROperation(monitor);
runAddToEJBOperation(monitor);
modifyEJBModuleJarDependency(monitor);
updateEJBDD(monitor);
}
protected void runAddToEAROperation(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
EJBClientComponentDataModel dm = (EJBClientComponentDataModel)getOperationDataModel();
URI uri = dm.getEarComponentHandle();
IProject proj = null;
try {
proj = ModuleCore.getContainingProject(uri);
}
catch (UnresolveableURIException e) {
Logger.getLogger().log(e);
}
ModuleCore core = null;
try {
core = ModuleCore.getModuleCoreForRead(dm.getProject());
WorkbenchComponent wc = core.findWorkbenchModuleByDeployName(dm.getComponentDeployName());
AddComponentToEnterpriseApplicationDataModel addComponentToEARDataModel = new AddComponentToEnterpriseApplicationDataModel();;
addComponentToEARDataModel.setProperty(AddComponentToEnterpriseApplicationDataModel.EAR_PROJECT_NAME, proj.getName());
addComponentToEARDataModel.setProperty(AddComponentToEnterpriseApplicationDataModel.PROJECT_NAME, dm.getProject().getName());
addComponentToEARDataModel.setProperty(AddComponentToEnterpriseApplicationDataModel.MODULE_NAME, dm.getComponentDeployName());
addComponentToEARDataModel.setProperty(AddComponentToEnterpriseApplicationDataModel.EAR_MODULE_NAME, dm.getEARDeployName());
List modulesList = new ArrayList();
modulesList.add(wc);
addComponentToEARDataModel.setProperty(AddComponentToEnterpriseApplicationDataModel.MODULE_LIST,modulesList);
AddComponentToEnterpriseApplicationOperation addModuleOp = new AddComponentToEnterpriseApplicationOperation(addComponentToEARDataModel);
addModuleOp.doRun(monitor);
} finally {
if(core != null)
core.dispose();
}
}
protected void runAddToEJBOperation(IProgressMonitor monitor)throws CoreException, InvocationTargetException, InterruptedException{
EJBClientComponentDataModel dm = (EJBClientComponentDataModel)getOperationDataModel();
ModuleCore moduleCore = null;
List list = new ArrayList();
try{
moduleCore = ModuleCore.getModuleCoreForRead(dm.getProject());
WorkbenchComponent wc = moduleCore.findWorkbenchModuleByDeployName(dm.getComponentDeployName());
list.add(wc);
} finally {
if (null != moduleCore) {
moduleCore.dispose();
}
}
String ejbProjString = dm.getEJBProjectName();
IProject ejbProj = ProjectUtilities.getProject( ejbProjString );
ModuleCore ejbModuleCore = null;
WorkbenchComponent ejbComp = null;
try{
ejbModuleCore = ModuleCore.getModuleCoreForWrite(ejbProj);
ejbComp = ejbModuleCore.findWorkbenchModuleByDeployName(dm.getEJBDeployName());
URI runtimeURI = URI.createURI(metaInfFolderDeployPath);
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
ReferencedComponent rc = ModuleCoreFactory.eINSTANCE.createReferencedComponent();
WorkbenchComponent workbenchComp= (WorkbenchComponent)list.get(i);
rc.setHandle(workbenchComp.getHandle());
rc.setRuntimePath(runtimeURI);
ejbComp.getReferencedComponents().add(rc);
}
}
ejbModuleCore.saveIfNecessary(monitor);
} finally{
if (null != ejbModuleCore) {
ejbModuleCore.dispose();
}
}
}
private void modifyEJBModuleJarDependency(IProgressMonitor aMonitor) throws InvocationTargetException, InterruptedException {
EJBClientComponentDataModel dm = (EJBClientComponentDataModel)getOperationDataModel();
String ejbprojectName = dm.getEJBProjectName();
String ejbComponentName = dm.getEJBComponentName();
String ejbComponentDeployName = dm.getEJBDeployName();
String clientProjectName = dm.getProject().getName();
String clientDeployName = dm.getComponentDeployName();
IProject ejbProject = ProjectUtilities.getProject( ejbprojectName );
ModuleCore moduleCore = null;
IFile manifestmf = null;
try{
moduleCore = ModuleCore.getModuleCoreForRead(ejbProject);
WorkbenchComponent ejbwc = moduleCore.findWorkbenchModuleByDeployName(ejbComponentDeployName);
ejbwc = moduleCore.findWorkbenchModuleByDeployName(ejbComponentDeployName);
IVirtualContainer component = ModuleCore.createContainer( ejbProject, ejbwc.getName());
IVirtualFile vf = component.getFile( new Path("/META-INF/MANIFEST.MF"));
manifestmf = vf.getUnderlyingFile();
}finally {
if (null != moduleCore) {
moduleCore.dispose();
}
}
UpdateManifestDataModel updateManifestDataModel = new UpdateManifestDataModel();
updateManifestDataModel.setProperty(UpdateManifestDataModel.PROJECT_NAME, ejbprojectName);
updateManifestDataModel.setBooleanProperty(UpdateManifestDataModel.MERGE, false);
updateManifestDataModel.setProperty(UpdateManifestDataModel.MANIFEST_FILE, manifestmf);
updateManifestDataModel.setProperty(UpdateManifestDataModel.JAR_LIST, UpdateManifestDataModel.convertClasspathStringToList(clientDeployName) );
UpdateManifestOperation mop = new UpdateManifestOperation(updateManifestDataModel);
mop.run(aMonitor);
if( !clientProjectName.equals( ejbprojectName )){
JARDependencyDataModel dataModel = new JARDependencyDataModel();
dataModel.setProperty(JARDependencyDataModel.PROJECT_NAME, ejbprojectName);
dataModel.setProperty(JARDependencyDataModel.REFERENCED_PROJECT_NAME, clientProjectName);
dataModel.setIntProperty(JARDependencyDataModel.JAR_MANIPULATION_TYPE, JARDependencyDataModel.JAR_MANIPULATION_ADD);
JARDependencyOperation op = new JARDependencyOperation(dataModel);
op.run( aMonitor );
}
}
/**
* Update the deployment descriptor for the ejb project
*/
private void updateEJBDD(IProgressMonitor monitor) {
EJBClientComponentDataModel dm = (EJBClientComponentDataModel)getOperationDataModel();
String ejbprojectName = dm.getEJBProjectName();
IProject ejbProject = ProjectUtilities.getProject( ejbprojectName );
String ejbComponentDeployName = dm.getEJBDeployName();
String clientDeployName = dm.getComponentDeployName();
ModuleCore moduleCore = null;
try{
moduleCore = ModuleCore.getModuleCoreForRead(ejbProject);
WorkbenchComponent ejbwc = moduleCore.findWorkbenchModuleByDeployName(ejbComponentDeployName);
ejbwc = moduleCore.findWorkbenchModuleByDeployName(ejbComponentDeployName);
EJBArtifactEdit ejbEdit = null;
try{
ejbEdit = EJBArtifactEdit.getEJBArtifactEditForWrite(ejbwc);
if(ejbEdit != null) {
EJBJarImpl ejbres = (EJBJarImpl)ejbEdit.getDeploymentDescriptorRoot();
ejbres.setEjbClientJar(clientDeployName);
ejbEdit.saveIfNecessary(monitor);
}
}
catch(Exception e){
Logger.getLogger().logError(e);
} finally {
if(ejbEdit != null)
ejbEdit.dispose();
}
}finally {
if (null != moduleCore) {
moduleCore.dispose();
}
}
}
private void createProjectIfNecessary(String name) throws CoreException, InvocationTargetException, InterruptedException {
EJBClientComponentDataModel dm = (EJBClientComponentDataModel)getOperationDataModel();
if( dm.getBooleanProperty(EJBClientComponentDataModel.CREATE_PROJECT)){
//check if project exists
IProject proj = ProjectUtilities.getProject(name);
if( !proj.exists() ){
FlexibleJavaProjectCreationDataModel dataModel = new FlexibleJavaProjectCreationDataModel();
dataModel.setProperty(FlexibleJavaProjectCreationDataModel.PROJECT_NAME, name);
dataModel.getDefaultOperation().run(null);
}
}
}
}