org.jboss.tools.hibernate.jpt.ui.wizard.GenerateInitWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.hibernate.jpt.ui.wizard.GenerateInitWizardPage.java

Source

/*******************************************************************************
  * Copyright (c) 2008-2009 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.jboss.tools.hibernate.jpt.ui.wizard;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.eclipse.core.runtime.IPath;
import org.eclipse.datatools.connectivity.IConnectionProfile;
import org.eclipse.datatools.connectivity.ProfileManager;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.core.PackageFragmentRoot;
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.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringButtonDialogField;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.jpt.jpa.core.JpaProject;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.hibernate.console.ConnectionProfileUtil;
import org.hibernate.console.ConsoleConfiguration;
import org.hibernate.console.KnownConfigurations;
import org.hibernate.console.preferences.ConsoleConfigurationPreferences;
import org.hibernate.console.preferences.ConsoleConfigurationPreferences.ConfigurationMode;
import org.hibernate.eclipse.console.EclipseConsoleConfigurationPreferences;
import org.hibernate.eclipse.console.HibernateConsoleMessages;
import org.hibernate.eclipse.console.utils.DialogSelectionHelper;
import org.hibernate.eclipse.console.utils.DriverClassHelpers;
import org.hibernate.eclipse.console.utils.LaunchHelper;
import org.hibernate.eclipse.launch.PathHelper;
import org.hibernate.util.xpl.StringHelper;
import org.jboss.tools.hibernate.jpt.core.internal.HibernateJpaProject;
import org.jboss.tools.hibernate.jpt.ui.HibernateJptUIPlugin;
import org.jboss.tools.hibernate.runtime.spi.ServiceLookup;

/**
 * @author Dmitry Geraskov
 *
 */
public abstract class GenerateInitWizardPage extends WizardPage {

    private static final String AUTODETECT = Messages.GenerateInitWizardPage_autodetect;

    private DriverClassHelpers helper = new DriverClassHelpers();

    private StringButtonDialogField outputdir;

    private ComboDialogField hibernateVersion;

    private ComboDialogField connectionProfileName;

    private StringButtonDialogField schemaName;

    private ComboDialogField consoleConfigurationName;

    private ComboDialogField dialectName;

    private Button useConsoleConfiguration;

    private Group dbGroup;

    private HibernateJpaProject jpaProject;

    protected int numColumns = 3;

    protected IDialogFieldListener fieldlistener = new IDialogFieldListener() {
        public void dialogFieldChanged(DialogField field) {
            dialogChanged();
        }
    };

    public GenerateInitWizardPage(HibernateJpaProject jpaProject) {
        super("", Messages.GenerateInitWizardPage_title, null); //$NON-NLS-1$
        this.jpaProject = jpaProject;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
     */
    public void createControl(Composite parent) {
        Composite container = new Composite(parent, SWT.NULL);
        GridLayout layout = new GridLayout();

        container.setLayout(layout);
        layout.numColumns = numColumns;
        layout.verticalSpacing = 10;

        outputdir = new StringButtonDialogField(new IStringButtonAdapter() {
            public void changeControlPressed(DialogField field) {
                IPath[] paths = DialogSelectionHelper.chooseFolderEntries(getShell(),
                        PathHelper.pathOrNull(outputdir.getText()),
                        HibernateConsoleMessages.CodeGenerationSettingsTab_select_output_dir,
                        HibernateConsoleMessages.CodeGenerationSettingsTab_choose_dir_for_generated_files, false);
                if (paths != null && paths.length == 1) {
                    outputdir.setText(((paths[0]).toOSString()));
                }
            }
        });
        outputdir.setText(getDefaultOutput());
        outputdir.setDialogFieldListener(fieldlistener);
        outputdir.setLabelText(HibernateConsoleMessages.CodeGenerationSettingsTab_output_dir);
        outputdir.setButtonLabel(HibernateConsoleMessages.CodeGenerationSettingsTab_browse);

        Control[] controls = outputdir.doFillIntoGrid(container, numColumns);
        // Hack to tell the text field to stretch!
        ((GridData) controls[1].getLayoutData()).grabExcessHorizontalSpace = true;
        setPageComplete(!StringHelper.isEmpty(getOutputDir()));

        createChildControls(container);

        useConsoleConfiguration = new Button(container, SWT.CHECK);
        useConsoleConfiguration.setText(Messages.GenerateInitWizardPage_use_console_configuration);
        useConsoleConfiguration.setSelection(true);
        useConsoleConfiguration.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(SelectionEvent e) {
                widgetSelected(e);
            }

            public void widgetSelected(SelectionEvent e) {
                consoleConfigurationName.setEnabled(useConsoleConfiguration.getSelection());
                hibernateVersion.setEnabled(!useConsoleConfiguration.getSelection());
                connectionProfileName.setEnabled(!useConsoleConfiguration.getSelection());
                schemaName.setEnabled(!useConsoleConfiguration.getSelection());
                dialectName.setEnabled(!useConsoleConfiguration.getSelection());
                dialogChanged();
            }
        });
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalSpan = numColumns;
        useConsoleConfiguration.setLayoutData(gd);

