org.pentaho.pac.client.datasources.DataSourcesPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.pac.client.datasources.DataSourcesPanel.java

Source

/*
 * This program is free software; you can redistribute it and/or modify it under the 
 * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software 
 * Foundation.
 *
 * You should have received a copy of the GNU Lesser General Public License along with this 
 * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html 
 * or from the Free Software Foundation, Inc., 
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 *
 * Copyright 2008 - 2009 Pentaho Corporation.  All rights reserved.
*/
package org.pentaho.pac.client.datasources;

import org.pentaho.gwt.widgets.client.buttons.ImageButton;
import org.pentaho.gwt.widgets.client.dialogs.IDialogCallback;
import org.pentaho.gwt.widgets.client.dialogs.PromptDialogBox;
import org.pentaho.pac.client.PacServiceFactory;
import org.pentaho.pac.client.PentahoAdminConsole;
import org.pentaho.pac.client.i18n.Messages;
import org.pentaho.pac.client.utils.ExceptionParser;
import org.pentaho.pac.common.NameValue;
import org.pentaho.pac.common.datasources.PentahoDataSource;

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ChangeListener;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DeckPanel;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ToggleButton;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

public class DataSourcesPanel extends DockPanel implements ClickListener, ChangeListener {

    public static final String EMPTY_STRING = ""; //$NON-NLS-1$ 
    public static final int GENERAL_PANEL_ID = 0;

    public static final int ADVANCE_PANEL_ID = 1;

    //  TabPanel generalAdvanceDbPanel = new TabPanel();

    HTML msgBoxHtml = new HTML();
    PromptDialogBox messageDialog = new PromptDialogBox("", Messages.getString("ok"), null, false, true, //$NON-NLS-1$//$NON-NLS-2$
            msgBoxHtml);
    DataSourcesList dataSourcesList = new DataSourcesList();
    DataSourceGeneralPanel dataSourceGeneralPanel = new DataSourceGeneralPanel();
    DataSourceAdvancePanel dataSourceAdvancePanel = new DataSourceAdvancePanel();
    DeckPanel deckPanel = new DeckPanel();
    ToggleButton generalButton = new ToggleButton(Messages.getString("general"), Messages.getString("general")); //$NON-NLS-1$ //$NON-NLS-2$
    ToggleButton advanceButton = new ToggleButton(Messages.getString("advance"), Messages.getString("advance")); //$NON-NLS-1$ //$NON-NLS-2$
    Button updateDataSourceBtn = new Button(Messages.getString("update")); //$NON-NLS-1$
    Button testDataSourceBtn = new Button(Messages.getString("test")); //$NON-NLS-1$

    ImageButton addDataSourceBtn = new ImageButton("style/images/add.png", "style/images/add_disabled.png", //$NON-NLS-1$//$NON-NLS-2$
            Messages.getString("addDataSource"), 15, 15); //$NON-NLS-1$
    ImageButton deleteDataSourceBtn = new ImageButton("style/images/remove.png", "style/images/remove_disabled.png", //$NON-NLS-1$//$NON-NLS-2$
            Messages.getString("deleteDataSources"), 15, 15); //$NON-NLS-1$

    NewDataSourceDialogBox newDataSourceDialogBox = new NewDataSourceDialogBox();

    PromptDialogBox confirmDataSourceDeleteDialog = new PromptDialogBox(Messages.getString("deleteDataSources"), //$NON-NLS-1$
            Messages.getString("ok"), Messages.getString("cancel"), false, true, //$NON-NLS-1$//$NON-NLS-2$
            new HTML(Messages.getString("confirmDataSourceDeletionMsg"))); //$NON-NLS-1$

