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

Java tutorial

Introduction

Here is the source code for eu.esdihumboldt.hale.io.jdbc.ui.SchemasRetrievalPage.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.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;

import de.fhg.igd.slf4jplus.ALogger;
import de.fhg.igd.slf4jplus.ALoggerFactory;
import eu.esdihumboldt.hale.common.core.io.ImportProvider;
import eu.esdihumboldt.hale.common.core.io.Value;
import eu.esdihumboldt.hale.io.jdbc.JDBCConnection;
import eu.esdihumboldt.hale.io.jdbc.JDBCConstants;
import eu.esdihumboldt.hale.io.jdbc.extension.DriverConfiguration;
import eu.esdihumboldt.hale.io.jdbc.extension.DriverConfigurationExtension;
import eu.esdihumboldt.hale.io.jdbc.extension.SchemaSelector;
import eu.esdihumboldt.hale.ui.io.IOWizard;
import eu.esdihumboldt.hale.ui.io.config.AbstractConfigurationPage;

/**
 * This retrieves all the schemas from the database
 * 
 * @author Sameer Sheikh, Arun Varma
 */
public class SchemasRetrievalPage extends AbstractConfigurationPage<ImportProvider, IOWizard<ImportProvider>>
        implements JDBCConstants {

    private static final ALogger log = ALoggerFactory.getLogger(SchemasRetrievalPage.class);

    private CheckboxTableViewer schemaTable;
    private final List<String> schemas = new ArrayList<String>();

    //   private Composite innerPage;
    private Composite page;

    private boolean isEnable = false;
    private boolean multipleSelection = true;
    private SchemaSelector customSelector = null;
    private DriverConfiguration config = null;
    private Button selectAll = null;

    /**
     * 
     */
    public SchemasRetrievalPage() {
        super("schemaRetrieval", "Schemas Retrieval", null);
        setDescription("Please select one or multiple schemas.");
    }

    /**
     * @see eu.esdihumboldt.hale.ui.io.config.AbstractConfigurationPage#enable()
     */
    @Override
    public void enable() {
        // Do nothing

    }

    /**
     * @see eu.esdihumboldt.hale.ui.io.config.AbstractConfigurationPage#disable()
     */
    @Override
    public void disable() {
        // Do nothing

    }

    /**
     * @see eu.esdihumboldt.hale.ui.io.IOWizardPage#updateConfiguration(eu.esdihumboldt.hale.common.core.io.IOProvider)
     */
    @Override
    public boolean updateConfiguration(ImportProvider provider) {
        if (isEnable) {
            Object[] values = schemaTable.getCheckedElements();
            StringBuilder selSchemas = new StringBuilder();
            if (values.length > 0) {
                for (int i = 0; i < values.length; i++) {
                    selSchemas.append("," + (String) values[i]);
                }
                provider.setParameter(SCHEMAS, Value.of(selSchemas));
                return true;
            }
            return false;
        }
        return true;
    }

    /**
     * @see eu.esdihumboldt.hale.ui.HaleWizardPage#createContent(org.eclipse.swt.widgets.Composite)
     */
    @Override
    protected void createContent(Composite page) {
        page.setLayout(GridLayoutFactory.swtDefaults().numColumns(1).create());
        this.page = page;
        // For oracle, by default no schema is selected, so need to set
        // pageComplete false when it created..
        setPageComplete(false);
    }

    /**
     * @see eu.esdihumboldt.hale.ui.HaleWizardPage#onShowPage(boolean)
     */
    @Override
    protected void onShowPage(boolean firstShow) {

        // load configuration
        loadConfiguration();

        // if page is enable for driver
        if (!isEnable) {
            disposeControl();
            // message
            Label label = new Label(page, SWT.WRAP);
            label.setText("Restricting the tables to load from specific database schemas, is not "
                    + "supported for this database driver. All database tables will be loaded.");
            label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
            page.layout(true, true);
            setMessage("");
            setPageComplete(true);
            return;
        }

        Connection conn = null;
        try {
            conn = getConnection();
        } catch (SQLException e) {
            // Exception occurred in database connection
            // So remove all controls and showing an error with exception
            log.error(e.getMessage(), e);
            disposeControl();
            Label label = new Label(page, SWT.WRAP);
            label.setText("Could not establish connection with database: " + e.getMessage());
            label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
            page.layout(true, true);
            setErrorMessage("Connection error!");
            setPageComplete(false);
            return;
        }

        setErrorMessage(null);
        if (firstShow) {
            // when first time loaded
            createComponent();
        } else {
            // When user come to page again
            disposeControl();
            schemas.clear();
            createComponent();
        }
        try {
            // Get schemas using selected database driver
            getSchemas(conn);
            schemaTable.setInput(schemas);

            if (multipleSelection) {
                // if multiple Selection is enabled for driver then by default
                // select all.
                schemaTable.setAllChecked(true);
                selectAll.setSelection(true);
                setPageComplete(true);
                setMessage("Please select one or multiple schemas.");
            } else {
                setMessage("Please select one schema.");
            }
        } catch (SQLException e) {
            log.error(e.getMessage(), e);
        }
    }

    private void createComponent() {
        if (multipleSelection) {
            selectAll = new Button(page, SWT.CHECK);
            selectAll.setText("Select all");
            selectAll.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));

            selectAll.addSelectionListener(new SelectionAdapter() {

                @Override
                public void widgetSelected(SelectionEvent e) {
                    schemaTable.setAllChecked(((Button) e.getSource()).getSelection());
                }
            });
            schemaTable = CheckboxTableViewer.newCheckList(page,
                    SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);

        } else
            schemaTable = CheckboxTableViewer.newCheckList(page,
                    SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);

        schemaTable.setLabelProvider(new LabelProvider() {

            @Override
            public String getText(Object element) {
                return element.toString();
            }

        });
        schemaTable.setContentProvider(ArrayContentProvider.getInstance());
        GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1);
        layoutData.widthHint = SWT.DEFAULT;
        layoutData.heightHint = 8 * schemaTable.getTable().getItemHeight();
        schemaTable.getControl().setLayoutData(layoutData);

        schemaTable.addCheckStateListener(new ICheckStateListener() {

            @Override
            public void checkStateChanged(CheckStateChangedEvent event) {
                if (event.getChecked() && (!multipleSelection)) {
                    schemaTable.setAllChecked(false);
                    schemaTable.setCheckedElements(new Object[] { event.getElement() });
                }
                setPageComplete(validate());
            }
        });

        setPageComplete(false);
        page.layout(true, true);
    }

    private void getSchemas(Connection conn) throws SQLException {
        try {
            if (customSelector != null)
                schemas.addAll(customSelector.getSchemas(conn));
        } finally {
            if (conn != null) {
                conn.close();
            }
        }
    }

    private Connection getConnection() throws SQLException {
        return JDBCConnection.getConnection(getWizard().getProvider());
    }

    private void loadConfiguration() {
        config = getDriverConfiguration();
        if (config != null) {
            isEnable = config.isSchemaSelectionEnable();
            multipleSelection = config.isMultipleSchemaSelection();
            customSelector = config.getGetSchemaSelector();
        }
    }

    private DriverConfiguration getDriverConfiguration() {
        return DriverConfigurationExtension.getInstance()
                .findDriver(getWizard().getProvider().getSource().getLocation());
    }

    private void disposeControl() {
        for (Control control : page.getChildren()) {
            control.dispose();
        }
    }

    private boolean validate() {
        return (schemaTable.getCheckedElements().length > 0);
    }

}