        consoleConfigurationName = new ComboDialogField(SWT.READ_ONLY);
        consoleConfigurationName
                .setLabelText(HibernateConsoleMessages.CodeGenerationSettingsTab_console_configuration);
        ConsoleConfiguration[] cfg = LaunchHelper.findFilteredSortedConsoleConfigs();
        String[] names = new String[cfg.length];
        for (int i = 0; i < cfg.length; i++) {
            ConsoleConfiguration configuration = cfg[i];
            names[i] = configuration.getName();
        }
        consoleConfigurationName.setItems(names);
        consoleConfigurationName.setText(jpaProject.getDefaultConsoleConfigurationName());
        consoleConfigurationName.setDialogFieldListener(fieldlistener);
        consoleConfigurationName.doFillIntoGrid(container, numColumns);

        hibernateVersion = new ComboDialogField(SWT.READ_ONLY);
        hibernateVersion.setLabelText(HibernateConsoleMessages.ConsoleConfigurationMainTab_0);
        hibernateVersion.setItems(ServiceLookup.getVersions());
        hibernateVersion.selectItem(0);
        hibernateVersion.setDialogFieldListener(fieldlistener);
        hibernateVersion.doFillIntoGrid(container, numColumns);
        hibernateVersion.setEnabled(false);

        createDBGroup(container, numColumns);

