org.eclipse.jubula.client.ui.wizards.pages.DatabaseConnectionWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jubula.client.ui.wizards.pages.DatabaseConnectionWizardPage.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2010 BREDEX GmbH.
 * 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:
 *     BREDEX GmbH - initial API and implementation and/or initial documentation
 *******************************************************************************/
package org.eclipse.jubula.client.ui.wizards.pages;

import org.apache.commons.lang.StringUtils;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.beans.BeansObservables;
import org.eclipse.core.databinding.beans.PojoObservables;
import org.eclipse.core.databinding.conversion.IConverter;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.validation.IValidator;
import org.eclipse.core.databinding.validation.ValidationStatus;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.databinding.viewers.ViewersObservables;
import org.eclipse.jface.databinding.wizard.WizardPageSupport;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.jubula.client.core.persistence.DatabaseConnectionInfo;
import org.eclipse.jubula.client.core.preferences.database.AbstractHostBasedConnectionInfo;
import org.eclipse.jubula.client.core.preferences.database.DatabaseConnection;
import org.eclipse.jubula.client.core.preferences.database.H2ConnectionInfo;
import org.eclipse.jubula.client.core.preferences.database.MySQLConnectionInfo;
import org.eclipse.jubula.client.core.preferences.database.OracleConnectionInfo;
import org.eclipse.jubula.client.core.preferences.database.PostGreSQLConnectionInfo;
import org.eclipse.jubula.client.ui.constants.ContextHelpIds;
import org.eclipse.jubula.client.ui.databinding.SimpleIntegerToStringConverter;
import org.eclipse.jubula.client.ui.databinding.SimpleStringToIntegerConverter;
import org.eclipse.jubula.client.ui.databinding.validators.StringToPortValidator;
import org.eclipse.jubula.client.ui.utils.DialogUtils;
import org.eclipse.jubula.client.ui.widgets.UIComponentHelper;
import org.eclipse.jubula.tools.internal.i18n.I18n;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;

/**
 * This wizard page consists of the following for configuring a database 
 * connection:<ul>
 * <li>a general area for configuring the name and type</li>
 * <li>a detail area for configuring specific properties (the contents of 
 *     which depend on the selected type)</li>
 * <li>a concatenated connection URL display area that summarizes the 
 *     information provided in the other areas</li>
 * </ul>
 * @author BREDEX GmbH
 * @created May 19, 2010
 */
public class DatabaseConnectionWizardPage extends WizardPage {

    /**
     * Responsible for creating the detail area.
     * 
     * @author BREDEX GmbH
     */
    private static interface IDetailAreaBuilder {

        /**
         * Creates a detail area for the given parameters.
         * 
         * @param parent The parent that will contain the detail area.
         * @param dbc The data binding context for the detail area.
         */
        public void createDetailArea(Composite parent, DataBindingContext dbc);

        /**
         * 
         * @return a String-representation of the receiver that can be shown 
         *         to the user. 
         */
        public String getTypeName();

        /**
         * Attempts to initialize the receiver with the given parameter. If the
         * provided information is not valid for the receiver, then this method
         * will do nothing.
         * 
         * @param sourceInfo The info to use for initialization.
         */
        public void initializeInfo(DatabaseConnectionInfo sourceInfo);

        /**
         * 
         * @return the connection info managed by the receiver.
         */
        public DatabaseConnectionInfo getConnectionInfo();
    }

    /**
     * Creates detail area for, and manages, an {@link H2ConnectionInfo}.
     * 
     * @author BREDEX GmbH
     */
    private static final class H2DetailBuilder implements IDetailAreaBuilder {

        /** the managed connection info */
        private H2ConnectionInfo m_connInfo = new H2ConnectionInfo();

        /**
         * 
         * {@inheritDoc}
         */
        public void initializeInfo(DatabaseConnectionInfo sourceInfo) {
            if (sourceInfo instanceof H2ConnectionInfo) {
                m_connInfo = (H2ConnectionInfo) sourceInfo;
            }
        }

        /**
         * 
         * {@inheritDoc}
         */
        public void createDetailArea(Composite parent, DataBindingContext dbc) {

            UIComponentHelper.createLabel(parent, I18n.getString("DatabaseConnection.H2.Location"), SWT.NONE); //$NON-NLS-1$
            final Text locationText = createDetailText(parent);
            DialogUtils.setWidgetName(locationText, "H2.Location"); //$NON-NLS-1$
            dbc.bindValue(SWTObservables.observeText(locationText, SWT.Modify),
                    PojoObservables.observeValue(m_connInfo, H2ConnectionInfo.PROP_NAME_LOCATION));
        }

