blob: 6971ccb3790ca49a9f4c3d1f255d99d97bbf28d6 [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.archive.operations;
import java.io.FileNotFoundException;
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.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jem.util.logger.proxy.Logger;
import org.eclipse.jst.j2ee.application.internal.operations.AddArchiveToEARDataModel;
import org.eclipse.jst.j2ee.application.internal.operations.AddModuleToEARDataModel;
import org.eclipse.jst.j2ee.application.internal.operations.AddUtilityProjectToEARDataModel;
import org.eclipse.jst.j2ee.application.internal.operations.AddWebModuleToEARDataModel;
import org.eclipse.jst.j2ee.application.internal.operations.EARComponentCreationOperation;
import org.eclipse.jst.j2ee.application.internal.operations.EnterpriseApplicationImportDataModel;
import org.eclipse.jst.j2ee.application.internal.operations.J2EEArtifactImportDataModel;
import org.eclipse.jst.j2ee.application.internal.operations.J2EEComponentCreationDataModel;
import org.eclipse.jst.j2ee.application.internal.operations.J2EEModuleImportDataModel;
import org.eclipse.jst.j2ee.application.internal.operations.J2EEUtilityJarImportDataModel;
import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.SaveStrategy;
import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
import org.eclipse.jst.j2ee.internal.common.XMLResource;
import org.eclipse.jst.j2ee.internal.earcreation.EARComponentCreationDataModel;
import org.eclipse.jst.j2ee.internal.earcreation.EAREditModel;
import org.eclipse.jst.j2ee.internal.earcreation.EARNatureRuntime;
import org.eclipse.jst.j2ee.internal.earcreation.modulemap.UtilityJARMapping;
import org.eclipse.jst.j2ee.internal.servertarget.ServerTargetDataModel;
import org.eclipse.wst.common.frameworks.internal.enablement.nonui.WFTWrappedException;
import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
public class EnterpriseApplicationImportOperation extends J2EEArtifactImportOperation {
public EnterpriseApplicationImportOperation(EnterpriseApplicationImportDataModel dataModel) {
super(dataModel);
}
private EnterpriseApplicationImportDataModel getEARImportDataModel() {
return (EnterpriseApplicationImportDataModel) operationDataModel;
}
/**
* Subclasses must override to performs the workbench modification steps that are to be
* contained within a single logical workbench change.
*
* @param monitor
* the progress monitor to use to display progress
*/
protected void doExecute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
//FileSet.printState();
EnterpriseApplicationImportDataModel model = getEARImportDataModel();
monitor.beginTask(null, model.getModuleFile().getFiles().size());
boolean earImported = model.getBooleanProperty(EnterpriseApplicationImportDataModel.IMPORT_EAR_PROJECT);
if (earImported) {
IProject project = model.getProject();
if (model.getBooleanProperty(J2EEArtifactImportDataModel.OVERWRITE_PROJECT) && model.getBooleanProperty(J2EEArtifactImportDataModel.DELETE_BEFORE_OVERWRITE_PROJECT)) {
if (project.exists()) {
project.delete(true, true, new NullProgressMonitor());
}
}
if (!project.exists()) {
createModuleProject(model.getJ2eeArtifactCreationDataModel(), monitor);
}
try {
monitor.beginTask(EARArchiveOpsResourceHandler.getString("IMPORTING_EAR_FILE_UI_"), model.getEARFile().getFiles().size()); //$NON-NLS-1$
importEARProject(monitor);
} finally {
releaseDeploymentDescriptor();
}
}
List modelsNotToAddToEAR = model.getUnhandledProjectModels();
List modelsToImport = model.getHandledSelectedModels();
try {
J2EEArtifactImportDataModel importModel = null;
WTPOperation importOp = null;
List allModels = model.getProjectModels();
IProject earProject = model.getProject();
IProject archiveProject = null;
AddArchiveToEARDataModel addArchiveProjectToEARDataModel = null;
boolean synchServerTarget = model.getBooleanProperty(EnterpriseApplicationImportDataModel.SYNC_SERVER_TARGETS_WITH_EAR);
boolean moduleImported = false;
for (int i = 0; i < allModels.size(); i++) {
moduleImported = false;
importModel = (J2EEArtifactImportDataModel) allModels.get(i);
if (modelsToImport.contains(importModel)) {
moduleImported = true;
importOp = importModel.getDefaultOperation();
importModel.setProperty(J2EEArtifactImportDataModel.CLOSE_ARCHIVE_ON_DISPOSE, Boolean.FALSE);
importOp.run(monitor);
}
if (earProject.exists() && (earImported || moduleImported) && !modelsNotToAddToEAR.contains(importModel)) {
archiveProject = importModel.getProject();
if (archiveProject.exists()) {
if (importModel instanceof J2EEModuleImportDataModel) {
//TODO initialize data model
//addArchiveProjectToEARDataModel = AddModuleToEARDataModel.createAddToEARDataModel(earProject.getName(), archiveProject).getAppropriateDataModel();
addArchiveProjectToEARDataModel.setProperty(AddModuleToEARDataModel.ARCHIVE_URI, importModel.getStringProperty(J2EEArtifactImportDataModel.URI_FOR_MODULE_MAPPING));
addArchiveProjectToEARDataModel.setBooleanProperty(AddArchiveToEARDataModel.SYNC_TARGET_RUNTIME, synchServerTarget);
if (addArchiveProjectToEARDataModel.isProperty(AddWebModuleToEARDataModel.CONTEXT_ROOT) && importModel.isProperty(AddWebModuleToEARDataModel.CONTEXT_ROOT)) {
addArchiveProjectToEARDataModel.setProperty(AddWebModuleToEARDataModel.CONTEXT_ROOT, importModel.getProperty(AddWebModuleToEARDataModel.CONTEXT_ROOT));
}
addArchiveProjectToEARDataModel.getDefaultOperation().run(monitor);
if (synchServerTarget && importModel.isProperty("WARImportDataModel.HANDLED_ARCHIVES")) { //$NON-NLS-1$
List weblibs = (List) importModel.getProperty("WARImportDataModel.HANDLED_ARCHIVES"); //$NON-NLS-1$
for (int j = 0; null != weblibs && j < weblibs.size(); j++) {
IProject webLibProject = ((J2EEUtilityJarImportDataModel) weblibs.get(j)).getProject();
ServerTargetDataModel sModel = new ServerTargetDataModel();
sModel.setProperty(ServerTargetDataModel.RUNTIME_TARGET_ID, model.getProperty(EnterpriseApplicationImportDataModel.SERVER_TARGET_ID));
sModel.setProperty(ServerTargetDataModel.PROJECT_NAME, webLibProject.getName());
sModel.getDefaultOperation().run(monitor);
}
}
} else if (importModel instanceof J2EEUtilityJarImportDataModel) {
addArchiveProjectToEARDataModel = AddUtilityProjectToEARDataModel.createAddToEARDataModel(earProject.getName(), archiveProject);
addArchiveProjectToEARDataModel.setProperty(AddModuleToEARDataModel.ARCHIVE_URI, importModel.getStringProperty(J2EEArtifactImportDataModel.URI_FOR_MODULE_MAPPING));
addArchiveProjectToEARDataModel.setBooleanProperty(AddArchiveToEARDataModel.SYNC_TARGET_RUNTIME, synchServerTarget);
addArchiveProjectToEARDataModel.getDefaultOperation().run(monitor);
}
}
}
}
if (!model.getBooleanProperty(EnterpriseApplicationImportDataModel.PRESERVE_PROJECT_METADATA) && earProject.exists()) {
modelsToImport.removeAll(modelsNotToAddToEAR);
fixupClasspaths(modelsToImport, earProject);
}
} finally {
resetDisposeImportModels();
//FileSet.printState();
}
}
/**
* @param modelsToImport
*/
private void resetDisposeImportModels() {
resetDisposeImportModels(getEARImportDataModel().getProjectModels());
}
private void resetDisposeImportModels(List models) {
J2EEArtifactImportDataModel model;
for (int i = 0; i < models.size(); i++) {
model = (J2EEArtifactImportDataModel) models.get(i);
model.setProperty(J2EEArtifactImportDataModel.CLOSE_ARCHIVE_ON_DISPOSE, Boolean.TRUE);
}
}
private void fixupClasspaths(List selectedModels, IProject earProject) throws JavaModelException {
J2EEArtifactImportDataModel importModel;
for (int i = 0; i < selectedModels.size(); i++) {
importModel = (J2EEArtifactImportDataModel) selectedModels.get(i);
Archive archive = importModel.getArchiveFile();
String[] manifestClasspath = archive.getManifest().getClassPathTokenized();
if (manifestClasspath.length > 0) {
List extraEntries = fixupClasspath(earProject, manifestClasspath, new ArrayList(), archive, importModel.getProject());
addToClasspath(importModel, extraEntries);
}
}
}
private List fixupClasspath(IProject earProject, String[] manifestClasspath, List computedFiles, Archive anArchive, IProject aProject) throws JavaModelException {
List extraEntries = new ArrayList();
for (int j = 0; j < manifestClasspath.length; j++) {
String manifestURI = ArchiveUtil.deriveEARRelativeURI(manifestClasspath[j], anArchive);
if (null == manifestURI) {
continue;
}
IFile file = earProject.getFile(manifestURI);
if (!computedFiles.contains(file)) {
computedFiles.add(file);
if (null != file && file.exists()) {
extraEntries.add(JavaCore.newLibraryEntry(file.getFullPath(), file.getFullPath(), null, true));
Archive archive = null;
try {
archive = (Archive) getEARImportDataModel().getEARFile().getFile(file.getProjectRelativePath().toString());
String[] nestedManifestClasspath = archive.getManifest().getClassPathTokenized();
extraEntries.addAll(fixupClasspath(earProject, nestedManifestClasspath, computedFiles, archive, aProject));
} catch (FileNotFoundException e) {
Logger.getLogger().logError(e);
} finally {
if (null != archive) {
archive.close();
}
}
} else {
Object key = new Object();
EAREditModel editModel = null;
try {
editModel = (EAREditModel) EARNatureRuntime.getEditModelForProject(earProject, key);
UtilityJARMapping mapping = editModel.getUtilityJARMapping(manifestURI);
if (null != mapping) {
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(mapping.getProjectName());
if (aProject != project) {
extraEntries.add(JavaCore.newProjectEntry(project.getFullPath(), true));
}
} else {
IProject project = editModel.getMappedProject(manifestURI);
if (null != project && project.exists() && aProject != project) {
extraEntries.add(JavaCore.newProjectEntry(project.getFullPath()));
}
}
} finally {
if (null != editModel) {
editModel.releaseAccess(key);
}
}
}
}
}
return extraEntries;
}
protected void importEARProject(IProgressMonitor monitor) throws InvocationTargetException {
EARFile earFile = getEARImportDataModel().getEARFile();
try {
EARProjectSaveStrategyImpl saveStrat = new EARProjectSaveStrategyImpl(getEARImportDataModel());
saveStrat.setMonitor(monitor);
earFile.save(saveStrat);
} catch (Exception ex) {
String errorString = EARArchiveOpsResourceHandler.getString("ERROR_IMPORTING_EAR_FILE"); //$NON-NLS-1$
throw new WFTWrappedException(ex, errorString);
}
}
private void releaseDeploymentDescriptor() {
EARFile earFile = getEARImportDataModel().getEARFile();
try {
if (earFile != null && earFile.isDeploymentDescriptorSet()) {
XMLResource res = (XMLResource) earFile.getDeploymentDescriptor().eResource();
if (res != null)
res.releaseFromRead();
}
} catch (Exception suppress) {
org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError(suppress);
}
}
protected void createModuleProject(J2EEComponentCreationDataModel model, IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
EARComponentCreationOperation earProjectOp = new EARComponentCreationOperation((EARComponentCreationDataModel) model);
earProjectOp.run(monitor);
}
protected SaveStrategy createSaveStrategy(IProject project) { //NOOP
return null;
}
}