org.eclipse.jpt.jaxb.ui.internal.ClassesGeneratorUi.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jpt.jaxb.ui.internal.ClassesGeneratorUi.java

Source

/*******************************************************************************
 * Copyright (c) 2010, 2013 Oracle. 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:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.jaxb.ui.internal;

import java.util.List;
import java.util.Vector;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.emf.common.util.URI;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.jpt.common.ui.internal.WorkbenchTools;
import org.eclipse.jpt.common.ui.internal.dialogs.OptionalMessageDialog;
import org.eclipse.jpt.jaxb.core.JaxbProject;
import org.eclipse.jpt.jaxb.core.JaxbProjectManager;
import org.eclipse.jpt.jaxb.core.JaxbWorkspace;
import org.eclipse.jpt.jaxb.core.SchemaLibrary;
import org.eclipse.jpt.jaxb.core.internal.gen.ClassesGeneratorExtensionOptions;
import org.eclipse.jpt.jaxb.core.internal.gen.ClassesGeneratorOptions;
import org.eclipse.jpt.jaxb.core.xsd.XsdUtil;
import org.eclipse.jpt.jaxb.ui.JaxbWorkbench;
import org.eclipse.jpt.jaxb.ui.JptJaxbUiMessages;
import org.eclipse.jpt.jaxb.ui.internal.gen.GenerateJaxbClassesJob;
import org.eclipse.jpt.jaxb.ui.internal.plugin.JptJaxbUiPlugin;
import org.eclipse.jpt.jaxb.ui.internal.wizards.classesgen.ClassesGeneratorWizard;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.wst.xsd.contentmodel.internal.XSDImpl;
import org.eclipse.xsd.XSDSchema;

/**
 *  ClassesGeneratorUi
 */
public class ClassesGeneratorUi {

    private final IJavaProject javaProject;
    private final IFile xsdFile;

    // ********** static methods **********

    public static void generate(IFile xsdFile) {
        IJavaProject javaProject = JavaCore.create(xsdFile.getProject());
        if (javaProject == null) {
            throw new NullPointerException();
        }

        new ClassesGeneratorUi(javaProject, xsdFile).generate();
    }

    // ********** constructors **********
    private ClassesGeneratorUi(IJavaProject javaProject, IFile xsdFile) {
        super();
        if (javaProject == null) {
            throw new NullPointerException();
        }
        this.javaProject = javaProject;
        this.xsdFile = xsdFile;
    }

    // ********** generate **********
    /**
     * prompt the user with a wizard
     */
    protected void generate() {
        ClassesGeneratorWizard wizard = new ClassesGeneratorWizard(this.javaProject, this.xsdFile);
        wizard.setWindowTitle(JptJaxbUiMessages.CLASSES_GENERATOR_WIZARD_TITLE);
        WizardDialog dialog = new WizardDialog(this.getCurrentShell(), wizard);
        dialog.create();
        int returnCode = dialog.open();
        if (returnCode != Window.OK) {
            return;
        }

        if (this.displayOverwritingClassesWarning(wizard.getGeneratorOptions())) {
            this.generateJaxbClasses(wizard.getLocalSchemaUri(), wizard.getDestinationFolder(),
                    wizard.getTargetPackage(), wizard.getCatalog(), wizard.usesMoxy(),
                    wizard.getBindingsFileNames(), wizard.getGeneratorOptions(),
                    wizard.getGeneratorExtensionOptions());
            addSchemaToLibrary(wizard.getSchemaLocation());
        }
    }

    // ********** internal methods **********

    private void generateJaxbClasses(URI schemaUri, String outputDir, String targetPackage, String catalog,
            boolean usesMoxyGenerator, String[] bindingsFileNames, ClassesGeneratorOptions generatorOptions,
            ClassesGeneratorExtensionOptions generatorExtensionOptions) {

        try {
            WorkspaceJob job = new GenerateJaxbClassesJob(this.javaProject, schemaUri.toString(), outputDir,
                    targetPackage, catalog, usesMoxyGenerator, bindingsFileNames, generatorOptions,
                    generatorExtensionOptions);
            job.schedule();
        } catch (RuntimeException re) {
            JptJaxbUiPlugin.instance().logError(re);

            String msg = re.getMessage();
            String message = (msg == null) ? re.toString() : msg;
            this.logError(message);
        }
    }