        /**
         * 
         * {@inheritDoc}
         */
        public String getTypeName() {
            return "H2"; //$NON-NLS-1$
        }

        /**
         * 
         * {@inheritDoc}
         */
        public DatabaseConnectionInfo getConnectionInfo() {
            return m_connInfo;
        }

    }

    /**
     * Creates detail area for, and manages, an {@link OracleConnectionInfo}.
     * 
     * @author BREDEX GmbH
     */
    private static final class OracleDetailBuilder implements IDetailAreaBuilder {

        /** the managed connection info */
        private OracleConnectionInfo m_connInfo = new OracleConnectionInfo();

        /**
         * 
         * {@inheritDoc}
         */
        public void createDetailArea(Composite parent, DataBindingContext dbc) {

            UIComponentHelper.createLabel(parent, I18n.getString("DatabaseConnection.HostBased.Hostname"), //$NON-NLS-1$
                    SWT.NONE);
            final Text hostnameText = createDetailText(parent);
            DialogUtils.setWidgetName(hostnameText, "Oracle.Hostname"); //$NON-NLS-1$
            dbc.bindValue(SWTObservables.observeText(hostnameText, SWT.Modify),
                    BeansObservables.observeValue(m_connInfo, AbstractHostBasedConnectionInfo.PROP_NAME_HOSTNAME));

            UIComponentHelper.createLabel(parent, I18n.getString("DatabaseConnection.HostBased.Port"), SWT.NONE); //$NON-NLS-1$
            final Text portText = createDetailText(parent);
            DialogUtils.setWidgetName(portText, "Oracle.Port"); //$NON-NLS-1$
            UpdateValueStrategy portTargetToModelUpdateStrategy = new UpdateValueStrategy();
            portTargetToModelUpdateStrategy.setConverter(new SimpleStringToIntegerConverter()).setAfterGetValidator(
                    new StringToPortValidator(I18n.getString("DatabaseConnection.HostBased.Port"))); //$NON-NLS-1$
            dbc.bindValue(SWTObservables.observeText(portText, SWT.Modify),
                    BeansObservables.observeValue(m_connInfo, AbstractHostBasedConnectionInfo.PROP_NAME_PORT),
                    portTargetToModelUpdateStrategy,
                    new UpdateValueStrategy().setConverter(new SimpleIntegerToStringConverter()));

            UIComponentHelper.createLabel(parent, I18n.getString("DatabaseConnection.Oracle.SID"), SWT.NONE); //$NON-NLS-1$
            final Text schemaText = createDetailText(parent);
            DialogUtils.setWidgetName(schemaText, "Oracle.SID"); //$NON-NLS-1$
            dbc.bindValue(SWTObservables.observeText(schemaText, SWT.Modify),
                    BeansObservables.observeValue(m_connInfo, AbstractHostBasedConnectionInfo.PROP_NAME_DB_NAME));
        }

        /**
         * 
         * {@inheritDoc}
         */
        public String getTypeName() {
            return "Oracle"; //$NON-NLS-1$
        }

        /**
         * 
         * {@inheritDoc}
         */
        public void initializeInfo(DatabaseConnectionInfo sourceInfo) {
            if (sourceInfo instanceof OracleConnectionInfo) {
                m_connInfo = (OracleConnectionInfo) sourceInfo;
            }
        }

        /**
         * 
         * {@inheritDoc}
         */
        public DatabaseConnectionInfo getConnectionInfo() {
            return m_connInfo;
        }

    }

    /**
     * Creates detail area for, and manages, a {@link PostGreSQLConnectionInfo}.
     * 
     * @author BREDEX GmbH
     */
    private static final class PostGreSQLDetailBuilder implements IDetailAreaBuilder {

        /** the managed connection info */
        private PostGreSQLConnectionInfo m_connInfo = new PostGreSQLConnectionInfo();

