org.eclipse.ajdt.internal.ui.wizards.exports.AJJarPackageWizard.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ajdt.internal.ui.wizards.exports.AJJarPackageWizard.java

Source

/**********************************************************************
 * Copyright (c) 2004 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.ajdt.internal.ui.wizards.exports;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.core.IClassFile;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IOpenable;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.JavaPluginImages;
import org.eclipse.jdt.internal.ui.jarpackager.JarPackagerMessages;
import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
import org.eclipse.jdt.ui.jarpackager.IJarExportRunnable;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.IExportWizard;
import org.eclipse.ui.IWorkbench;

/**
 * Copied from JARPackageWizard to enable AspectJ projects to 
 * export JARs correctly.
 * Changes marked with // AspectJ Change
 */
public class AJJarPackageWizard extends Wizard implements IExportWizard {
    private static String DIALOG_SETTINGS_KEY = "JarPackageWizard"; //$NON-NLS-1$

    private IStructuredSelection fSelection;
    private AJJarPackageData fJarPackage;
    private AJJarPackageWizardPage fJarPackageWizardPage;
    private boolean fHasNewDialogSettings;
    private boolean fInitializeFromJarPackage;

    /**
     * Creates a wizard for exporting workspace resources to a JAR file.
     */
    public AJJarPackageWizard() {
        IDialogSettings workbenchSettings = JavaPlugin.getDefault().getDialogSettings();
        IDialogSettings section = workbenchSettings.getSection(DIALOG_SETTINGS_KEY);
        if (section == null)
            fHasNewDialogSettings = true;
        else {
            fHasNewDialogSettings = false;
            setDialogSettings(section);
        }
    }

    /*
     * (non-Javadoc)
     * Method declared on IWizard.
     */
    public void addPages() {
        super.addPages();
        // AspectJ Change Begin
        fJarPackageWizardPage = new AJJarPackageWizardPage(fJarPackage, fSelection);
        addPage(fJarPackageWizardPage);
        addPage(new AJJarOptionsPage(fJarPackage));
        addPage(new AJJarManifestWizardPage(fJarPackage));
        // AspectJ Change End
    }