    public DataSourcesPanel() {
        HorizontalPanel footerPanel = new HorizontalPanel();
        footerPanel.add(testDataSourceBtn);
        footerPanel.add(updateDataSourceBtn);
        DockPanel dataSourcesListPanel = buildDataSourcesListPanel();
        DockPanel dataSourceDetailsDockPanel = buildDataSourceDetailsDockPanel();

        dataSourcesListPanel.setStyleName("borderPane"); //$NON-NLS-1$
        dataSourceDetailsDockPanel.setStyleName("borderPane"); //$NON-NLS-1$

        add(dataSourcesListPanel, DockPanel.WEST);
        add(dataSourceDetailsDockPanel, DockPanel.CENTER);

        add(footerPanel, DockPanel.SOUTH);
        setCellHorizontalAlignment(footerPanel, HasHorizontalAlignment.ALIGN_RIGHT);
        setSpacing(10);
        setCellWidth(dataSourcesListPanel, "30%"); //$NON-NLS-1$
        setCellWidth(dataSourceDetailsDockPanel, "70%"); //$NON-NLS-1$
        setCellHeight(dataSourcesListPanel, "100%"); //$NON-NLS-1$
        setCellHeight(dataSourceDetailsDockPanel, "100%"); //$NON-NLS-1$
        dataSourcesListPanel.setWidth("100%"); //$NON-NLS-1$
        dataSourcesListPanel.setHeight("100%"); //$NON-NLS-1$
        dataSourceDetailsDockPanel.setWidth("100%"); //$NON-NLS-1$
        dataSourceDetailsDockPanel.setHeight("100%"); //$NON-NLS-1$
        updateDataSourceBtn.setEnabled(false);
        testDataSourceBtn.setEnabled(false);
        newDataSourceDialogBox.setCallback(new IDialogCallback() {
            public void cancelPressed() {
            }

            public void okPressed() {
                if (newDataSourceDialogBox.isDataSourceCreated()) {
                    PentahoDataSource dataSource = newDataSourceDialogBox.getDataSource();
                    if (dataSourcesList.addDataSource(dataSource)) {
                        dataSourcesList.setSelectedDataSource(dataSource);
                        dataSourceSelectionChanged();
                    }
                }
            }
        });
        updateDataSourceBtn.addClickListener(this);
        testDataSourceBtn.addClickListener(this);
        confirmDataSourceDeleteDialog.setCallback(new IDialogCallback() {
            public void cancelPressed() {
            }

            public void okPressed() {
                confirmDataSourceDeleteDialog.hide();
                deleteSelectedDataSources();
            }
        });
    }

    public DockPanel buildDataSourceDetailsDockPanel() {
        DockPanel dockPanel = new DockPanel();

        HorizontalPanel horizontalPanel = new HorizontalPanel();
        horizontalPanel.add(generalButton);
        horizontalPanel.add(advanceButton);
        dockPanel.add(horizontalPanel, DockPanel.NORTH);
        dockPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
        dockPanel.setSpacing(10);
        generalButton.setTitle(Messages.getString("clickEditGeneral")); //$NON-NLS-1$
        advanceButton.setTitle(Messages.getString("clickEditAdvance")); //$NON-NLS-1$

        generalButton.setStylePrimaryName("generalToggleBtn"); //$NON-NLS-1$
        advanceButton.setStylePrimaryName("advanceToggleBtn"); //$NON-NLS-1$
        deckPanel.add(dataSourceGeneralPanel);
        deckPanel.add(dataSourceAdvancePanel);

        dataSourceGeneralPanel.setWidth("100%"); //$NON-NLS-1$
        dataSourceGeneralPanel.setHeight("100%"); //$NON-NLS-1$
        dataSourceAdvancePanel.setWidth("100%"); //$NON-NLS-1$
        dataSourceAdvancePanel.setHeight("100%"); //$NON-NLS-1$

        dockPanel.add(deckPanel, DockPanel.CENTER);
        dockPanel.setCellWidth(deckPanel, "100%"); //$NON-NLS-1$
        dockPanel.setCellHeight(deckPanel, "100%"); //$NON-NLS-1$

        deckPanel.setWidth("100%"); //$NON-NLS-1$
        deckPanel.setHeight("100%"); //$NON-NLS-1$
        deckPanel.setStyleName("newDataSourceDialogBox.detailsPanel"); //$NON-NLS-1$
        deckPanel.showWidget(GENERAL_PANEL_ID);
        generalButton.setDown(true);
        advanceButton.setDown(false);
        generalButton.addClickListener(this);
        advanceButton.addClickListener(this);

        dockPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
        dataSourceGeneralPanel.getJndiNameTextBox().setReadOnly(true);
        return dockPanel;
    }