        /**
         * 
         * {@inheritDoc}
         */
        public void createDetailArea(Composite parent, DataBindingContext dbc) {

            UIComponentHelper.createLabel(parent, I18n.getString("DatabaseConnection.HostBased.Hostname"), //$NON-NLS-1$
                    SWT.NONE);
            final Text hostnameText = createDetailText(parent);
            DialogUtils.setWidgetName(hostnameText, "PostGreSQL.Hostname"); //$NON-NLS-1$
            dbc.bindValue(SWTObservables.observeText(hostnameText, SWT.Modify),
                    BeansObservables.observeValue(m_connInfo, AbstractHostBasedConnectionInfo.PROP_NAME_HOSTNAME));

            UIComponentHelper.createLabel(parent, I18n.getString("DatabaseConnection.HostBased.Port"), SWT.NONE); //$NON-NLS-1$
            final Text portText = createDetailText(parent);
            DialogUtils.setWidgetName(portText, "PostGreSQL.Port"); //$NON-NLS-1$
            UpdateValueStrategy portTargetToModelUpdateStrategy = new UpdateValueStrategy();
            portTargetToModelUpdateStrategy.setConverter(new SimpleStringToIntegerConverter()).setAfterGetValidator(
                    new StringToPortValidator(I18n.getString("DatabaseConnection.HostBased.Port"))); //$NON-NLS-1$
            dbc.bindValue(SWTObservables.observeText(portText, SWT.Modify),
                    BeansObservables.observeValue(m_connInfo, AbstractHostBasedConnectionInfo.PROP_NAME_PORT),
                    portTargetToModelUpdateStrategy,
                    new UpdateValueStrategy().setConverter(new SimpleIntegerToStringConverter()));

            UIComponentHelper.createLabel(parent, I18n.getString("DatabaseConnection.PostGreSQL.Database"), //$NON-NLS-1$
                    SWT.NONE);
            final Text schemaText = createDetailText(parent);
            DialogUtils.setWidgetName(schemaText, "PostGreSQL.Database"); //$NON-NLS-1$
            dbc.bindValue(SWTObservables.observeText(schemaText, SWT.Modify),
                    BeansObservables.observeValue(m_connInfo, AbstractHostBasedConnectionInfo.PROP_NAME_DB_NAME));
        }

        /**
         * 
         * {@inheritDoc}
         */
        public String getTypeName() {
            return "(unsupported) PostGreSQL"; //$NON-NLS-1$
        }

        /**
         * 
         * {@inheritDoc}
         */
        public void initializeInfo(DatabaseConnectionInfo sourceInfo) {
            if (sourceInfo instanceof PostGreSQLConnectionInfo) {
                m_connInfo = (PostGreSQLConnectionInfo) sourceInfo;
            }
        }

        /**
         * 
         * {@inheritDoc}
         */
        public DatabaseConnectionInfo getConnectionInfo() {
            return m_connInfo;
        }

    }

    /**
     * Creates detail area for, and manages, a {@link PostGreSQLConnectionInfo}.
     * 
     * @author BREDEX GmbH
     */
    private static final class MySQLDetailBuilder implements IDetailAreaBuilder {

        /** the managed connection info */
        private MySQLConnectionInfo m_connInfo = new MySQLConnectionInfo();

        /**
         * 
         * {@inheritDoc}
         */
        public void createDetailArea(Composite parent, DataBindingContext dbc) {

            UIComponentHelper.createLabel(parent, I18n.getString("DatabaseConnection.HostBased.Hostname"), //$NON-NLS-1$
                    SWT.NONE);
            final Text hostnameText = createDetailText(parent);
            DialogUtils.setWidgetName(hostnameText, "MySQL.Hostname"); //$NON-NLS-1$
            dbc.bindValue(SWTObservables.observeText(hostnameText, SWT.Modify),
                    BeansObservables.observeValue(m_connInfo, AbstractHostBasedConnectionInfo.PROP_NAME_HOSTNAME));

            UIComponentHelper.createLabel(parent, I18n.getString("DatabaseConnection.HostBased.Port"), SWT.NONE); //$NON-NLS-1$
            final Text portText = createDetailText(parent);
            DialogUtils.setWidgetName(portText, "MySQL.Port"); //$NON-NLS-1$
            UpdateValueStrategy portTargetToModelUpdateStrategy = new UpdateValueStrategy();
            portTargetToModelUpdateStrategy.setConverter(new SimpleStringToIntegerConverter()).setAfterGetValidator(
                    new StringToPortValidator(I18n.getString("DatabaseConnection.HostBased.Port"))); //$NON-NLS-1$
            dbc.bindValue(SWTObservables.observeText(portText, SWT.Modify),
                    BeansObservables.observeValue(m_connInfo, AbstractHostBasedConnectionInfo.PROP_NAME_PORT),
                    portTargetToModelUpdateStrategy,
                    new UpdateValueStrategy().setConverter(new SimpleIntegerToStringConverter()));

            UIComponentHelper.createLabel(parent, I18n.getString("DatabaseConnection.MySQL.Database"), SWT.NONE); //$NON-NLS-1$
            final Text schemaText = createDetailText(parent);
            DialogUtils.setWidgetName(schemaText, "MySQL.Database"); //$NON-NLS-1$
            dbc.bindValue(SWTObservables.observeText(schemaText, SWT.Modify),
                    BeansObservables.observeValue(m_connInfo, AbstractHostBasedConnectionInfo.PROP_NAME_DB_NAME));
        }

