edu.uci.lighthouse.core.preferences.DatabasePreferences.java Source code

Java tutorial

Introduction

Here is the source code for edu.uci.lighthouse.core.preferences.DatabasePreferences.java

Source

/*******************************************************************************
 * Copyright (c) {2009,2011} {Software Design and Collaboration Laboratory (SDCL)
 *            , University of California, Irvine}.
 * 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:
 *    {Software Design and Collaboration Laboratory (SDCL)
 *   , University of California, Irvine} 
 *         - initial API and implementation and/or initial documentation
 *******************************************************************************/
package edu.uci.lighthouse.core.preferences;

import java.sql.SQLException;
import java.util.Properties;
import java.util.TimeZone;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.swt.SWT;
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.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;

import edu.uci.lighthouse.core.Activator;
import edu.uci.lighthouse.model.jpa.JPAUtility;
import edu.uci.lighthouse.model.util.DatabaseUtility;

public class DatabasePreferences extends PreferencePage implements IWorkbenchPreferencePage {

    private Text dbHost;
    private Text dbUsername;
    private Text dbPassword;
    private Text dbDatabase;
    private Text dbPort;

    private Button chkTunnel;

    private Text sshHost;
    private Text sshUser;
    private Text sshPassword;
    private Text sshPort;

    public static final String ROOT = "edu.uci.lighthouse.core.preferences.db";

    public static final String DB_HOST = ROOT + ".dbHost";
    public static final String DB_USERNAME = ROOT + ".dbUsername";
    public static final String DB_PASSWD = ROOT + ".dbPassword";
    public static final String DB_DATABASE = ROOT + ".dbDatabase";
    public static final String DB_PORT = ROOT + ".dbPort";

    public static final String USES_TUNNEL = ROOT + ".sshTunnel";

    public static final String SSH_HOST = ROOT + ".sshHost";
    public static final String SSH_USERNAME = ROOT + ".sshUser";
    public static final String SSH_PASSWD = ROOT + ".sshPassword";
    public static final String SSH_PORT = ROOT + ".sshPort";

    private static final String SOCKET_TIMEOUT = "5000";

    private static TimeZone serverTimezone;

    private PreferencesNotifier notifier = PreferencesNotifier.getInstance();

    @Override
    public void init(IWorkbench workbench) {
        IPreferenceStore store = Activator.getDefault().getPreferenceStore();
        setPreferenceStore(store);
        setDescription("Enter MySQL connection details below:");
    }

    @Override
    protected Control createContents(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayout(new GridLayout());

        Composite dbComposite = getDBComposite(composite);
        dbComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        chkTunnel = new Button(composite, SWT.CHECK);
        chkTunnel.setText("Connect using SSH tunnel");
        chkTunnel.setEnabled(false);

        Composite sshComposite = getSSHComposite(composite);
        sshComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        performLoad();

        return composite;
    }

    @Override
    protected void performApply() {
        // Need to store the preferences before testing connect.
        //      super.performApply();

        try {
            //         SSHTunnel tunnel = null;
            //         if (isConnectingUsingSSH()) {
            //            tunnel = new SSHTunnel(getAllSettings());
            //            tunnel.setLocalPort(12346);
            //            tunnel.start(null);
            //         }
            JPAUtility.canConnect(getLocalDatabaseSettings());
            //         if (tunnel != null) {
            //            tunnel.stop(null);
            //         }
            MessageDialog.openInformation(getShell(), "Database Connection", "The connection is working properly!");
        } catch (Exception e) {
            MessageDialog.openError(getShell(), "Database Connection", e.getMessage());
        }
    }