    public DockPanel buildDataSourcesListPanel() {
        DockPanel headerDockPanel = new DockPanel();
        headerDockPanel.add(deleteDataSourceBtn, DockPanel.EAST);
        VerticalPanel spacer = new VerticalPanel();
        spacer.setWidth("2"); //$NON-NLS-1$
        headerDockPanel.add(spacer, DockPanel.EAST);
        headerDockPanel.add(addDataSourceBtn, DockPanel.EAST);
        Label label = new Label(Messages.getString("dataSources")); //$NON-NLS-1$
        headerDockPanel.add(label, DockPanel.WEST);
        headerDockPanel.setCellWidth(label, "100%"); //$NON-NLS-1$
        DockPanel dataSourceListPanel = new DockPanel();
        dataSourceListPanel.add(headerDockPanel, DockPanel.NORTH);
        dataSourceListPanel.add(dataSourcesList, DockPanel.CENTER);
        dataSourceListPanel.setCellHeight(dataSourcesList, "100%"); //$NON-NLS-1$
        dataSourceListPanel.setCellWidth(dataSourcesList, "100%"); //$NON-NLS-1$
        dataSourceListPanel.setHeight("100%"); //$NON-NLS-1$
        dataSourceListPanel.setWidth("100%"); //$NON-NLS-1$
        dataSourcesList.setHeight("100%"); //$NON-NLS-1$
        dataSourcesList.setWidth("100%"); //$NON-NLS-1$
        deleteDataSourceBtn.setEnabled(false);
        dataSourcesList.addChangeListener(this);
        addDataSourceBtn.addClickListener(this);
        deleteDataSourceBtn.addClickListener(this);
        return dataSourceListPanel;
    }

    public void onClick(Widget sender) {
        if (sender == updateDataSourceBtn) {
            updateDataSourceDetails(sender);
        } else if (sender == testDataSourceBtn) {
            testDataSourceConnection();
        } else if (sender == deleteDataSourceBtn) {
            if (dataSourcesList.getSelectedDataSources().length > 0) {
                confirmDataSourceDeleteDialog.center();
            }
        } else if (sender == addDataSourceBtn) {
            addNewDataSource();
        } else if (sender == generalButton) {
            if (!generalButton.isDown()) {
                generalButton.setDown(true);
            } else {
                advanceButton.setDown(false);
                deckPanel.showWidget(GENERAL_PANEL_ID);
            }
        } else if (sender == advanceButton) {
            if (!advanceButton.isDown()) {
                advanceButton.setDown(true);
            } else {
                generalButton.setDown(false);
                deckPanel.showWidget(ADVANCE_PANEL_ID);
            }
        }
    }

    private void addNewDataSource() {
        newDataSourceDialogBox.setDataSource(null);
        newDataSourceDialogBox.center();
    }

    private void deleteSelectedDataSources() {
        final PentahoDataSource[] selectedDataSources = dataSourcesList.getSelectedDataSources();
        if (selectedDataSources.length > 0) {
            AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {
                public void onSuccess(Boolean result) {
                    messageDialog.setText(Messages.getString("deleteDataSources")); //$NON-NLS-1$
                    msgBoxHtml.setHTML(Messages.getString("successfulDataSourceDelete")); //$NON-NLS-1$
                    messageDialog.center();
                    refresh();
                }

                public void onFailure(Throwable caught) {
                    messageDialog.setText(ExceptionParser.getErrorHeader(caught.getMessage()));
                    msgBoxHtml.setHTML(ExceptionParser.getErrorMessage(caught.getMessage(),
                            Messages.getString("errorDeletingDataSource"))); //$NON-NLS-1$
                    messageDialog.center();
                }
            };
            PacServiceFactory.getPacService().deleteDataSources(selectedDataSources, callback);
        }
    }