        /**
         * 
         * {@inheritDoc}
         */
        public String getTypeName() {
            return "(unsupported) MySQL"; //$NON-NLS-1$
        }

        /**
         * 
         * {@inheritDoc}
         */
        public void initializeInfo(DatabaseConnectionInfo sourceInfo) {
            if (sourceInfo instanceof MySQLConnectionInfo) {
                m_connInfo = (MySQLConnectionInfo) sourceInfo;
            }
        }

        /**
         * 
         * {@inheritDoc}
         */
        public DatabaseConnectionInfo getConnectionInfo() {
            return m_connInfo;
        }

    }

    /** all available detail area builders */
    private IDetailAreaBuilder[] m_detailAreaBuilders = new IDetailAreaBuilder[] { new H2DetailBuilder(),
            new OracleDetailBuilder(), new PostGreSQLDetailBuilder(), new MySQLDetailBuilder() };

    /** the connection to edit within this page */
    private DatabaseConnection m_connectionToEdit;

    /**
     * Constructor
     * 
     * @param pageName The name of the page.
     */
    public DatabaseConnectionWizardPage(String pageName) {
        super(pageName);
    }

    /**
     * Constructor
     * 
     * @param pageName The name of the page.
     * @param connectionToEdit The object that will be modified based on the
     *                         data entered on this page.
     */
    public DatabaseConnectionWizardPage(String pageName, DatabaseConnection connectionToEdit) {

        super(pageName);
        m_connectionToEdit = connectionToEdit;
        for (IDetailAreaBuilder builder : m_detailAreaBuilders) {
            builder.initializeInfo(m_connectionToEdit.getConnectionInfo());
        }
    }

    /**
     * 
     * {@inheritDoc}
     */
    public void createControl(Composite parent) {
        setTitle(I18n.getString("DatabaseConnectionWizardPage.title")); //$NON-NLS-1$
        setDescription(I18n.getString("DatabaseConnectionWizardPage.description")); //$NON-NLS-1$
        final DataBindingContext dbc = new DataBindingContext();
        WizardPageSupport.create(this, dbc);
        GridDataFactory textGridDataFactory = GridDataFactory.fillDefaults().grab(true, false);
        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayout(GridLayoutFactory.fillDefaults().numColumns(2).create());
        setControl(composite);

        UIComponentHelper.createLabel(composite, I18n.getString("DatabaseConnection.Name"), SWT.NONE); //$NON-NLS-1$
        Text nameText = new Text(composite, SWT.BORDER);
        DialogUtils.setWidgetName(nameText, "DatabaseConnection.Name"); //$NON-NLS-1$
        nameText.setLayoutData(textGridDataFactory.create());
        dbc.bindValue(SWTObservables.observeText(nameText, SWT.Modify),
                BeansObservables.observeValue(m_connectionToEdit, DatabaseConnection.PROP_NAME_NAME),
                new UpdateValueStrategy().setAfterGetValidator(new IValidator() {
                    public IStatus validate(Object value) {
                        if (StringUtils.isEmpty((String) value)) {
                            return ValidationStatus
                                    .error(I18n.getString("DatabaseConnectionWizardPage.Error.emptyName")); //$NON-NLS-1$
                        }
                        return ValidationStatus.ok();
                    }
                }), new UpdateValueStrategy());
        nameText.setFocus();
        nameText.selectAll();

        UIComponentHelper.createLabel(composite, I18n.getString("DatabaseConnection.Type"), SWT.NONE); //$NON-NLS-1$
        ComboViewer typeComboViewer = new ComboViewer(composite);
        DialogUtils.setWidgetName(typeComboViewer.getControl(), "DatabaseConnection.Type"); //$NON-NLS-1$
        typeComboViewer.setContentProvider(new ArrayContentProvider());
        typeComboViewer.setLabelProvider(new LabelProvider() {
            @Override
            public String getText(Object element) {
                return ((IDetailAreaBuilder) element).getTypeName();
            }
        });
        typeComboViewer.setInput(m_detailAreaBuilders);
        typeComboViewer.getControl().setLayoutData(textGridDataFactory.create());

        final Composite detailArea = createDetailArea(composite, nameText.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
        DialogUtils.setWidgetName(detailArea, "DatabaseConnection.DetailArea"); //$NON-NLS-1$

        IObservableValue connectionInfoObservable = BeansObservables.observeValue(m_connectionToEdit,
                DatabaseConnection.PROP_NAME_CONN_INFO);

        bindComboViewer(dbc, typeComboViewer, detailArea, connectionInfoObservable);

        Text url = new Text(composite, SWT.BORDER);
        DialogUtils.setWidgetName(url, "DatabaseConnection.URL"); //$NON-NLS-1$
        url.setEditable(false);
        url.setBackground(composite.getBackground());
        url.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).span(2, 1).create());
        dbc.bindValue(SWTObservables.observeText(url), BeansObservables.observeDetailValue(connectionInfoObservable,
                DatabaseConnectionInfo.PROP_NAME_CONN_URL, null));

