org.eclipse.wst.jsdt.internal.ui.javadocexport.JavadocWizard.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.wst.jsdt.internal.ui.javadocexport.JavadocWizard.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2008 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
 *     Sebastian Davids <sdavids@gmx.de> bug 38692
 *******************************************************************************/
package org.eclipse.wst.jsdt.internal.ui.javadocexport;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IDebugEventSetListener;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.core.Launch;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IExportWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.wst.jsdt.core.IJavaScriptElement;
import org.eclipse.wst.jsdt.core.IJavaScriptProject;
import org.eclipse.wst.jsdt.internal.corext.util.Messages;
import org.eclipse.wst.jsdt.internal.ui.JavaScriptPlugin;
import org.eclipse.wst.jsdt.internal.ui.JavaPluginImages;
import org.eclipse.wst.jsdt.internal.ui.actions.OpenBrowserUtil;
import org.eclipse.wst.jsdt.internal.ui.dialogs.OptionalMessageDialog;
import org.eclipse.wst.jsdt.internal.ui.javaeditor.EditorUtility;
import org.eclipse.wst.jsdt.internal.ui.refactoring.RefactoringSaveHelper;
import org.eclipse.wst.jsdt.internal.ui.util.ExceptionHandler;
import org.eclipse.wst.jsdt.internal.ui.util.PixelConverter;
import org.eclipse.wst.jsdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.wst.jsdt.ui.JavaScriptUI;

public class JavadocWizard extends Wizard implements IExportWizard {

    private JavadocTreeWizardPage fJTWPage;
    private JavadocSpecificsWizardPage fJSWPage;
    private JavadocStandardWizardPage fJSpWPage;

    private IPath fDestination;

    private boolean fWriteCustom;
    private boolean fOpenInBrowser;

    private final String TREE_PAGE_DESC = "JavadocTreePage"; //$NON-NLS-1$
    private final String SPECIFICS_PAGE_DESC = "JavadocSpecificsPage"; //$NON-NLS-1$
    private final String STANDARD_PAGE_DESC = "JavadocStandardPage"; //$NON-NLS-1$

    private final int YES = 0;
    private final int YES_TO_ALL = 1;
    private final int NO = 2;
    private final int NO_TO_ALL = 3;
    private final String JAVADOC_ANT_INFORMATION_DIALOG = "javadocAntInformationDialog";//$NON-NLS-1$

    private JavadocOptionsManager fStore;
    private IWorkspaceRoot fRoot;

    private IFile fXmlJavadocFile;

    private static final String ID_JAVADOC_PROCESS_TYPE = "org.eclipse.wst.jsdt.ui.javadocProcess"; //$NON-NLS-1$

    public static void openJavadocWizard(JavadocWizard wizard, Shell shell, IStructuredSelection selection) {
        wizard.init(PlatformUI.getWorkbench(), selection);

        WizardDialog dialog = new WizardDialog(shell, wizard);
        PixelConverter converter = new PixelConverter(JFaceResources.getDialogFont());
        dialog.setMinimumPageSize(converter.convertWidthInCharsToPixels(100),
                converter.convertHeightInCharsToPixels(20));
        dialog.open();
    }

    public JavadocWizard() {
        this(null);
    }

    public JavadocWizard(IFile xmlJavadocFile) {
        super();
        setDefaultPageImageDescriptor(JavaPluginImages.DESC_WIZBAN_EXPORT_JAVADOC);
        setWindowTitle(JavadocExportMessages.JavadocWizard_javadocwizard_title);

        setDialogSettings(JavaScriptPlugin.getDefault().getDialogSettings());

        fRoot = ResourcesPlugin.getWorkspace().getRoot();
        fXmlJavadocFile = xmlJavadocFile;

        fWriteCustom = false;
    }

