eu.esdihumboldt.hale.io.jdbc.ui.JDBCComponents.java Source code

Java tutorial

Introduction

Here is the source code for eu.esdihumboldt.hale.io.jdbc.ui.JDBCComponents.java

Source

/*
 * Copyright (c) 2015 Data Harmonisation Panel
 * 
 * All rights reserved. This program and the accompanying materials are made
 * available under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3 of the License,
 * or (at your option) any later version.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this distribution. If not, see <http://www.gnu.org/licenses/>.
 * 
 * Contributors:
 *     Data Harmonisation Panel <http://www.dhpanel.eu>
 */

package eu.esdihumboldt.hale.io.jdbc.ui;

import java.net.URI;
import java.sql.Driver;
import java.sql.DriverManager;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import javax.annotation.Nullable;

import org.eclipse.jface.dialogs.DialogPage;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;

import eu.esdihumboldt.hale.io.jdbc.extension.DriverConfiguration;
import eu.esdihumboldt.hale.io.jdbc.extension.DriverConfigurationExtension;
import eu.esdihumboldt.util.Pair;

/**
 * Utilities for JDBC UI components.
 * 
 * @author Simon Templer
 */
public class JDBCComponents {

    /**
     * Create a component for selecting a JDBC driver.
     * 
     * @param parent the parent composite
     * @return the combo viewer for selecting the driver
     */
    public static ComboViewer createDriverSelector(Composite parent) {
        ComboViewer driver = new ComboViewer(parent, SWT.BORDER | SWT.READ_ONLY);
        driver.setContentProvider(ArrayContentProvider.getInstance());
        driver.setLabelProvider(new LabelProvider() {

            @Override
            public String getText(Object element) {
                if (element instanceof Pair<?, ?>) {
                    @SuppressWarnings("unchecked")
                    Pair<DriverConfiguration, Driver> driverInfo = (Pair<DriverConfiguration, Driver>) element;
                    return driverInfo.getFirst().getName();
                }
                return super.getText(element);
            }

        });

        // driver input
        List<Pair<DriverConfiguration, Driver>> drivers = new ArrayList<>();
        for (DriverConfiguration dc : DriverConfigurationExtension.getInstance().getElements()) {

            // determine associated driver
            Driver jdbcDriver = null;
            Enumeration<Driver> enDrivers = DriverManager.getDrivers();
            while (enDrivers.hasMoreElements()) {
                Driver candidate = enDrivers.nextElement();
                if (dc.matchesDriver(candidate)) {
                    jdbcDriver = candidate;
                    break;
                }
            }

            //         if (driver != null) {
            // XXX ignore if the driver is null, seems to work nonetheless
            drivers.add(new Pair<>(dc, jdbcDriver));
            //         }
        }
        driver.setInput(drivers);
        if (!drivers.isEmpty()) {
            // by default select a driver if possible
            driver.setSelection(new StructuredSelection(drivers.get(0)));
        }

        return driver;
    }

    /**
     * Build a JDBC URI from UI components
     * 
     * @param page the dialog page
     * @param driver the driver selector
     * @param host the host field
     * @param database the database field
     * @return the JDBC URI or <code>null</code>
     */
    @Nullable
    public static URI buildURI(DialogPage page, ComboViewer driver, Text host, Text database) {
        page.setErrorMessage(null);
        if (driver != null) {
            ISelection sel = driver.getSelection();
            if (!sel.isEmpty() && sel instanceof IStructuredSelection) {
                @SuppressWarnings({ "unchecked" })
                Pair<DriverConfiguration, Driver> driverInfo = (Pair<DriverConfiguration, Driver>) ((IStructuredSelection) sel)
                        .getFirstElement();
                try {
                    URI uri = driverInfo.getFirst().getURIBuilder().createJdbcUri(host.getText(),
                            database.getText());
                    if (driverInfo.getSecond() == null || driverInfo.getSecond().acceptsURL(uri.toString())) {
                        return uri;
                    }
                } catch (Exception e) {
                    page.setErrorMessage(e.getLocalizedMessage());
                }
            }

            page.setMessage(null);
        } else {
            page.setMessage("Please select a JDBC database driver", DialogPage.INFORMATION);
        }

        return null;
    }

}