org.hibernate.eclipse.codegen.ExportAntCodeGenWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for org.hibernate.eclipse.codegen.ExportAntCodeGenWizardPage.java

Source

/*******************************************************************************
 * Copyright (c) 2010 Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is 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
 *
 * Contributor:
 *     Red Hat, Inc. - initial API and implementation
 ******************************************************************************/
package org.hibernate.eclipse.codegen;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;

import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.ComboDialogField;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
import org.eclipse.ui.ide.undo.CreateFileOperation;
import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
import org.hibernate.console.ConsoleConfiguration;
import org.hibernate.console.KnownConfigurations;
import org.hibernate.console.preferences.ConsoleConfigurationPreferences;
import org.hibernate.eclipse.console.HibernateConsoleMessages;
import org.hibernate.eclipse.console.utils.LaunchHelper;
import org.hibernate.eclipse.launch.CodeGenXMLFactory;
import org.hibernate.eclipse.launch.ExporterAttributes;

/**
 * @author Vitali Yemialyanchyk
 */
@SuppressWarnings("restriction")
public class ExportAntCodeGenWizardPage extends WizardNewFileCreationPage implements Listener {

    protected ComboDialogField consoleConfigurationName;

    protected CodeGenXMLFactory codeGenXMLFactory = null;

    /**
     * Creates a new file creation (Ant code generation) wizard page. If the initial resource
     * selection contains exactly one container resource then it will be used as the default
     * container resource.
     * 
     * @param pageName
     *            the name of the page
     * @param selection
     *            the current resource selection
     */
    public ExportAntCodeGenWizardPage(String pageName, IStructuredSelection selection) {
        super(pageName, selection);
        setPageComplete(false);
    }