    /*
     * @see IWizard#performFinish()
     */
    public boolean performFinish() {

        IJavaScriptProject[] checkedProjects = fJTWPage.getCheckedProjects();
        updateStore(checkedProjects);

        fStore.updateDialogSettings(getDialogSettings(), checkedProjects);

        // Wizard should not run with dirty editors
        if (!new RefactoringSaveHelper(RefactoringSaveHelper.SAVE_ALL_ALWAYS_ASK).saveEditors(getShell())) {
            return false;
        }

        fDestination = Path.fromOSString(fStore.getDestination());
        fDestination.toFile().mkdirs();

        fOpenInBrowser = fStore.doOpenInBrowser();

        //Ask if you wish to set the javadoc location for the projects (all) to 
        //the location of the newly generated javadoc 
        if (fStore.isFromStandard()) {
            try {

                URL newURL = fDestination.toFile().toURL();
                List projs = new ArrayList();
                //get javadoc locations for all projects
                for (int i = 0; i < checkedProjects.length; i++) {
                    IJavaScriptProject curr = checkedProjects[i];
                    URL currURL = JavaScriptUI.getProjectJSdocLocation(curr);
                    if (!newURL.equals(currURL)) { // currURL can be null
                        //if not all projects have the same javadoc location ask if you want to change
                        //them to have the same javadoc location
                        projs.add(curr);
                    }
                }
                if (!projs.isEmpty()) {
                    setAllJavadocLocations(
                            (IJavaScriptProject[]) projs.toArray(new IJavaScriptProject[projs.size()]), newURL);
                }
            } catch (MalformedURLException e) {
                JavaScriptPlugin.log(e);
            }
        }

        if (fJSWPage.generateAnt()) {
            //@Improve: make a better message
            OptionalMessageDialog.open(JAVADOC_ANT_INFORMATION_DIALOG, getShell(),
                    JavadocExportMessages.JavadocWizard_antInformationDialog_title, null,
                    JavadocExportMessages.JavadocWizard_antInformationDialog_message, MessageDialog.INFORMATION,
                    new String[] { IDialogConstants.OK_LABEL }, 0);
            try {
                File file = fStore.createXML(checkedProjects);
                if (file != null) {
                    IFile[] files = fRoot.findFilesForLocation(Path.fromOSString(file.getPath()));
                    if (files != null) {
                        for (int i = 0; i < files.length; i++) {
                            files[i].refreshLocal(IResource.DEPTH_ONE, null);
                        }
                    }
                }

            } catch (CoreException e) {
                ExceptionHandler.handle(e, getShell(), JavadocExportMessages.JavadocWizard_error_writeANT_title,
                        JavadocExportMessages.JavadocWizard_error_writeANT_message);
            }
        }

        if (!executeJavadocGeneration())
            return false;

        return true;
    }