    private void dataSourceSelectionChanged() {
        PentahoDataSource[] selectedDataSources = dataSourcesList.getSelectedDataSources();
        if (selectedDataSources.length == 1) {
            dataSourceGeneralPanel.setDataSource(selectedDataSources[0]);
            dataSourceAdvancePanel.setDataSource(selectedDataSources[0]);
        } else {
            dataSourceGeneralPanel.setDataSource(null);
            dataSourceAdvancePanel.setDataSource(null);
        }
        dataSourceGeneralPanel.setEnabled(selectedDataSources.length == 1);
        dataSourceAdvancePanel.setEnabled(selectedDataSources.length == 1);
        updateDataSourceBtn.setEnabled(selectedDataSources.length == 1);
        testDataSourceBtn.setEnabled(selectedDataSources.length == 1);
        deleteDataSourceBtn.setEnabled(selectedDataSources.length > 0);

    }

    private void updateDataSourceDetails(final Widget sender) {
        messageDialog.setText(Messages.getString("updateDataSource")); //$NON-NLS-1$
        if (dataSourceGeneralPanel.getJndiName().trim().length() == 0) {
            msgBoxHtml.setHTML(Messages.getString("invalidConnectionName")); //$NON-NLS-1$
            messageDialog.center();
        } else if (dataSourceGeneralPanel.getUrl().trim().length() == 0) {
            msgBoxHtml.setHTML(Messages.getString("missingDbUrl")); //$NON-NLS-1$
            messageDialog.center();
        } else if (dataSourceGeneralPanel.getDriverClass().trim().length() == 0) {
            msgBoxHtml.setHTML(Messages.getString("missingDbDriver")); //$NON-NLS-1$
            messageDialog.center();
        } else if (dataSourceGeneralPanel.getUserName().trim().length() == 0) {
            msgBoxHtml.setHTML(Messages.getString("missingDbUserName")); //$NON-NLS-1$
            messageDialog.center();
        } else {
            final PentahoDataSource dataSource = getDataSource();
            final int index = dataSourcesList.getSelectedIndex();

            ((Button) sender).setEnabled(false);
            AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {
                public void onSuccess(Boolean result) {
                    messageDialog.setText(Messages.getString("updateDataSource")); //$NON-NLS-1$
                    msgBoxHtml.setHTML(Messages.getString("successfulDataSourceUpdate")); //$NON-NLS-1$
                    messageDialog.center();
                    dataSourcesList.setDataSource(index, dataSource);
                    ((Button) sender).setEnabled(true);

                }

                public void onFailure(Throwable caught) {
                    messageDialog.setText(ExceptionParser.getErrorHeader(caught.getMessage()));
                    msgBoxHtml.setHTML(ExceptionParser.getErrorMessage(caught.getMessage(),
                            Messages.getString("errorUpdatingDataSource"))); //$NON-NLS-1$
                    messageDialog.center();
                    ((Button) sender).setEnabled(true);
                }
            };
            PacServiceFactory.getPacService().updateDataSource(dataSource, callback);
        }
    }