    /**
     * @see #setControl(Control)
     */
    protected void setControl(Control newControl) {
        newControl.setLayoutData(new GridData(
                GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
        super.setControl(newControl);
    }

    /**
     * @see #createControl(Composite)
     */
    public void createControl(Composite parent) {
        initializeDialogUnits(parent);
        Composite topLevel = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.numColumns = 1;
        layout.marginWidth = 0;
        topLevel.setLayout(layout);
        topLevel.setLayoutData(new GridData(
                GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
        topLevel.setFont(parent.getFont());
        setControlCombo(topLevel);
        super.createControl(topLevel);
        setControl(topLevel);
    }

    protected void setControlCombo(Control newControl) {
        consoleConfigurationName = new ComboDialogField(SWT.READ_ONLY);
        consoleConfigurationName.setLabelText(
                HibernateConsoleMessages.ExportAntCodeGenWizardPage_hibernate_code_generation_configurations);
        ILaunchConfiguration[] launchCfgs;
        try {
            launchCfgs = LaunchHelper.findFilteredCodeGenerationConfigsSorted();
        } catch (CoreException e) {
            launchCfgs = new ILaunchConfiguration[0];
        }
        String[] names = new String[launchCfgs.length];
        for (int i = 0; i < launchCfgs.length; i++) {
            ILaunchConfiguration launchCfg = launchCfgs[i];
            names[i] = launchCfg.getName();
        }
        consoleConfigurationName.setItems(names);
        IDialogFieldListener fieldlistener = new IDialogFieldListener() {
            public void dialogFieldChanged(DialogField field) {
                setPageComplete(validatePage());
            }
        };
        consoleConfigurationName.setDialogFieldListener(fieldlistener);
        consoleConfigurationName.doFillIntoGrid((Composite) newControl, 2);
    }

    /**
     * @see #validatePage()
     */
    protected boolean validatePage() {
        boolean res = super.validatePage();
        if (res) {
            if (consoleConfigurationName.getSelectionIndex() == -1) {
                setErrorMessage(
                        HibernateConsoleMessages.ExportAntCodeGenWizardPage_empty_hibernate_code_generation_configuration);
                res = false;
            } else {
                ILaunchConfiguration lc = getSelectedLaunchConfig();
                if (lc == null) {
                    setErrorMessage(
                            HibernateConsoleMessages.ExportAntCodeGenWizardPage_cannot_find_selected_hibernate_code_generation_configuration);
                    res = false;
                } else {
                    String checkMessage = checkCodeGenLaunchConfig(lc);
                    if (checkMessage != null) {
                        setMessage(checkMessage, IMessageProvider.WARNING);
                    }
                }
            }
        }
        return res;
    }

    protected ConsoleConfigurationPreferences getConsoleConfigPreferences(String consoleConfigName) {
        ConsoleConfiguration consoleConfig = KnownConfigurations.getInstance().find(consoleConfigName);
        if (consoleConfig == null) {
            return null;
        }
        return consoleConfig.getPreferences();
    }

    protected String checkCodeGenLaunchConfig(ILaunchConfiguration lc) {
        String checkMessage = null;
        ExporterAttributes attributes = null;
        try {
            attributes = new ExporterAttributes(lc);
            checkMessage = attributes.checkExporterAttributes();
        } catch (CoreException e) {
            checkMessage = e.getMessage();
        }
        if (checkMessage != null) {
            checkMessage = NLS.bind(
                    HibernateConsoleMessages.ExportAntCodeGenWizardPage_error_in_hibernate_code_generation_configuration,
                    checkMessage);
        }
        if (checkMessage == null && attributes != null) {
            String consoleConfigName = attributes.getConsoleConfigurationName();
            ConsoleConfigurationPreferences consoleConfigPrefs = getConsoleConfigPreferences(consoleConfigName);
            String connProfileName = consoleConfigPrefs == null ? null
                    : consoleConfigPrefs.getConnectionProfileName();
            if (!CodeGenXMLFactory.isEmpty(connProfileName)) {
                IWorkspace workspace = ResourcesPlugin.getWorkspace();
                String externalPropFileName = CodeGenXMLFactory.propFileNameSuffix;
                externalPropFileName = getFileName() + "." + externalPropFileName; //$NON-NLS-1$
                String problemMessage = NLS.bind(HibernateConsoleMessages.ExportAntCodeGenWizardPage_warning,
                        externalPropFileName);
                IPath resourcePath = getContainerFullPath().append(externalPropFileName);
                if (workspace.getRoot().getFile(resourcePath).exists()) {
                    checkMessage = problemMessage;
                }
            }
        }
        return checkMessage;
    }

    public ILaunchConfiguration getSelectedLaunchConfig() {
        ILaunchConfiguration[] launchCfgs;
        try {
            launchCfgs = LaunchHelper.findFilteredCodeGenerationConfigsSorted();
        } catch (CoreException e) {
            launchCfgs = new ILaunchConfiguration[0];
        }
        int n = consoleConfigurationName.getSelectionIndex();
        if (0 <= n && n < launchCfgs.length) {
            return launchCfgs[n];
        }
        return null;
    }

    protected InputStream getInitialContents() {
        ILaunchConfiguration lc = getSelectedLaunchConfig();
        if (lc == null) {
            return null;
        }
        codeGenXMLFactory = new CodeGenXMLFactory(lc);
        String externalPropFileName = CodeGenXMLFactory.getExternalPropFileNameStandard(getFileName());
        codeGenXMLFactory.setExternalPropFileName(externalPropFileName);
        codeGenXMLFactory.setPlace2Generate(getContainerFullPath().toString());
        IWorkspace workspace = ResourcesPlugin.getWorkspace();
        if (workspace != null && workspace.getRoot() != null && workspace.getRoot().getLocation() != null) {
            codeGenXMLFactory.setWorkspacePath(workspace.getRoot().getLocation().toString());
        }
        String buildXml = codeGenXMLFactory.createCodeGenXML();
        return new ByteArrayInputStream(buildXml.getBytes());
    }

    public IFile createNewFile() {
        codeGenXMLFactory = null;
        IFile res = super.createNewFile();
        if (codeGenXMLFactory != null && res != null) {
            final String propFileContentPreSave = codeGenXMLFactory.getPropFileContentPreSave();
            if (!CodeGenXMLFactory.isEmpty(propFileContentPreSave)) {
                IPath path = res.getFullPath();
                path = path.removeLastSegments(1);
                path = path.append(codeGenXMLFactory.getExternalPropFileName());
                final IFile newFileHandle = createFileHandle(path);
                final InputStream initialContents = new ByteArrayInputStream(propFileContentPreSave.getBytes());
                IRunnableWithProgress op = new IRunnableWithProgress() {
                    public void run(IProgressMonitor monitor) {
                        CreateFileOperation op = new CreateFileOperation(newFileHandle, null, initialContents,
                                IDEWorkbenchMessages.WizardNewFileCreationPage_title);
                        try {
                            // see bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=219901
                            // directly execute the operation so that the undo state is
                            // not preserved. Making this undoable resulted in too many
                            // accidental file deletions.
                            op.execute(monitor, WorkspaceUndoUtil.getUIInfoAdapter(getShell()));
                        } catch (final ExecutionException e) {
                            getContainer().getShell().getDisplay().syncExec(new Runnable() {
                                public void run() {
                                    if (e.getCause() instanceof CoreException) {
                                        ErrorDialog.openError(getContainer().getShell(), // Was
                                                // Utilities.getFocusShell()
                                                IDEWorkbenchMessages.WizardNewFileCreationPage_errorTitle, null, // no special
                                                // message
                                                ((CoreException) e.getCause()).getStatus());
                                    } else {
                                        IDEWorkbenchPlugin.log(getClass(), "createNewFile()", e.getCause()); //$NON-NLS-1$
                                        MessageDialog.openError(getContainer().getShell(),
                                                IDEWorkbenchMessages.WizardNewFileCreationPage_internalErrorTitle,
                                                NLS.bind(
                                                        IDEWorkbenchMessages.WizardNewFileCreationPage_internalErrorMessage,
                                                        e.getCause().getMessage()));
                                    }
                                }
                            });
                        }
                    }
                };
                try {
                    getContainer().run(true, true, op);
                } catch (InterruptedException e) {
                } catch (InvocationTargetException e) {
                    // Execution Exceptions are handled above but we may still get
                    // unexpected runtime errors.
                    IDEWorkbenchPlugin.log(getClass(), "createNewFile()", e.getTargetException()); //$NON-NLS-1$
                    MessageDialog.open(MessageDialog.ERROR, getContainer().getShell(),
                            IDEWorkbenchMessages.WizardNewFileCreationPage_internalErrorTitle,
                            NLS.bind(IDEWorkbenchMessages.WizardNewFileCreationPage_internalErrorMessage,
                                    e.getTargetException().getMessage()),
                            SWT.SHEET);

                }
            }
        }
        return res;
    }
}