blob: 40cd9a5460d3f0a6aa9c7e2fbc60f051c0bd5541 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2006 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.application.internal.operations;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.operations.AbstractOperation;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IPathVariableManager;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jdt.core.IAccessRule;
import org.eclipse.jdt.core.IClasspathAttribute;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jst.j2ee.internal.earcreation.EARCreationResourceHandler;
import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.datamodel.properties.ICreateReferenceComponentsDataModelProperties;
import org.eclipse.wst.common.componentcore.internal.operation.CreateReferenceComponentsDataModelProvider;
import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
public abstract class J2EEUtilityJarImportAssistantOperation extends AbstractOperation {
private File utilityJar;
private boolean overwriteIfNecessary = false;
private String associatedEARProjectName;
public J2EEUtilityJarImportAssistantOperation(String label, File utilityJar) {
super(label);
this.utilityJar = utilityJar;
}
public void setAssociatedEARProjectName(String associatedEARProjectName) {
this.associatedEARProjectName = associatedEARProjectName;
}
public void setOverwriteIfNecessary(boolean overwriteProject) {
this.overwriteIfNecessary = overwriteProject;
}
protected final void createLinkedPathVariable(String linkedPathVariable, File archiveFile) throws CoreException {
IPathVariableManager manager = ResourcesPlugin.getWorkspace().getPathVariableManager();
IPath linkedPath = new Path(archiveFile.getAbsolutePath());
manager.setValue(linkedPathVariable, linkedPath);
}
protected final String getUtilityJarProjectName(File utilityJar) {
String name = null;
if (utilityJar != null) {
int len = utilityJar.getName().lastIndexOf('.');
name = utilityJar.getName().substring(0, len);
}
return name;
}
protected final IStatus linkArchiveToEAR(IProject earProject, String uriMapping, IProject utilityProject, IProgressMonitor monitor) throws InvocationTargetException, InterruptedException, ExecutionException {
IDataModel addArchiveProjectToEARDataModel = DataModelFactory.createDataModel(new CreateReferenceComponentsDataModelProvider());
IVirtualComponent earcomponent = ComponentCore.createComponent(earProject);
IVirtualComponent utilcomponent = ComponentCore.createComponent(utilityProject);
addArchiveProjectToEARDataModel.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, earcomponent);
addArchiveProjectToEARDataModel.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, Collections.singletonList(utilcomponent));
Map uriMap = new HashMap();
uriMap.put(utilcomponent, uriMapping);
addArchiveProjectToEARDataModel.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_TO_URI_MAP, uriMap);
return addArchiveProjectToEARDataModel.getDefaultOperation().execute(monitor, null);
}
protected final IStatus createVirtualArchiveComponent(IProject targetProject, String uriMapping, IFile utilityJarIFile, IProgressMonitor monitor) throws InvocationTargetException, InterruptedException, ExecutionException {
IDataModel addArchiveProjectToEARDataModel = DataModelFactory.createDataModel(new CreateReferenceComponentsDataModelProvider());
IVirtualComponent earcomponent = ComponentCore.createComponent(targetProject);
IVirtualComponent utilcomponent = ComponentCore.createArchiveComponent(targetProject, VirtualArchiveComponent.LIBARCHIVETYPE + IPath.SEPARATOR + utilityJarIFile.getProjectRelativePath().toString());
IPath uriMappingPath = null;
String uri = uriMapping;
String deployPath = null;
if(uriMapping != null) {
uriMappingPath = new Path(uriMapping);
uri = uriMappingPath.lastSegment();
if(uriMappingPath.segmentCount() > 1)
deployPath = uriMappingPath.removeLastSegments(1).toString();
}
addArchiveProjectToEARDataModel.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, earcomponent);
addArchiveProjectToEARDataModel.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, Collections.singletonList(utilcomponent));
Map uriMap = new HashMap();
uriMap.put(utilcomponent, uri);
addArchiveProjectToEARDataModel.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_TO_URI_MAP, uriMap);
if(deployPath != null && deployPath.length() > 0) {
Map deployMap = new HashMap();
deployMap.put(utilcomponent, deployPath);
addArchiveProjectToEARDataModel.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_DEPLOY_PATH_MAP, deployMap);
}
return addArchiveProjectToEARDataModel.getDefaultOperation().execute(monitor, null);
}
protected final IStatus removeRootMapping(IVirtualComponent sourceComponent, String uriMapping, IProgressMonitor monitor) throws InvocationTargetException, InterruptedException, ExecutionException {
try {
sourceComponent.getRootFolder().removeLink(new Path(uriMapping), 0, monitor);
} catch (CoreException e) {
return J2EEPlugin.createErrorStatus(0, e.getMessage(), e);
}
return Status.OK_STATUS;
}
protected File getUtilityJar() {
return utilityJar;
}
protected final IWorkspaceRoot getWorkspaceRoot() {
return ResourcesPlugin.getWorkspace().getRoot();
}
protected final String getAssociatedEARProjectName() {
return associatedEARProjectName;
}
protected final boolean isOverwriteIfNecessary() {
return overwriteIfNecessary;
}
protected final void addLibraryToClasspath(IProject associatedEARProject, IFile copiedJarFile, IProgressMonitor monitor) throws CoreException, JavaModelException {
if (associatedEARProject.hasNature(JavaCore.NATURE_ID)) {
IClasspathEntry entry = JavaCore.newLibraryEntry(copiedJarFile.getFullPath().makeAbsolute(), null, // source
// attachment
null, // source attachment root
new IAccessRule[0], // accessRules
new IClasspathAttribute[0], // extraAttributes
false); // isExported
IJavaProject earJavaProject = JavaCore.create(associatedEARProject);
IClasspathEntry[] rawClasspath = earJavaProject.getRawClasspath();
IClasspathEntry[] newClasspath = new IClasspathEntry[rawClasspath.length + 1];
System.arraycopy(rawClasspath, 0, newClasspath, 0, rawClasspath.length);
newClasspath[rawClasspath.length] = entry;
earJavaProject.setRawClasspath(newClasspath, monitor);
}
}
protected final IStatus createLinkedArchive(IProject project, String linkedFileName, File archiveFile, String linkedPathVariable, IProgressMonitor monitor) throws CoreException {
IFile linkedJarFile = null;
IPath pathToArchive = getLinkedPath(archiveFile, linkedPathVariable);
linkedJarFile = project.getFile(linkedFileName);
if (linkedJarFile.exists()) {
if (isOverwriteIfNecessary())
linkedJarFile.delete(true, true, new SubProgressMonitor(monitor, 1));
else
return J2EEPlugin.createErrorStatus(0, NLS.bind(EARCreationResourceHandler.CreateProjectWithLinkedJarOperation_File_already_exists_0_, linkedJarFile.getFullPath()), null);
}
linkedJarFile.createLink(pathToArchive, IResource.ALLOW_MISSING_LOCAL, new SubProgressMonitor(monitor, 1));
addLibraryToClasspath(project, linkedJarFile, monitor);
return Status.OK_STATUS;
}
protected final IPath getLinkedPath(File archiveFile, String linkedPathVariable) throws CoreException {
if (linkedPathVariable == null || linkedPathVariable.length() == 0)
return new Path(archiveFile.getAbsolutePath());
createLinkedPathVariable(linkedPathVariable, archiveFile.getParentFile());
return new Path(linkedPathVariable).append(archiveFile.getName());
}
protected final String findUniqueLocation(String baseLocation, String proposedProjectName) {
return baseLocation != null ? (baseLocation + File.separator + proposedProjectName) : null;
}
protected static void mkdirs(final IFolder folder) throws CoreException {
if (!folder.exists()) {
if (folder.getParent() instanceof IFolder) {
mkdirs((IFolder) folder.getParent());
}
folder.create(true, true, null);
}
}
}