org.entirej.ide.ui.wizards.db.DBSelectStatementWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for org.entirej.ide.ui.wizards.db.DBSelectStatementWizardPage.java

Source

/*******************************************************************************
 * Copyright 2013 Mojave Innovations GmbH
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 * Contributors:
 *     Mojave Innovations GmbH - initial API and implementation
 ******************************************************************************/
package org.entirej.ide.ui.wizards.db;

import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.entirej.framework.core.service.EJTableColumn;
import org.entirej.framework.dev.exceptions.EJDevFrameworkException;
import org.entirej.framework.plugin.preferences.EntirejConnectionPreferencePage;
import org.entirej.framework.plugin.ui.wizards.utils.InvalidStatementException;
import org.entirej.framework.plugin.ui.wizards.utils.StatementValidator;
import org.entirej.framework.plugin.ui.wizards.utils.SyntaxHighlightListener;
import org.entirej.ide.core.EJCoreLog;
import org.entirej.ide.ui.EJUIImages;
import org.entirej.ide.ui.EJUIPlugin;
import org.entirej.ide.ui.utils.ProjectConnectionFactory;
import org.entirej.ide.ui.wizards.db.DBColumnSelectionPage.ColumnLabelProvider;

public class DBSelectStatementWizardPage extends WizardPage {

    private String selectStatement;
    private Set<EJTableColumn> selectedColumns = new HashSet<EJTableColumn>();

    private String dbError;
    private Connection conn;

    private boolean selectStmtValidation;

    public DBSelectStatementWizardPage() {
        super("ej.db.select.selection");
        setTitle("Select Statement");
        setDescription("Select columns/statement from database.");
    }

    protected void init(IJavaProject javaProject) {
        try {
            if (conn != null && !conn.isClosed()) {
                conn.close();
                conn = null;
            }
            try {
                conn = ProjectConnectionFactory.createConnection(javaProject);
            } catch (EJDevFrameworkException e) {
                if (MessageDialog.openQuestion(EJUIPlugin.getActiveWorkbenchShell(), "Connection Error",
                        String.format("%s \n\n Change Project Connection Settings ?", e.getMessage()))) {
                    EntirejConnectionPreferencePage.openPage(javaProject.getProject());
                    conn = ProjectConnectionFactory.createConnection(javaProject);
                }
            }

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void setVisible(boolean visible) {

        super.setVisible(visible);
        if (visible) {

        }

    }

    @Override
    public void dispose() {
        try {
            if (conn != null && !conn.isClosed()) {
                conn.close();
                conn = null;
            }
        } catch (SQLException e) {
            EJCoreLog.logException(e);
        }
        super.dispose();
    }

    public String getSelectStatement() {
        return selectStatement;
    }

    public Set<EJTableColumn> getSelectedColumns() {
        return new HashSet<EJTableColumn>(selectedColumns);
    }

    public List<EJTableColumn> getColumns() {
        return new ArrayList<EJTableColumn>(selectedColumns);
    }

    protected void doUpdateStatus() {
        setPageComplete(validatePage());
    }

    protected boolean validatePage() {
        setErrorMessage(null);
        setMessage(null);
        if (dbError != null) {
            setErrorMessage(dbError);
            return false;
        }
        if (selectStatement == null || selectStatement.trim().length() == 0) {
            setErrorMessage("Select statement can't be empty.");
            return false;
        }
        if (!selectStmtValidation) {
            setMessage("Please validate select statement.");
            return false;
        }

        if (selectedColumns.size() == 0) {
            setErrorMessage("Columns can't be empty.");
            return false;
        }

        return true;
    }

    public void createControl(Composite parent) {
        initializeDialogUnits(parent);

        Composite composite = new Composite(parent, SWT.NONE);
        composite.setFont(parent.getFont());
        int nColumns = 1;

        GridLayout layout = new GridLayout();
        layout.numColumns = nColumns;
        layout.makeColumnsEqualWidth = true;
        layout.verticalSpacing = 0;

        composite.setLayout(layout);
        createTabControl(composite);
        setControl(composite);
        Dialog.applyDialogFont(composite);
    }

    private void createTabControl(Composite composite) {
        TabFolder tabFolder = new TabFolder(composite, SWT.NONE);
        tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL));

        createSelectQueryTabPage(tabFolder);

    }

