001: /*******************************************************************************
002: * Copyright (c) 2000, 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.jdt.internal.ui.jarpackager;
011:
012: import java.lang.reflect.InvocationTargetException;
013: import java.util.ArrayList;
014: import java.util.List;
015:
016: import org.eclipse.core.runtime.Assert;
017: import org.eclipse.core.runtime.CoreException;
018: import org.eclipse.core.runtime.IStatus;
019: import org.eclipse.core.runtime.MultiStatus;
020: import org.eclipse.core.runtime.Status;
021:
022: import org.eclipse.core.resources.IFile;
023:
024: import org.eclipse.swt.widgets.Shell;
025:
026: import org.eclipse.jface.action.IAction;
027: import org.eclipse.jface.dialogs.ErrorDialog;
028:
029: import org.eclipse.ui.PlatformUI;
030:
031: import org.eclipse.jdt.internal.corext.util.Messages;
032:
033: import org.eclipse.jdt.ui.jarpackager.IJarDescriptionReader;
034: import org.eclipse.jdt.ui.jarpackager.IJarExportRunnable;
035: import org.eclipse.jdt.ui.jarpackager.JarPackageData;
036:
037: import org.eclipse.jdt.internal.ui.JavaPlugin;
038: import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
039:
040: public class CreateJarActionDelegate extends JarPackageActionDelegate {
041:
042: /*
043: * @see IActionDelegate
044: */
045: public void run(IAction action) {
046: IFile[] descriptions = getDescriptionFiles(getSelection());
047: MultiStatus mergedStatus;
048: int length = descriptions.length;
049: if (length < 1)
050: return;
051:
052: // Create read multi status
053: String message;
054: if (length > 1)
055: message = JarPackagerMessages.JarFileExportOperation_creationOfSomeJARsFailed;
056: else
057: message = JarPackagerMessages.JarFileExportOperation_jarCreationFailed;
058: MultiStatus readStatus = new MultiStatus(JavaPlugin
059: .getPluginId(), 0, message, null);
060: JarPackageData[] jarPackages = readJarPackages(descriptions,
061: readStatus);
062: if (jarPackages.length > 0) {
063: IStatus status = export(jarPackages);
064: if (status == null)
065: return; // cancelled
066: if (readStatus.getSeverity() == IStatus.ERROR)
067: message = readStatus.getMessage();
068: else
069: message = status.getMessage();
070: // Create new status because we want another message - no API to set message
071: mergedStatus = new MultiStatus(JavaPlugin.getPluginId(),
072: status.getCode(), readStatus.getChildren(),
073: message, null);
074: mergedStatus.merge(status);
075: } else
076: mergedStatus = readStatus;
077:
078: if (!mergedStatus.isOK())
079: ErrorDialog
080: .openError(
081: getShell(),
082: JarPackagerMessages.CreateJarActionDelegate_jarExport_title,
083: null, mergedStatus);
084: }
085:
086: private JarPackageData[] readJarPackages(IFile[] descriptions,
087: MultiStatus readStatus) {
088: List jarPackagesList = new ArrayList(descriptions.length);
089: for (int i = 0; i < descriptions.length; i++) {
090: JarPackageData jarPackage = readJarPackage(descriptions[i],
091: readStatus);
092: if (jarPackage != null)
093: jarPackagesList.add(jarPackage);
094: }
095: return (JarPackageData[]) jarPackagesList
096: .toArray(new JarPackageData[jarPackagesList.size()]);
097: }
098:
099: private IStatus export(JarPackageData[] jarPackages) {
100: Shell shell = getShell();
101: IJarExportRunnable op = jarPackages[0].createJarExportRunnable(
102: jarPackages, shell);
103: try {
104: PlatformUI.getWorkbench().getActiveWorkbenchWindow().run(
105: false, true, op);
106: //PlatformUI.getWorkbench().getProgressService().run(false, true, op); // see bug 118152
107: } catch (InvocationTargetException ex) {
108: if (ex.getTargetException() != null) {
109: ExceptionHandler
110: .handle(
111: ex,
112: shell,
113: JarPackagerMessages.CreateJarActionDelegate_jarExportError_title,
114: JarPackagerMessages.CreateJarActionDelegate_jarExportError_message);
115: return null;
116: }
117: } catch (InterruptedException e) {
118: // do nothing on cancel
119: return null;
120: }
121: return op.getStatus();
122: }
123:
124: /**
125: * Reads the JAR package spec from file.
126: */
127: protected JarPackageData readJarPackage(IFile description,
128: MultiStatus readStatus) {
129: Assert.isLegal(description.isAccessible());
130: Assert.isNotNull(description.getFileExtension());
131: Assert.isLegal(description.getFileExtension().equals(
132: JarPackagerUtil.DESCRIPTION_EXTENSION));
133: JarPackageData jarPackage = new JarPackageData();
134: IJarDescriptionReader reader = null;
135: try {
136: reader = jarPackage.createJarDescriptionReader(description
137: .getContents());
138: // Do not save - only generate JAR
139: reader.read(jarPackage);
140: jarPackage.setSaveManifest(false);
141: jarPackage.setSaveDescription(false);
142: } catch (CoreException ex) {
143: String message = Messages
144: .format(
145: JarPackagerMessages.JarFileExportOperation_errorReadingFile,
146: new Object[] { description.getFullPath(),
147: ex.getStatus().getMessage() });
148: addToStatus(readStatus, jarPackage, message, ex);
149: return null;
150: } finally {
151: if (reader != null)
152: // AddWarnings
153: readStatus.addAll(reader.getStatus());
154: try {
155: if (reader != null)
156: reader.close();
157: } catch (CoreException ex) {
158: String message = Messages
159: .format(
160: JarPackagerMessages.JarFileExportOperation_errorClosingJarPackageDescriptionReader,
161: description.getFullPath());
162: addToStatus(readStatus, jarPackage, message, ex);
163: }
164: }
165: return jarPackage;
166: }
167:
168: protected void addToStatus(MultiStatus multiStatus,
169: JarPackageData jarPackage, String defaultMessage,
170: CoreException ex) {
171: IStatus status = ex.getStatus();
172: String message = ex.getLocalizedMessage();
173: if (message == null || message.length() < 1)
174: status = new Status(status.getSeverity(), status
175: .getPlugin(), status.getCode(), defaultMessage, ex);
176: multiStatus.add(status);
177: }
178: }
|