blob: 2049e4071830b408877c3fded1250f660c5cda28 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2007 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.navigator.internal.dnd;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.operations.IUndoableOperation;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jst.j2ee.application.internal.operations.EARComponentImportDataModelProvider;
import org.eclipse.jst.j2ee.applicationclient.internal.creation.AppClientComponentImportDataModelProvider;
import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory;
import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentImportDataModelProperties;
import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBComponentImportDataModelProvider;
import org.eclipse.jst.j2ee.internal.jca.operations.ConnectorComponentImportDataModelProvider;
import org.eclipse.jst.j2ee.internal.navigator.ui.Messages;
import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentImportDataModelProvider;
import org.eclipse.jst.j2ee.navigator.internal.plugin.J2EENavigatorPlugin;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.TransferData;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.CopyFilesAndFoldersOperation;
import org.eclipse.ui.navigator.CommonDropAdapter;
import org.eclipse.ui.progress.IProgressService;
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 class ImportJ2EEModuleDropAssistant extends AddProjectToEARDropAssistant {
public boolean isSupportedType(TransferData aTransferType) {
return FileTransfer.getInstance().isSupportedType(aTransferType);
}
public IStatus handleDrop(CommonDropAdapter aDropAdapter, final DropTargetEvent aDropTargetEvent, final Object aTarget) {
if(FileTransfer.getInstance().isSupportedType(aDropAdapter.getCurrentTransfer())) {
final Shell shell = getShell();
IProgressService service = PlatformUI.getWorkbench().getProgressService();
Job importArtifactsJob = new Job(Messages.ImportJ2EEModuleDropAssistant_Importing_Java_Enterprise_Edition_artifacts) {
protected IStatus run(IProgressMonitor monitor) {
IProject targetEARProject = getProject(aTarget);
if(targetEARProject != null) {
/* If this isn't an ear project, we can't add the newly created modules to it. */
if(!hasEarFacet(targetEARProject))
targetEARProject = null;
} /* otherwise we assume the IWorkspaceRoot and just don't add the new modules an an existing ear */
String[] names = (String[]) aDropTargetEvent.data;
monitor.beginTask(Messages.ImportJ2EEModuleDropAssistant_Importing_Java_Enterprise_Edition_artifacts, names.length);
final MultiStatus status = new MultiStatus(J2EENavigatorPlugin.PLUGIN_ID, 0, Messages.ImportJ2EEModuleDropAssistant_Importing_Java_Enterprise_Edition_artifacts, null);
SubProgressMonitor submonitor = new SubProgressMonitor(monitor, 10);
IDataModel importDataModel = null;
boolean performSimpleJarCopy = false;
List simpleJarsToCopyList = null;
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
List createdComponents = new ArrayList();
for(int i=0; i<names.length && !monitor.isCanceled(); i++) {
try {
importDataModel = null;
performSimpleJarCopy = false;
int separatorIndex = names[i].lastIndexOf(File.separatorChar);
int dotIndex = names[i].lastIndexOf('.');
if(separatorIndex > 0 && separatorIndex+1 < dotIndex) {
String filename = names[i].substring(separatorIndex+1, dotIndex);
if(root.getProject(filename).exists()) {
filename = calculateValidProjectName(filename);
}
String extension = names[i].substring(dotIndex);
if(IModuleExtensions.DOT_WAR.equals(extension)) {
importDataModel = DataModelFactory.createDataModel(new WebComponentImportDataModelProvider());
} else if(IModuleExtensions.DOT_RAR.equals(extension)) {
importDataModel = DataModelFactory.createDataModel(new ConnectorComponentImportDataModelProvider());
} else if(IModuleExtensions.DOT_EAR.equals(extension)) {
importDataModel = DataModelFactory.createDataModel(new EARComponentImportDataModelProvider());
} else if(IModuleExtensions.DOT_JAR.equals(extension)) {
Archive archive = null;
try {
archive = CommonarchiveFactory.eINSTANCE.openArchive(names[i]);
if(archive.isApplicationClientFile())
importDataModel = DataModelFactory.createDataModel(new AppClientComponentImportDataModelProvider());
else if(archive.isEJBJarFile())
importDataModel = DataModelFactory.createDataModel(new EJBComponentImportDataModelProvider());
else {
performSimpleJarCopy = true; //handle Utility jars as regular jars.
if(simpleJarsToCopyList == null){
simpleJarsToCopyList = new ArrayList();
simpleJarsToCopyList.add(names[i]);
}
}
} finally {
if(archive != null)
archive.close();
}
}
if(importDataModel != null) {
importDataModel.setStringProperty(IJ2EEComponentImportDataModelProperties.FILE_NAME, names[i]);
importDataModel.setStringProperty(IJ2EEComponentImportDataModelProperties.PROJECT_NAME, filename);
importDataModel.getDefaultOperation().execute(submonitor, null);
createdComponents.add((IVirtualComponent) importDataModel.getProperty(IJ2EEComponentImportDataModelProperties.COMPONENT));
} else if(!performSimpleJarCopy){
status.add(J2EENavigatorPlugin.createErrorStatus(0, NLS.bind(Messages.ImportJ2EEModuleDropAssistant_Could_not_recognize_extension_0_, extension), null));
}
}
} catch (Throwable e) {
String msg = e.getMessage() != null ? e.getMessage() : e.toString();
status.add(J2EENavigatorPlugin.createErrorStatus(0, msg, e));
}
}
if(targetEARProject != null) {
List createdModuleProjects = new ArrayList();
for(int i=0; i<createdComponents.size(); i++) {
IVirtualComponent component = (IVirtualComponent) createdComponents.get(i);
/* If this isn't an ear project, we can't add the newly created modules to it. */
if(!hasEarFacet(component.getProject())) {
createdModuleProjects.add(component.getProject());
}
}
IDataModel dataModel = getAddModuleDataModel(targetEARProject, createdModuleProjects);
IUndoableOperation dropOperation = dataModel.getDefaultOperation();
IStatus addProjectsStatus = null;
try {
addProjectsStatus = dropOperation.execute(monitor, null);
if(addProjectsStatus != null)
status.add(addProjectsStatus);
} catch (ExecutionException e) {
String msg = e.getMessage() != null ? e.getMessage() : e.toString();
status.add(J2EENavigatorPlugin.createErrorStatus(0, msg, null));
}
//copy the simpleJarsOver
if(simpleJarsToCopyList != null ){
try{
final String [] jarsToCopyArray = new String[simpleJarsToCopyList.size()];
simpleJarsToCopyList.toArray(jarsToCopyArray);
CopyFilesAndFoldersOperation operation = new CopyFilesAndFoldersOperation(shell);
operation.copyFilesInCurrentThread(jarsToCopyArray, targetEARProject, monitor);
}catch (Throwable e) {
String msg = e.getMessage() != null ? e.getMessage() : e.toString();
status.add(J2EENavigatorPlugin.createErrorStatus(0, msg, e));
}
}
}
return status;
}
};
service.showInDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), importArtifactsJob);
importArtifactsJob.setRule(ResourcesPlugin.getWorkspace().getRoot());
importArtifactsJob.schedule();
return Status.OK_STATUS;
}
return Status.CANCEL_STATUS;
}
public IStatus validateDrop(Object target, int operation, TransferData transferType) {
IStatus status = Status.CANCEL_STATUS;
if(FileTransfer.getInstance().isSupportedType(transferType)) {
IProject project = null;
if(target instanceof IWorkspaceRoot)
status = Status.OK_STATUS;
else if( (project = getProject(target)) != null && hasEarFacet(project))
status = Status.OK_STATUS;
}
return status;
}
}