    private void addSchemaToLibrary(String schemaLocation) {
        JaxbProject jaxbProject = getJaxbProject();

        if (jaxbProject == null) {
            return;
        }

        String resolvedUri = XsdUtil.getResolvedUri(schemaLocation);
        XSDSchema schema = XSDImpl.buildXSDModel(resolvedUri);
        if (schema != null) {
            SchemaLibrary schemaLib = jaxbProject.getSchemaLibrary();
            List<String> schemas = new Vector<String>(schemaLib.getSchemaLocations());
            if (!schemas.contains(schemaLocation)) {
                schemas.add(schemaLocation);
                schemaLib.setSchemaLocations(schemas);
            }
        }
    }

    private void logError(String message) {
        this.displayError(message);
    }

    private void displayError(String message) {
        MessageDialog.openError(this.getShell(), JptJaxbUiMessages.CLASSES_GENERATOR_WIZARD_ERROR_DIALOG_TITLE,
                message);
    }

    private Shell getShell() {
        Display display = Display.getCurrent();
        Shell shell = (display == null) ? null : display.getActiveShell();
        if (shell == null && display != null) {
            Shell[] shells = display.getShells();
            if (shells.length > 0)
                shell = shells[0];
        }
        return shell;
    }

    /* may be null */
    private JaxbProject getJaxbProject() {
        JaxbProjectManager jaxbProjectManager = this.getJaxbProjectManager();
        return (jaxbProjectManager == null) ? null
                : jaxbProjectManager.getJaxbProject(this.javaProject.getProject());
    }

    private JaxbProjectManager getJaxbProjectManager() {
        JaxbWorkspace jaxbWorkspace = this.getJaxbWorkspace();
        return (jaxbWorkspace == null) ? null : jaxbWorkspace.getJaxbProjectManager();
    }

    private JaxbWorkspace getJaxbWorkspace() {
        JaxbWorkbench jaxbWorkbench = this.getJaxbWorkbench();
        return (jaxbWorkbench == null) ? null : jaxbWorkbench.getJaxbWorkspace();
    }

    private JaxbWorkbench getJaxbWorkbench() {
        return WorkbenchTools.getAdapter(JaxbWorkbench.class);
    }

    private boolean isOverwritingClasses(ClassesGeneratorOptions generatorOptions) {
        if (generatorOptions == null) {
            throw new NullPointerException();
        }
        if (generatorOptions.showsVersion() || generatorOptions.showsHelp()) {
            return false;
        }
        return true;
    }

    private boolean displayOverwritingClassesWarning(ClassesGeneratorOptions generatorOptions) {

        if (!this.isOverwritingClasses(generatorOptions)
                || !OptionalMessageDialog.isDialogEnabled(OverwriteConfirmerDialog.ID)) {
            return true;
        } else {
            OverwriteConfirmerDialog dialog = new OverwriteConfirmerDialog(this.getShell());
            return dialog.open() == IDialogConstants.YES_ID;
        }
    }

    private Shell getCurrentShell() {
        return Display.getCurrent().getActiveShell();
    }

    // ********** overwrite dialog **********

    static class OverwriteConfirmerDialog extends OptionalMessageDialog {

        private static final String ID = "dontShowOverwriteJaxbClassesFromSchemas.warning"; //$NON-NLS-1$

        OverwriteConfirmerDialog(Shell parent) {
            super(ID, parent, JptJaxbUiMessages.CLASSES_GENERATOR_UI_GENERATING_CLASSES_WARNING_TITLE,
                    JptJaxbUiMessages.CLASSES_GENERATOR_UI_GENERATING_CLASSES_WARNING_MESSAGE,
                    MessageDialog.WARNING, new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL },
                    1);
        }

        @Override
        protected void createButtonsForButtonBar(Composite parent) {
            this.createButton(parent, IDialogConstants.YES_ID, IDialogConstants.YES_LABEL, false);
            this.createButton(parent, IDialogConstants.NO_ID, IDialogConstants.NO_LABEL, true);
        }

    }

}