    private void updateStore(IJavaScriptProject[] checkedProjects) {
        //writes the new settings to store
        fJTWPage.updateStore(checkedProjects);
        if (!fJTWPage.getCustom())
            fJSpWPage.updateStore();
        fJSWPage.updateStore();
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.wizard.IWizard#performCancel()
     */
    public boolean performCancel() {

        IJavaScriptProject[] checkedProjects = fJTWPage.getCheckedProjects();
        updateStore(checkedProjects);

        //If the wizard was not launched from an ant file store the settings 
        if (fXmlJavadocFile == null) {
            fStore.updateDialogSettings(getDialogSettings(), checkedProjects);
        }
        return super.performCancel();
    }

    private void setAllJavadocLocations(IJavaScriptProject[] projects, URL newURL) {
        Shell shell = getShell();
        String[] buttonlabels = new String[] { IDialogConstants.YES_LABEL, IDialogConstants.YES_TO_ALL_LABEL,
                IDialogConstants.NO_LABEL, IDialogConstants.NO_TO_ALL_LABEL };

        for (int j = 0; j < projects.length; j++) {
            IJavaScriptProject iJavaProject = projects[j];
            String message = Messages.format(JavadocExportMessages.JavadocWizard_updatejavadoclocation_message,
                    new String[] { iJavaProject.getElementName(), fDestination.toOSString() });
            MessageDialog dialog = new MessageDialog(shell,
                    JavadocExportMessages.JavadocWizard_updatejavadocdialog_label, null, message,
                    MessageDialog.QUESTION, buttonlabels, 1);

            switch (dialog.open()) {
            case YES:
                JavaScriptUI.setProjectJSdocLocation(iJavaProject, newURL);
                break;
            case YES_TO_ALL:
                for (int i = j; i < projects.length; i++) {
                    iJavaProject = projects[i];
                    JavaScriptUI.setProjectJSdocLocation(iJavaProject, newURL);
                    j++;
                }
                break;
            case NO_TO_ALL:
                j = projects.length;
                break;
            case NO:
            default:
                break;
            }
        }
    }

    private boolean executeJavadocGeneration() {
        Process process = null;
        try {
            ArrayList vmArgs = new ArrayList();
            ArrayList progArgs = new ArrayList();

            IStatus status = fStore.getArgumentArray(vmArgs, progArgs);
            if (!status.isOK()) {
                ErrorDialog.openError(getShell(), JavadocExportMessages.JavadocWizard_error_title,
                        JavadocExportMessages.JavadocWizard_warning_starting_message, status);
            }

            File file = File.createTempFile("javadoc-arguments", ".tmp"); //$NON-NLS-1$//$NON-NLS-2$
            vmArgs.add('@' + file.getAbsolutePath());

            FileWriter writer = new FileWriter(file);
            try {
                for (int i = 0; i < progArgs.size(); i++) {
                    String curr = (String) progArgs.get(i);
                    curr = checkForSpaces(curr);

                    writer.write(curr);
                    writer.write(' ');
                }
            } finally {
                writer.close();
            }

            String[] args = (String[]) vmArgs.toArray(new String[vmArgs.size()]);
            process = Runtime.getRuntime().exec(args);
            if (process != null) {
                // construct a formatted command line for the process properties
                StringBuffer buf = new StringBuffer();
                for (int i = 0; i < args.length; i++) {
                    buf.append(args[i]);
                    buf.append(' ');
                }

                IDebugEventSetListener listener = new JavadocDebugEventListener(getShell().getDisplay(), file);
                DebugPlugin.getDefault().addDebugEventListener(listener);

                ILaunchConfigurationWorkingCopy wc = null;
                try {
                    ILaunchConfigurationType lcType = DebugPlugin.getDefault().getLaunchManager()
                            .getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION);
                    String name = JavadocExportMessages.JavadocWizard_launchconfig_name;
                    wc = lcType.newInstance(null, name);
                    wc.setAttribute(IDebugUIConstants.ATTR_PRIVATE, true);

                    ILaunch newLaunch = new Launch(wc, ILaunchManager.RUN_MODE, null);
                    IProcess iprocess = DebugPlugin.newProcess(newLaunch, process,
                            JavadocExportMessages.JavadocWizard_javadocprocess_label);
                    iprocess.setAttribute(IProcess.ATTR_CMDLINE, buf.toString());
                    iprocess.setAttribute(IProcess.ATTR_PROCESS_TYPE, ID_JAVADOC_PROCESS_TYPE);

                    DebugPlugin.getDefault().getLaunchManager().addLaunch(newLaunch);

                } catch (CoreException e) {
                    String title = JavadocExportMessages.JavadocWizard_error_title;
                    String message = JavadocExportMessages.JavadocWizard_launch_error_message;
                    ExceptionHandler.handle(e, getShell(), title, message);
                }

                return true;

            }
        } catch (IOException e) {
            String title = JavadocExportMessages.JavadocWizard_error_title;
            String message = JavadocExportMessages.JavadocWizard_exec_error_message;

            IStatus status = new Status(IStatus.ERROR, JavaScriptUI.ID_PLUGIN, IStatus.ERROR, e.getMessage(), e);
            ExceptionHandler.handle(new CoreException(status), getShell(), title, message);
            return false;
        }
        return false;

    }