        PlatformUI.getWorkbench().getHelpSystem().setHelp(composite,
                ContextHelpIds.DATABASE_CONNECTION_CONFIGURATION_DIALOG);
    }

    /**
     * {@inheritDoc}
     */
    public void performHelp() {
        PlatformUI.getWorkbench().getHelpSystem()
                .displayHelp(ContextHelpIds.DATABASE_CONNECTION_CONFIGURATION_DIALOG);
    }

    /**
     * 
     * @param dbc The data binding context.
     * @param typeComboViewer The combo viewer.
     * @param detailArea The detail area.
     * @param connectionInfoObservable The connection info observable.
     */
    private void bindComboViewer(final DataBindingContext dbc, ComboViewer typeComboViewer,
            final Composite detailArea, IObservableValue connectionInfoObservable) {
        dbc.bindValue(ViewersObservables.observeSingleSelection(typeComboViewer), connectionInfoObservable,
                new UpdateValueStrategy().setConverter(new IConverter() {
                    public Object getToType() {
                        return DatabaseConnectionInfo.class;
                    }

                    public Object getFromType() {
                        return IDetailAreaBuilder.class;
                    }

                    public Object convert(Object fromObject) {
                        for (Control child : detailArea.getChildren()) {
                            child.dispose();
                        }
                        IDetailAreaBuilder fromBuilder = (IDetailAreaBuilder) fromObject;
                        fromBuilder.createDetailArea(detailArea, dbc);
                        detailArea.layout();
                        ((Composite) getControl()).layout();
                        return fromBuilder.getConnectionInfo();
                    }
                }), new UpdateValueStrategy().setConverter(new IConverter() {

                    public Object getToType() {
                        return IDetailAreaBuilder.class;
                    }

                    public Object getFromType() {
                        return DatabaseConnectionInfo.class;
                    }

                    public Object convert(Object fromObject) {
                        DatabaseConnectionInfo fromInfo = (DatabaseConnectionInfo) fromObject;
                        for (IDetailAreaBuilder builder : m_detailAreaBuilders) {
                            if (builder.getConnectionInfo() == fromInfo) {
                                for (Control child : detailArea.getChildren()) {
                                    child.dispose();
                                }

                                builder.createDetailArea(detailArea, dbc);

                                detailArea.layout();
                                ((Composite) getControl()).layout();
                                return builder;
                            }
                        }

                        return null;
                    }
                }));
    }

    /**
     * Creates and returns a text field with 
     * {@link org.eclipse.swt.layout.GridData} suitable for
     * sharing a row in a {@link org.eclipse.swt.layout.GridLayout} with a label.
     * 
     * @param parent The parent for the created text field.
     * @return the created text field.
     */
    private static Text createDetailText(Composite parent) {
        final Text detailText = new Text(parent, SWT.BORDER);
        GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.CENTER).applyTo(detailText);
        return detailText;
    }

    /**
     * Creates and returns a Composite for containing detailed Database 
     * Connection information.
     * 
     * @param parent The parent of the detail area.
     * @param fieldHeight The height of a text field. Used for layout.
     * @return the created detail area.
     */
    private static Composite createDetailArea(Composite parent, int fieldHeight) {
        final GridLayout detailAreaLayout = new GridLayout(2, false);
        final Group detailArea = new Group(parent, SWT.NONE);
        final int numberOfDetailFields = 3;
        final int totalFieldHeight = fieldHeight * numberOfDetailFields;
        final int totalVerticalSpacing = detailAreaLayout.verticalSpacing * (numberOfDetailFields - 1);
        final int totalMarginHeight = (detailAreaLayout.marginHeight * 2) + detailAreaLayout.marginBottom
                + detailAreaLayout.marginTop;
        final int detailAreaVerticalHint = totalFieldHeight + totalVerticalSpacing + totalMarginHeight;

        detailArea.setText(I18n.getString("DatabaseConnectionWizardPage.DetailArea.title")); //$NON-NLS-1$
        detailArea.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).span(2, 1)
                .hint(SWT.DEFAULT, detailAreaVerticalHint).create());
        detailArea.setLayout(detailAreaLayout);

        return detailArea;
    }

}