blob: 3aa970e3677bdc866afebf359b1be61ed681fc43 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 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.jdt.internal.ui.jarpackager;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.resources.IFile;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.util.Assert;
import org.eclipse.ui.PlatformUI;
import org.eclipse.jdt.internal.corext.util.Messages;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.dialogs.ProblemDialog;
import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
import org.eclipse.jdt.ui.jarpackager.IJarDescriptionReader;
import org.eclipse.jdt.ui.jarpackager.IJarExportRunnable;
import org.eclipse.jdt.ui.jarpackager.JarPackageData;
public class CreateJarActionDelegate extends JarPackageActionDelegate {
/*
* @see IActionDelegate
*/
public void run(IAction action) {
IFile[] descriptions= getDescriptionFiles(getSelection());
MultiStatus mergedStatus;
int length= descriptions.length;
if (length < 1)
return;
// Create read multi status
String message;
if (length > 1)
message= JarPackagerMessages.JarFileExportOperation_creationOfSomeJARsFailed;
else
message= JarPackagerMessages.JarFileExportOperation_jarCreationFailed;
MultiStatus readStatus= new MultiStatus(JavaPlugin.getPluginId(), 0, message, null); //$NON-NLS-1$
JarPackageData[] jarPackages= readJarPackages(descriptions, readStatus);
if (jarPackages.length > 0) {
IStatus status= export(jarPackages);
if (status == null)
return; // cancelled
if (readStatus.getSeverity() == IStatus.ERROR)
message= readStatus.getMessage();
else
message= status.getMessage();
// Create new status because we want another message - no API to set message
mergedStatus= new MultiStatus(JavaPlugin.getPluginId(), status.getCode(), readStatus.getChildren(), message, null);
mergedStatus.merge(status);
} else
mergedStatus= readStatus;
if (!mergedStatus.isOK())
ProblemDialog.open(getShell(), JarPackagerMessages.CreateJarActionDelegate_jarExport_title, null, mergedStatus);
}
private JarPackageData[] readJarPackages(IFile[] descriptions, MultiStatus readStatus) {
List jarPackagesList= new ArrayList(descriptions.length);
for (int i= 0; i < descriptions.length; i++) {
JarPackageData jarPackage= readJarPackage(descriptions[i], readStatus);
if (jarPackage != null)
jarPackagesList.add(jarPackage);
}
return (JarPackageData[])jarPackagesList.toArray(new JarPackageData[jarPackagesList.size()]);
}
private IStatus export(JarPackageData[] jarPackages) {
Shell shell= getShell();
IJarExportRunnable op= jarPackages[0].createJarExportRunnable(jarPackages, shell);
try {
PlatformUI.getWorkbench().getProgressService().run(true, true, op);
} catch (InvocationTargetException ex) {
if (ex.getTargetException() != null) {
ExceptionHandler.handle(ex, shell, JarPackagerMessages.CreateJarActionDelegate_jarExportError_title, JarPackagerMessages.CreateJarActionDelegate_jarExportError_message);
return null;
}
} catch (InterruptedException e) {
// do nothing on cancel
return null;
}
return op.getStatus();
}
/**
* Reads the JAR package spec from file.
*/
protected JarPackageData readJarPackage(IFile description, MultiStatus readStatus) {
Assert.isLegal(description.isAccessible());
Assert.isNotNull(description.getFileExtension());
Assert.isLegal(description.getFileExtension().equals(JarPackagerUtil.DESCRIPTION_EXTENSION));
JarPackageData jarPackage= new JarPackageData();
IJarDescriptionReader reader= null;
try {
reader= jarPackage.createJarDescriptionReader(description.getContents());
// Do not save - only generate JAR
reader.read(jarPackage);
jarPackage.setSaveManifest(false);
jarPackage.setSaveDescription(false);
} catch (CoreException ex) {
String message= Messages.format(JarPackagerMessages.JarFileExportOperation_errorReadingFile, new Object[] {description.getFullPath(), ex.getStatus().getMessage()});
addToStatus(readStatus, jarPackage, message, ex);
return null;
} finally {
if (reader != null)
// AddWarnings
readStatus.addAll(reader.getStatus());
try {
if (reader != null)
reader.close();
}
catch (CoreException ex) {
String message= Messages.format(JarPackagerMessages.JarFileExportOperation_errorClosingJarPackageDescriptionReader, description.getFullPath());
addToStatus(readStatus, jarPackage, message, ex);
}
}
return jarPackage;
}
protected void addToStatus(MultiStatus multiStatus, JarPackageData jarPackage, String defaultMessage, CoreException ex) {
IStatus status= ex.getStatus();
String message= ex.getLocalizedMessage();
if (message == null || message.length() < 1)
status= new Status(status.getSeverity(), status.getPlugin(), status.getCode(), defaultMessage, ex);
multiStatus.add(status);
}
}