<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">/*
 * 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, msgBoxHtml);  //$NON-NLS-1$//$NON-NLS-2$
  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", Messages.getString("addDataSource"), 15, 15); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  ImageButton deleteDataSourceBtn = new ImageButton("style/images/remove.png", "style/images/remove_disabled.png", Messages.getString("deleteDataSources"), 15, 15); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

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

  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 &gt; 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 &gt; 0) {
      AsyncCallback&lt;Boolean&gt; callback = new AsyncCallback&lt;Boolean&gt;() {
        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 &gt; 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&lt;Boolean&gt; callback = new AsyncCallback&lt;Boolean&gt;() {
        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&lt;Boolean&gt; validationUrlCallback = new AsyncCallback&lt;Boolean&gt;() {
        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(caught.getMessage(), Messages.getString("errorTestingValidationQueryDefault"))));           //$NON-NLS-1$          
          messageDialog.center();
        }
      };
      
    AsyncCallback&lt;Boolean&gt; connTestCallback = new AsyncCallback&lt;Boolean&gt;() {
      public void onSuccess(Boolean result) {
        if (dataSource.getQuery()!=null &amp;&amp; !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&lt;NameValue[]&gt;() {
          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;
  }
}</pre></body></html>