    @Override
    public boolean performOk() {
        try {
            IPreferenceStore store = Activator.getDefault().getPreferenceStore();
            store.setValue(DB_HOST, dbHost.getText());
            store.setValue(DB_USERNAME, dbUsername.getText());
            store.setValue(DB_PASSWD, dbPassword.getText());
            store.setValue(DB_DATABASE, dbDatabase.getText());
            store.setValue(DB_PORT, dbPort.getText());

            store.setValue(USES_TUNNEL, chkTunnel.getSelection());

            store.setValue(SSH_HOST, sshHost.getText());
            store.setValue(SSH_USERNAME, sshUser.getText());
            store.setValue(SSH_PASSWD, sshPassword.getText());
            store.setValue(SSH_PORT, sshPort.getText());

            serverTimezone = null;

            notifier.fireDbSettingsChanged();

        } catch (Exception e) {
            System.out.println(e);
        }
        return super.performOk();
    }

    protected void performLoad() {
        IPreferenceStore store = Activator.getDefault().getPreferenceStore();

        dbHost.setText(store.getString(DB_HOST));
        dbUsername.setText(store.getString(DB_USERNAME));
        dbPassword.setText(store.getString(DB_PASSWD));
        dbDatabase.setText(store.getString(DB_DATABASE));
        dbPort.setText(store.getString(DB_PORT));

        chkTunnel.setSelection(store.getBoolean(USES_TUNNEL));

        sshHost.setText(store.getString(SSH_HOST));
        sshUser.setText(store.getString(SSH_USERNAME));
        sshPassword.setText(store.getString(SSH_PASSWD));
        sshPort.setText(store.getString(SSH_PORT));
    }

    @Override
    protected void performDefaults() {

        dbHost.setText("localhost");
        dbUsername.setText("lighthouse");
        dbPassword.setText("lighthouse");
        dbDatabase.setText("lighthouse");
        dbPort.setText("3306");

        chkTunnel.setSelection(false);

        sshHost.setText("");
        sshUser.setText("");
        sshPassword.setText("");
        sshPort.setText("");

        super.performDefaults();
    }

    private Composite getDBComposite(Composite parent) {
        Group group = new Group(parent, SWT.NONE);
        group.setLayout(new GridLayout(2, false));
        group.setText("Database Settings");

        Label label;

        label = new Label(group, SWT.NONE);
        label.setText("Host:");
        dbHost = new Text(group, SWT.SINGLE | SWT.BORDER);
        dbHost.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        label = new Label(group, SWT.NONE);
        label.setText("Username:");
        dbUsername = new Text(group, SWT.SINGLE | SWT.BORDER);
        dbUsername.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        label = new Label(group, SWT.NONE);
        label.setText("Password:");
        dbPassword = new Text(group, SWT.SINGLE | SWT.BORDER | SWT.PASSWORD);
        dbPassword.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        label = new Label(group, SWT.NONE);
        label.setText("Database:");
        dbDatabase = new Text(group, SWT.SINGLE | SWT.BORDER);
        dbDatabase.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        label = new Label(group, SWT.NONE);
        label.setText("Port:");
        dbPort = new Text(group, SWT.SINGLE | SWT.BORDER);
        dbPort.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        return group;
    }

    private Composite getSSHComposite(Composite parent) {
        Group group = new Group(parent, SWT.NONE);
        group.setLayout(new GridLayout(2, false));
        group.setText("SSH Tunnel Settings");

        Label label;

        label = new Label(group, SWT.NONE);
        label.setText("Host:");
        label.setEnabled(false);
        sshHost = new Text(group, SWT.SINGLE | SWT.BORDER);
        sshHost.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        sshHost.setEnabled(false);

        label = new Label(group, SWT.NONE);
        label.setText("Username:");
        label.setEnabled(false);
        sshUser = new Text(group, SWT.SINGLE | SWT.BORDER);
        sshUser.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        sshUser.setEnabled(false);

        label = new Label(group, SWT.NONE);
        label.setText("Password:");
        label.setEnabled(false);
        sshPassword = new Text(group, SWT.SINGLE | SWT.BORDER | SWT.PASSWORD);
        sshPassword.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        sshPassword.setEnabled(false);

        label = new Label(group, SWT.NONE);
        label.setText("Port:");
        label.setEnabled(false);
        sshPort = new Text(group, SWT.SINGLE | SWT.BORDER);
        sshPort.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        sshPort.setEnabled(false);

        return group;
    }