    private void testDataSourceConnection() {
        final PentahoDataSource dataSource = getDataSource();

        final AsyncCallback<Boolean> validationUrlCallback = new AsyncCallback<Boolean>() {
            public void onSuccess(Boolean result) {
                messageDialog.setText(Messages.getString("testConnection")); //$NON-NLS-1$
                msgBoxHtml.setHTML(Messages.getString("connectionTestSuccessful")); //$NON-NLS-1$
                messageDialog.center();
            }

            public void onFailure(Throwable caught) {
                messageDialog.setText(ExceptionParser.getErrorHeader(caught.getMessage()));
                msgBoxHtml
                        .setHTML(Messages.getString("errorTestingValidationQuery", ExceptionParser.getErrorMessage( //$NON-NLS-1$
                                caught.getMessage(), Messages.getString("errorTestingValidationQueryDefault"))));
                messageDialog.center();
            }
        };

        AsyncCallback<Boolean> connTestCallback = new AsyncCallback<Boolean>() {
            public void onSuccess(Boolean result) {
                if (dataSource.getQuery() != null && !dataSource.getQuery().trim().equals(EMPTY_STRING)) {
                    PacServiceFactory.getPacService().testDataSourceValidationQuery(dataSource,
                            validationUrlCallback);
                } else {
                    messageDialog.setText(Messages.getString("testConnection")); //$NON-NLS-1$
                    msgBoxHtml.setHTML(Messages.getString("connectionTestSuccessful")); //$NON-NLS-1$
                    messageDialog.center();
                }
            }

            public void onFailure(Throwable caught) {
                messageDialog.setText(ExceptionParser.getErrorHeader(caught.getMessage()));
                msgBoxHtml.setHTML(ExceptionParser.getErrorMessage(caught.getMessage(),
                        Messages.getString("errorTestingDataSourceConnection"))); //$NON-NLS-1$
                messageDialog.center();
            }
        };

        PacServiceFactory.getPacService().testDataSourceConnection(dataSource, connTestCallback);

    }

    public boolean validate() {
        return true;
    }

    public void onChange(Widget sender) {
        dataSourceSelectionChanged();
    }

    public void refresh() {
        PacServiceFactory.getJdbcDriverDiscoveryService().getAvailableJdbcDrivers(new AsyncCallback<NameValue[]>() {
            public void onFailure(Throwable caught) {
                dataSourcesList.refresh();
                dataSourceGeneralPanel.refresh(null);
                dataSourceAdvancePanel.refresh();
                newDataSourceDialogBox.refresh(null);
                dataSourceSelectionChanged();
            }

            public void onSuccess(NameValue[] result) {
                dataSourcesList.refresh();
                dataSourceGeneralPanel.refresh(result);
                newDataSourceDialogBox.refresh(result);
                dataSourceAdvancePanel.refresh();
                dataSourceSelectionChanged();
            }
        });
    }

    public boolean isInitialized() {
        return dataSourcesList.isInitialized();
    }

    public void clearDataSourcesCache() {
        dataSourcesList.clearDataSourcesCache();
    }

    private PentahoDataSource getNormalDataSource() {
        return dataSourceGeneralPanel.getDataSource();
    }

    public PentahoDataSource getDataSource() {
        PentahoDataSource normalDataSource = getNormalDataSource();
        PentahoDataSource advanceDataSource = getAdvanceDataSource();
        PentahoDataSource dataSource = consolidateNormalAndAdvance(normalDataSource, advanceDataSource);
        return dataSource;
    }

    private PentahoDataSource getAdvanceDataSource() {
        return dataSourceAdvancePanel.getDataSource();
    }

    private PentahoDataSource consolidateNormalAndAdvance(PentahoDataSource normalDataSource,
            PentahoDataSource advanceDataSource) {
        PentahoDataSource dataSource = new PentahoDataSource();
        dataSource.setDriverClass(normalDataSource.getDriverClass());
        dataSource.setPassword(normalDataSource.getPassword());
        dataSource.setName(normalDataSource.getName());
        dataSource.setUrl(normalDataSource.getUrl());
        dataSource.setUserName(normalDataSource.getUserName());
        dataSource.setIdleConn(advanceDataSource.getIdleConn());
        dataSource.setMaxActConn(advanceDataSource.getMaxActConn());
        dataSource.setQuery(advanceDataSource.getQuery());
        dataSource.setWait(advanceDataSource.getWait());

        return dataSource;
    }
}