blob: ef9fe1ddef69f59bcfdafe4f93d7b8a244ab5011 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2011 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
* Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 83258 [jar exporter] Deploy java application as executable jar
* Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 213638 [jar exporter] create ANT build file for current settings
* Ferenc Hechler <ferenc_hechler@users.sourceforge.net> - [jar exporter] export directory entries in "Runnable JAR File" - https://bugs.eclipse.org/bugs/show_bug.cgi?id=243163
* Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 219530 [jar application] add Jar-in-Jar ClassLoader option
*******************************************************************************/
package org.eclipse.jdt.internal.ui.jarpackagerfat;
import java.lang.reflect.InvocationTargetException;
import java.util.HashSet;
import java.util.Iterator;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.IExportWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.ui.jarpackager.IJarExportRunnable;
import org.eclipse.jdt.ui.jarpackager.JarPackageData;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.JavaPluginImages;
import org.eclipse.jdt.internal.ui.dialogs.OptionalMessageDialog;
import org.eclipse.jdt.internal.ui.jarpackagerfat.FatJarPackageWizardPage.LibraryHandler;
import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
/**
* Wizard for exporting resources from the workspace to a Fat Java Archive (JAR) file.
* The exported jar will contain all required libraries.
*
* @since 3.4
*/
public class FatJarPackageWizard extends Wizard implements IExportWizard {
private static String DIALOG_SETTINGS_KEY= "FatJarPackageWizard"; //$NON-NLS-1$
private static final class IPIssueWarningDialog extends OptionalMessageDialog {
private static final String ID= "RunnableJar.export.ipwarning"; //$NON-NLS-1$
protected IPIssueWarningDialog(Shell parent, String title, String message) {
super(ID, parent, title, null, message, MessageDialog.WARNING, new String[] { IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL }, 0);
}
}
private boolean fHasNewDialogSettings;
private boolean fInitializeFromJarPackage;
private JarPackageData fJarPackage;
private FatJarPackageWizardPage fJarPackageWizardPage;
private IStructuredSelection fSelection;
/**
* Creates a wizard for exporting workspace resources to a JAR file.
*/
public FatJarPackageWizard() {
IDialogSettings workbenchSettings= JavaPlugin.getDefault().getDialogSettings();
IDialogSettings section= workbenchSettings.getSection(DIALOG_SETTINGS_KEY);
if (section == null)
fHasNewDialogSettings= true;
else {
fHasNewDialogSettings= false;
setDialogSettings(section);
}
}
/**
* {@inheritDoc}
*/
@Override
public void addPages() {
super.addPages();
fJarPackageWizardPage= new FatJarPackageWizardPage(fJarPackage, fSelection);
addPage(fJarPackageWizardPage);
}
/**
* Exports the JAR package.
*
* @param op the operation to run
* @param wizardPageStatus the status returned by the wizard page
* @return a boolean indicating success or failure
*/
protected boolean executeExportOperation(IJarExportRunnable op, IStatus wizardPageStatus) {
try {
getContainer().run(true, true, op);
} catch (InterruptedException e) {
return false;
} catch (InvocationTargetException ex) {
if (ex.getTargetException() != null) {
ExceptionHandler.handle(ex, getShell(), FatJarPackagerMessages.JarPackageWizard_jarExportError_title, FatJarPackagerMessages.JarPackageWizard_jarExportError_message);
return false;
}
}
IStatus status= op.getStatus();
if (!status.isOK()) {
if (!wizardPageStatus.isOK()) {
if (!(status instanceof MultiStatus))
status= new MultiStatus(status.getPlugin(), status.getCode(), status.getMessage(), status.getException());
((MultiStatus) status).add(wizardPageStatus);
}
ErrorDialog.openError(getShell(), FatJarPackagerMessages.JarPackageWizard_jarExport_title, null, status);
return !(status.matches(IStatus.ERROR));
} else if (!wizardPageStatus.isOK()) {
ErrorDialog.openError(getShell(), FatJarPackagerMessages.JarPackageWizard_jarExport_title, null, wizardPageStatus);
}
return true;
}
@Override
public IWizardPage getNextPage(IWizardPage page) {
return super.getNextPage(page);
}
@Override
public IWizardPage getPreviousPage(IWizardPage page) {
return super.getPreviousPage(page);
}
/**
* @return all java projects which contain the selected elements in the active workbench window
*/
protected IStructuredSelection getSelectedJavaProjects() {
ISelection currentSelection= JavaPlugin.getActiveWorkbenchWindow().getSelectionService().getSelection();
if (currentSelection instanceof IStructuredSelection) {
IStructuredSelection structuredSelection= (IStructuredSelection) currentSelection;
HashSet<IJavaProject> selectedElements= new HashSet<IJavaProject>();
Iterator<?> iter= structuredSelection.iterator();
while (iter.hasNext()) {
Object selectedElement= iter.next();
if (selectedElement instanceof IJavaElement) {
IJavaProject javaProject= ((IJavaElement) selectedElement).getJavaProject();
if (javaProject != null)
selectedElements.add(javaProject);
}
}
return new StructuredSelection(selectedElements);
} else
return StructuredSelection.EMPTY;
}
/**
* {@inheritDoc}
*/
public void init(IWorkbench workbench, IStructuredSelection selection) {
fSelection= getSelectedJavaProjects();
fJarPackage= new JarPackageData();
fJarPackage.setIncludeDirectoryEntries(true);
setInitializeFromJarPackage(false);
setWindowTitle(FatJarPackagerMessages.JarPackageWizard_windowTitle);
setDefaultPageImageDescriptor(JavaPluginImages.DESC_WIZBAN_FAT_JAR_PACKAGER);
setNeedsProgressMonitor(true);
}
/**
* Initializes this wizard from the given JAR package description.
*
* @param workbench
* the workbench which launched this wizard
* @param jarPackage
* the JAR package description used to initialize this wizard
*/
public void init(IWorkbench workbench, JarPackageData jarPackage) {
Assert.isNotNull(workbench);
Assert.isNotNull(jarPackage);
fJarPackage= jarPackage;
setInitializeFromJarPackage(true);
setWindowTitle(FatJarPackagerMessages.JarPackageWizard_windowTitle);
setDefaultPageImageDescriptor(JavaPluginImages.DESC_WIZBAN_FAT_JAR_PACKAGER);
setNeedsProgressMonitor(true);
}
boolean isInitializingFromJarPackage() {
return fInitializeFromJarPackage;
}
/**
* {@inheritDoc}
*/
@Override
public boolean performFinish() {
LibraryHandler libraryHandler= fJarPackageWizardPage.getLibraryHandler();
fJarPackage.setJarBuilder(libraryHandler.getBuilder(fJarPackage));
MultiStatus status= new MultiStatus(JavaPlugin.getPluginId(), IStatus.OK, FatJarPackagerMessages.FatJarPackageWizard_JarExportProblems_message, null);
Object[] elements= fJarPackageWizardPage.getSelectedElementsWithoutContainedChildren(status);
fJarPackage.setElements(elements);
if ((libraryHandler.isShowWarning()) && hasArchive(elements)) {
if (OptionalMessageDialog.isDialogEnabled(IPIssueWarningDialog.ID)) {
IPIssueWarningDialog dialog= new IPIssueWarningDialog(getShell(), FatJarPackagerMessages.FatJarPackageWizard_IPIssueDialog_title,
FatJarPackagerMessages.FatJarPackageWizard_IPIssueDialog_message);
if (dialog.open() != Window.OK)
return false;
OptionalMessageDialog.setDialogEnabled(IPIssueWarningDialog.ID, true);
}
}
fJarPackageWizardPage.exportAntScript(status);
if (!executeExportOperation(fJarPackage.createJarExportRunnable(getShell()), status))
return false;
// Save the dialog settings
if (fHasNewDialogSettings) {
IDialogSettings workbenchSettings= JavaPlugin.getDefault().getDialogSettings();
IDialogSettings section= workbenchSettings.getSection(DIALOG_SETTINGS_KEY);
section= workbenchSettings.addNewSection(DIALOG_SETTINGS_KEY);
setDialogSettings(section);
}
fJarPackageWizardPage.finish();
return true;
}
private boolean hasArchive(Object[] elements) {
for (int i= 0; i < elements.length; i++) {
if (elements[i] instanceof IPackageFragmentRoot) {
IPackageFragmentRoot root= (IPackageFragmentRoot) elements[i];
if (root.isArchive())
return true;
}
}
return false;
}
void setInitializeFromJarPackage(boolean state) {
fInitializeFromJarPackage= state;
}
}