    /*
     * (non-Javadoc)
     * Method declared on IWorkbenchWizard.
     */
    public void init(IWorkbench workbench, IStructuredSelection selection) {
        // ignore the selection argument since the main export wizard changed it
        fSelection = getValidSelection();
        fJarPackage = new AJJarPackageData();
        setInitializeFromJarPackage(false);
        setWindowTitle(JarPackagerMessages.JarPackageWizard_windowTitle);
        setDefaultPageImageDescriptor(JavaPluginImages.DESC_WIZBAN_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, AJJarPackageData jarPackage) { // AspectJ Change
        Assert.isNotNull(workbench);
        Assert.isNotNull(jarPackage);
        fJarPackage = jarPackage;
        setInitializeFromJarPackage(true);
        fSelection = new StructuredSelection(fJarPackage.getElements());
        setWindowTitle(JarPackagerMessages.JarPackageWizard_windowTitle);
        setDefaultPageImageDescriptor(JavaPluginImages.DESC_WIZBAN_JAR_PACKAGER);
        setNeedsProgressMonitor(true);
    }

    /*
     * (non-Javadoc)
     * Method declared on IWizard.
     */
    public boolean performFinish() {
        /*
         * Compute and assign the minmal export list
         */
        fJarPackage.setElements(fJarPackageWizardPage.getSelectedElementsWithoutContainedChildren());

        if (!executeExportOperation(fJarPackage.createJarExportRunnable(getShell())))
            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);
        }
        IWizardPage[] pages = getPages();
        for (int i = 0; i < getPageCount(); i++) {
            IWizardPage page = pages[i];
            if (page instanceof IJarPackageWizardPage)
                ((IJarPackageWizardPage) page).finish();
        }
        return true;
    }

    /**
     * Exports the JAR package.
     *
     * @return   a boolean indicating success or failure
     */
    protected boolean executeExportOperation(IJarExportRunnable op) {
        try {
            getContainer().run(true, true, op);
        } catch (InterruptedException e) {
            return false;
        } catch (InvocationTargetException ex) {
            if (ex.getTargetException() != null) {
                ExceptionHandler.handle(ex, getShell(), JarPackagerMessages.JarPackageWizard_jarExportError_title,
                        JarPackagerMessages.JarPackageWizard_jarExportError_message);
                return false;
            }
        }
        IStatus status = op.getStatus();
        if (!status.isOK()) {
            ErrorDialog.openError(getShell(), JarPackagerMessages.JarPackageWizard_jarExport_title, null, status);
            return !(status.matches(IStatus.ERROR));
        }
        return true;
    }

    /**
     * Gets the current workspace page selection and converts it to a valid
     * selection for this wizard:
     * - resources and projects are OK
     * - CUs are OK
     * - Java projects are OK
     * - Source package fragments and source packages fragement roots are ok
     * - Java elements below a CU are converted to their CU
     * - all other input elements are ignored
     * 
     * @return a valid structured selection based on the current selection
     */
    protected IStructuredSelection getValidSelection() {
        ISelection currentSelection = JavaPlugin.getActiveWorkbenchWindow().getSelectionService().getSelection();
        if (currentSelection instanceof IStructuredSelection) {
            IStructuredSelection structuredSelection = (IStructuredSelection) currentSelection;
            List selectedElements = new ArrayList(structuredSelection.size());
            Iterator iter = structuredSelection.iterator();
            while (iter.hasNext()) {
                Object selectedElement = iter.next();
                if (selectedElement instanceof IProject)
                    addProject(selectedElements, (IProject) selectedElement);
                else if (selectedElement instanceof IResource)
                    addResource(selectedElements, (IResource) selectedElement);
                else if (selectedElement instanceof IJavaElement)
                    addJavaElement(selectedElements, (IJavaElement) selectedElement);
            }
            return new StructuredSelection(selectedElements);
        } else
            return StructuredSelection.EMPTY;
    }

    private void addResource(List selectedElements, IResource resource) {
        IJavaElement je = JavaCore.create(resource);
        if (je != null && je.exists() && je.getElementType() == IJavaElement.COMPILATION_UNIT)
            selectedElements.add(je);
        else
            selectedElements.add(resource);
    }

    private void addProject(List selectedElements, IProject project) {
        try {
            if (project.hasNature(JavaCore.NATURE_ID))
                selectedElements.add(JavaCore.create(project));
        } catch (CoreException ex) {
            // ignore selected element
        }
    }

    private void addJavaElement(List selectedElements, IJavaElement je) {
        if (je.getElementType() == IJavaElement.COMPILATION_UNIT)
            selectedElements.add(je);
        else if (je.getElementType() == IJavaElement.CLASS_FILE)
            selectedElements.add(je);
        else if (je.getElementType() == IJavaElement.JAVA_PROJECT)
            selectedElements.add(je);
        else if (je.getElementType() == IJavaElement.PACKAGE_FRAGMENT) {
            if (!JavaModelUtil.getPackageFragmentRoot(je).isArchive())
                selectedElements.add(je);
        } else if (je.getElementType() == IJavaElement.PACKAGE_FRAGMENT_ROOT) {
            if (!((IPackageFragmentRoot) je).isArchive())
                selectedElements.add(je);
        } else {
            IOpenable openable = je.getOpenable();
            if (openable instanceof ICompilationUnit)
                selectedElements.add(((ICompilationUnit) openable).getPrimary());
            else if (openable instanceof IClassFile && !JavaModelUtil.getPackageFragmentRoot(je).isArchive())
                selectedElements.add(openable);
        }
    }

    boolean isInitializingFromJarPackage() {
        return fInitializeFromJarPackage;
    }

    void setInitializeFromJarPackage(boolean state) {
        fInitializeFromJarPackage = state;
    }
}