    public Properties getLocalDatabaseSettings() {
        Properties dbSettings = new Properties();
        IPreferenceStore store = Activator.getDefault().getPreferenceStore();

        String connUrl = "jdbc:mysql://" + dbHost.getText() + ":" + dbPort.getText() + "/" + dbDatabase.getText();
        dbSettings.setProperty("hibernate.connection.url", connUrl);
        dbSettings.setProperty("hibernate.connection.username", dbUsername.getText());
        dbSettings.setProperty("hibernate.connection.password", dbPassword.getText());
        dbSettings.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");

        return dbSettings;
    }

    public static Properties getDatabaseSettings() {
        Properties dbSettings = new Properties();
        IPreferenceStore store = Activator.getDefault().getPreferenceStore();

        String connUrl = "jdbc:mysql://" + store.getString(DB_HOST) + ":" + store.getString(DB_PORT) + "/"
                + store.getString(DB_DATABASE) + "?autoReconnect=true&socketTimeout=" + SOCKET_TIMEOUT;
        dbSettings.setProperty("hibernate.connection.url", connUrl);
        dbSettings.setProperty("hibernate.connection.username", store.getString(DB_USERNAME));
        dbSettings.setProperty("hibernate.connection.password", store.getString(DB_PASSWD));
        dbSettings.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");

        return dbSettings;
    }

    public static Properties getAllSettings() {
        IPreferenceStore store = Activator.getDefault().getPreferenceStore();
        Properties settings = new Properties();
        settings.setProperty(DB_HOST, store.getString(DB_HOST));
        settings.setProperty(DB_PORT, store.getString(DB_PORT));
        settings.setProperty(DB_DATABASE, store.getString(DB_DATABASE));
        settings.setProperty(DB_USERNAME, store.getString(DB_USERNAME));
        settings.setProperty(DB_PASSWD, store.getString(DB_PASSWD));
        settings.putAll(getSSHTunnelSettings());
        return settings;
    }

    public static Properties getSSHTunnelSettings() {
        Properties sshTunnelSettings = new Properties();
        IPreferenceStore store = Activator.getDefault().getPreferenceStore();

        sshTunnelSettings.setProperty(SSH_HOST, store.getString(SSH_HOST));
        sshTunnelSettings.setProperty(SSH_USERNAME, store.getString(SSH_USERNAME));
        sshTunnelSettings.setProperty(SSH_PASSWD, store.getString(SSH_PASSWD));
        sshTunnelSettings.setProperty(SSH_PORT, store.getString(SSH_PORT));

        return sshTunnelSettings;
    }

    public static boolean isConnectingUsingSSH() {
        IPreferenceStore store = Activator.getDefault().getPreferenceStore();
        return store.getBoolean(USES_TUNNEL);
    }

    public static TimeZone getServerTimezone() throws SQLException {
        if (serverTimezone == null) {
            serverTimezone = DatabaseUtility.getServerTimezone(getDatabaseSettings());
        }
        return serverTimezone;
    }

    public static void clear() {
        IPreferenceStore store = Activator.getDefault().getPreferenceStore();

        store.setValue(DB_HOST, "");
        store.setValue(DB_USERNAME, "");
        store.setValue(DB_PASSWD, "");
        store.setValue(DB_DATABASE, "");
        store.setValue(DB_PORT, "");

        store.setValue(USES_TUNNEL, "");

        store.setValue(SSH_HOST, "");
        store.setValue(SSH_USERNAME, "");
        store.setValue(SSH_PASSWD, "");
        store.setValue(SSH_PORT, "");

        serverTimezone = null;
    }
}