        setControl(container);
        if (StringHelper.isEmpty(consoleConfigurationName.getText())) {
            setPageComplete(false);
        }
    }

    /**
     * @param parent
     */
    protected abstract void createChildControls(Composite parent);

    /**
     * @param container
     * @param colCount
     */
    private void createDBGroup(Composite container, int numColumns) {
        dbGroup = new Group(container, SWT.FILL);
        dbGroup.setLayout(new FillLayout());
        GridLayout layout = new GridLayout();
        dbGroup.setLayout(layout);
        layout.numColumns = numColumns;
        layout.verticalSpacing = 10;

        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalSpan = numColumns;
        dbGroup.setLayoutData(gd);
        dbGroup.setText(Messages.GenerateInitWizardPage_databaseSettings);

        //****************************connection profile*****************
        connectionProfileName = new ComboDialogField(SWT.READ_ONLY);
        connectionProfileName.setLabelText(Messages.GenerateInitWizardPage_databaseSettings_connection);

        connectionProfileName.setItems(dtpConnectionProfileNames());

        String connectionName = getProjectConnectionProfileName();
        if (!isEmpty(connectionName)) {
            connectionProfileName.selectItem(connectionName);
        }
        connectionProfileName.doFillIntoGrid(dbGroup, numColumns);
        connectionProfileName.setDialogFieldListener(fieldlistener);
        connectionProfileName.setEnabled(!useConsoleConfiguration.getSelection());
        //****************************dialect*****************
        dialectName = new ComboDialogField(SWT.NONE);
        dialectName.setLabelText(HibernateConsoleMessages.NewConfigurationWizardPage_database_dialect);
        dialectName.setItems(getDialectNames());
        dialectName.selectItem(0);
        dialectName.doFillIntoGrid(dbGroup, numColumns);
        dialectName.setEnabled(false);
        dialectName.setDialogFieldListener(fieldlistener);
        //****************************schema*****************
        schemaName = new StringButtonDialogField(new IStringButtonAdapter() {
            public void changeControlPressed(DialogField field) {
                // TODO Auto-generated method stub

            }
        });
        schemaName.setLabelText(Messages.GenerateInitWizardPage_databaseShema);
        schemaName.setButtonLabel(Messages.GenerateInitWizardPage_refresh);
        Control[] controls = schemaName.doFillIntoGrid(dbGroup, numColumns);
        // Hack to tell the text field to stretch!
        ((GridData) controls[1].getLayoutData()).grabExcessHorizontalSpace = true;
        schemaName.setEnabled(!useConsoleConfiguration.getSelection());
    }

    protected boolean isUseConsoleConfiguration() {
        return useConsoleConfiguration.getSelection();
    }

    protected String getHibernateVersion() {
        return hibernateVersion.getText();
    }

    protected void dialogChanged() {

        String msg = PathHelper.checkDirectory(getOutputDir(),
                HibernateConsoleMessages.CodeGenerationSettingsTab_output_directory, false);

        if (msg != null) {
            setErrorMessage(msg);
            setPageComplete(false);
            return;
        }

        if (useConsoleConfiguration.getSelection() && (StringHelper.isEmpty(getConfigurationName()))) {
            setPageComplete(false);
            setErrorMessage(Messages.GenerateInitWizardPage_err_msg_select_console_configuration);
            return;
        }
        if (!useConsoleConfiguration.getSelection() && (StringHelper.isEmpty(getConnectionProfileName()))) {
            setPageComplete(false);
            setErrorMessage(Messages.GenerateInitWizardPage_err_msg_select_connection_profile);
            return;
        }

        setPageComplete(true);
    }

    public String getOutputDir() {
        return outputdir.getText();
    }

    private String[] dtpConnectionProfileNames() {
        List<String> list = new ArrayList<String>();

        IConnectionProfile[] cps = ProfileManager.getInstance().getProfiles();
        for (int i = 0; i < cps.length; i++) {
            list.add(cps[i].getName());
        }
        Collections.sort(list);
        return list.toArray(new String[list.size()]);
    }

    private String getProjectConnectionProfileName() {
        return jpaProject.getDataSource().getConnectionProfileName();
    }

    public String getConfigurationName() {
        if (useConsoleConfiguration.getSelection())
            return consoleConfigurationName.getText();
        return createConsoleConfiguration();
    }

    public String getConnectionProfileName() {
        return connectionProfileName.getText();
    }

    private String createConsoleConfiguration() {
        ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
        String dialect = determineDialect();
        String ccName = launchManager
                .generateLaunchConfigurationName(HibernateConsoleMessages.AddConfigurationAction_hibernate);
        ConsoleConfigurationPreferences prefs = new EclipseConsoleConfigurationPreferences(ccName,
                ConfigurationMode.JPA, getHibernateVersion(), jpaProject.getName(), true, null, null, null,
                new IPath[0], new IPath[0], null, null, getConnectionProfileName(), dialect);

        ConsoleConfiguration cc = new ConsoleConfiguration(prefs);
        KnownConfigurations.getInstance().addConfiguration(cc, false);

        return ccName;
    }

    public boolean isTemporaryConfiguration() {
        return !useConsoleConfiguration.getSelection();
    }

    public JpaProject getJpaProject() {
        return jpaProject;
    }

    public void setWarningMessage(String warning) {
        setMessage(warning, WARNING);
    }

    protected String getDefaultOutput() {
        try {
            if (getJpaProject() == null)
                return ""; //$NON-NLS-1$
            if (getJpaProject().getJavaProject() == null)
                return ""; //$NON-NLS-1$
            if (!getJpaProject().getJavaProject().exists())
                return ""; //$NON-NLS-1$
            IPackageFragmentRoot[] roots = getJpaProject().getJavaProject().getPackageFragmentRoots();
            for (int i = 0; i < roots.length; i++) {
                IPackageFragmentRoot root = roots[i];
                if (root.getClass() == PackageFragmentRoot.class) {
                    if (root.exists())
                        return root.getResource().getFullPath().toOSString();
                }
            }
            return getJpaProject().getJavaProject().getResource().getFullPath().toOSString();
        } catch (JavaModelException e) {
            HibernateJptUIPlugin.logException(e);
            return ""; //$NON-NLS-1$
        }
    }

    private String[] getDialectNames() {
        String[] dialectNames1 = helper.getDialectNames();
        String[] dialectNames2 = new String[dialectNames1.length + 1];
        dialectNames2[0] = AUTODETECT;
        System.arraycopy(dialectNames1, 0, dialectNames2, 1, dialectNames1.length);
        return dialectNames2;
    }

    private String determineDialect() {
        if (!AUTODETECT.equals(dialectName.getText())) {
            return helper.getDialectClass(dialectName.getText());
        }
        if (!useConsoleConfiguration.getSelection()) {
            String driver = ConnectionProfileUtil.getDriverClass(getConnectionProfileName());
            return helper.getDialect(driver);
        }
        return null;
    }

    private boolean isEmpty(String str) {
        return (str == null || str.trim().length() == 0);
    }
}