    private String checkForSpaces(String curr) {
        if (curr.indexOf(' ') == -1) {
            return curr;
        }
        StringBuffer buf = new StringBuffer();
        buf.append('\'');
        for (int i = 0; i < curr.length(); i++) {
            char ch = curr.charAt(i);
            if (ch == '\\' || ch == '\'') {
                buf.append('\\');
            }
            buf.append(ch);
        }
        buf.append('\'');
        return buf.toString();
    }

    /*
     * @see IWizard#addPages()
     */
    public void addPages() {

        fJTWPage = new JavadocTreeWizardPage(TREE_PAGE_DESC, fStore);
        fJSWPage = new JavadocSpecificsWizardPage(SPECIFICS_PAGE_DESC, fJTWPage, fStore);
        fJSpWPage = new JavadocStandardWizardPage(STANDARD_PAGE_DESC, fJTWPage, fStore);

        super.addPage(fJTWPage);
        super.addPage(fJSpWPage);
        super.addPage(fJSWPage);

        fJTWPage.init();
        fJSpWPage.init();
        fJSWPage.init();

    }

    public void init(IWorkbench workbench, IStructuredSelection structuredSelection) {
        IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
        List selected = Collections.EMPTY_LIST;
        if (window != null) {
            ISelection selection = window.getSelectionService().getSelection();
            if (selection instanceof IStructuredSelection) {
                selected = ((IStructuredSelection) selection).toList();
            } else {
                IJavaScriptElement element = EditorUtility.getActiveEditorJavaInput();
                if (element != null) {
                    selected = new ArrayList();
                    selected.add(element);
                }
            }
        }
        fStore = new JavadocOptionsManager(fXmlJavadocFile, getDialogSettings(), selected);
    }

    private void refresh(IPath path) {
        if (fRoot.findContainersForLocation(path).length > 0) {
            try {
                fRoot.refreshLocal(IResource.DEPTH_INFINITE, null);
            } catch (CoreException e) {
                JavaScriptPlugin.log(e);
            }
        }
    }

    private void spawnInBrowser(Display display) {
        if (fOpenInBrowser) {
            try {
                IPath indexFile = fDestination.append("index.html"); //$NON-NLS-1$
                URL url = indexFile.toFile().toURL();
                OpenBrowserUtil.open(url, display, getWindowTitle());
            } catch (MalformedURLException e) {
                JavaScriptPlugin.log(e);
            }
        }
    }

    private class JavadocDebugEventListener implements IDebugEventSetListener {
        private Display fDisplay;
        private File fFile;

        public JavadocDebugEventListener(Display display, File file) {
            fDisplay = display;
            fFile = file;
        }

        public void handleDebugEvents(DebugEvent[] events) {
            for (int i = 0; i < events.length; i++) {
                if (events[i].getKind() == DebugEvent.TERMINATE) {
                    try {
                        if (!fWriteCustom) {
                            fFile.delete();
                            refresh(fDestination); //If destination of javadoc is in workspace then refresh workspace
                            spawnInBrowser(fDisplay);
                        }
                    } finally {
                        DebugPlugin.getDefault().removeDebugEventListener(this);
                    }
                    return;
                }
            }
        }
    }

    public IWizardPage getNextPage(IWizardPage page) {
        if (page instanceof JavadocTreeWizardPage) {
            if (!fJTWPage.getCustom()) {
                return fJSpWPage;
            }
            return fJSWPage;
        } else if (page instanceof JavadocSpecificsWizardPage) {
            return null;
        } else if (page instanceof JavadocStandardWizardPage)
            return fJSWPage;
        else
            return null;
    }

    public IWizardPage getPreviousPage(IWizardPage page) {
        if (page instanceof JavadocSpecificsWizardPage) {
            if (!fJTWPage.getCustom()) {
                return fJSpWPage;
            }
            return fJSWPage;
        } else if (page instanceof JavadocTreeWizardPage) {
            return null;
        } else if (page instanceof JavadocStandardWizardPage)
            return fJTWPage;
        else
            return null;
    }

}