    private void createSelectQueryTabPage(final TabFolder tabFolder) {
        TabItem itemSelect = new TabItem(tabFolder, SWT.NULL);
        itemSelect.setText("Select");
        final TabItem itemColumns = new TabItem(tabFolder, SWT.NULL);
        itemColumns.setText("Columns");

        Composite container = new Composite(tabFolder, SWT.NULL);
        itemSelect.setControl(container);
        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 1;
        container.setLayout(gridLayout);
        final CheckboxTableViewer listViewer = CheckboxTableViewer.newCheckList(container, SWT.BORDER);
        GridData listGridData = new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL);
        listViewer.setComparator(new ViewerComparator() {
            @Override
            public int compare(Viewer viewer, Object e1, Object e2) {
                if (e1 instanceof EJTableColumn && e2 instanceof EJTableColumn) {
                    EJTableColumn column1 = (EJTableColumn) e1;
                    EJTableColumn column2 = (EJTableColumn) e2;
                    String name1 = column1.getName();
                    String name2 = column2.getName();
                    if (name1 == null) {
                        name1 = "";//$NON-NLS-1$
                    }
                    if (name2 == null) {
                        name2 = "";//$NON-NLS-1$
                    }
                    return name1.compareToIgnoreCase(name2);
                }
                return super.compare(viewer, e1, e2);
            }

        });
        listViewer.getTable().setLayoutData(listGridData);
        listViewer.getTable().setFont(container.getFont());
        listViewer.setContentProvider(new ITreeContentProvider() {

            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {

            }

            public void dispose() {
            }

            public boolean hasChildren(Object element) {
                return false;
            }

            public Object getParent(Object element) {
                return null;
            }

            public Object[] getElements(Object inputElement) {
                if (inputElement instanceof List) {
                    return ((List<?>) inputElement).toArray();
                }
                return new Object[0];
            }

            public Object[] getChildren(Object parentElement) {
                return new Object[0];
            }
        });
        listViewer.setLabelProvider(new DelegatingStyledCellLabelProvider(new ColumnLabelProvider()));
        listViewer.addCheckStateListener(new ICheckStateListener() {

            public void checkStateChanged(CheckStateChangedEvent event) {
                Object element = event.getElement();
                if (element instanceof EJTableColumn) {
                    EJTableColumn column = (EJTableColumn) element;
                    if (event.getChecked())
                        selectedColumns.add(column);

                    else
                        selectedColumns.remove(column);

                    doUpdateStatus();
                }

            }
        });

        itemColumns.setControl(container);

        ToolBar toolbar = new ToolBar(container, SWT.FLAT | SWT.RIGHT);
        GridData gd = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);

        toolbar.setLayoutData(gd);
        // create toolbar buttons
        ToolItem selectAll = new ToolItem(toolbar, SWT.PUSH);
        selectAll.setImage(EJUIImages.getImage(EJUIImages.DESC_SELECT_ALL));
        selectAll.setToolTipText("Select All");
        selectAll.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                if (listViewer != null) {
                    ITreeContentProvider contentProvider = (ITreeContentProvider) listViewer.getContentProvider();
                    Object[] elements = contentProvider.getElements(listViewer.getInput());
                    selectedColumns.clear();
                    for (Object object : elements) {

                        if (object instanceof EJTableColumn) {
                            selectedColumns.add((EJTableColumn) object);
                        }
                    }
                    listViewer.setAllChecked(true);
                    doUpdateStatus();
                }

            }
        });
        ToolItem deselectAll = new ToolItem(toolbar, SWT.PUSH);
        deselectAll.setImage(EJUIImages.getImage(EJUIImages.DESC_DESELECT_ALL));
        deselectAll.setToolTipText("Deselect All");
        deselectAll.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                if (listViewer != null) {
                    selectedColumns.clear();
                    listViewer.setAllChecked(false);
                    doUpdateStatus();
                }

            }
        });

        container = new Composite(tabFolder, SWT.NULL);
        itemSelect.setControl(container);
        gridLayout = new GridLayout();
        gridLayout.numColumns = 1;
        container.setLayout(gridLayout);
        setControl(container);

        final StyledText statementText = new StyledText(container,
                SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
        statementText.addModifyListener(new SyntaxHighlightListener(statementText, "sql"));
        statementText.addModifyListener(new ModifyListener() {

            public void modifyText(ModifyEvent e) {
                selectStatement = statementText.getText();
                selectedColumns.clear();
                listViewer.setInput(null);
                selectStmtValidation = false;
                doUpdateStatus();
            }
        });

        gd = new GridData();
        gd.horizontalAlignment = SWT.FILL;
        gd.verticalAlignment = SWT.FILL;
        gd.grabExcessVerticalSpace = true;
        gd.grabExcessHorizontalSpace = true;
        gd.widthHint = 400;
        gd.heightHint = 300;
        statementText.setLayoutData(gd);

        Button validateButton = new Button(container, SWT.PUSH);
        validateButton.setText("Validate");
        validateButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                IRunnableWithProgress loadColumns = new IRunnableWithProgress() {

                    public void run(IProgressMonitor monitor)
                            throws InvocationTargetException, InterruptedException {
                        try {
                            dbError = null;
                            selectedColumns.clear();
                            listViewer.setInput(StatementValidator.validateStatement(conn, selectStatement));
                            selectStmtValidation = true;

                        } catch (InvalidStatementException e) {
                            dbError = e.getMessage();
                            listViewer.setInput(new Object());
                        }

                    }

                };
                try {
                    getContainer().run(false, false, loadColumns);

                } catch (Exception e) {
                    dbError = e.getMessage();
                } finally {
                    doUpdateStatus();
                    if (selectStmtValidation) {
                        tabFolder.setSelection(itemColumns);
                    }

                }

            }
        });
        validateButton.setLayoutData(
                new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING));
    }
}