/* * 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. * * * Created April 21, 2009 * @author rmansoor */ package org.pentaho.platform.dataaccess.datasource.wizard.sources.query; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import org.pentaho.platform.dataaccess.datasource.DatasourceType; import org.pentaho.platform.dataaccess.datasource.IConnection; import org.pentaho.platform.dataaccess.datasource.wizard.AbstractWizardStep; import org.pentaho.platform.dataaccess.datasource.wizard.IWizardDatasource; import org.pentaho.platform.dataaccess.datasource.wizard.controllers.ConnectionController; import org.pentaho.platform.dataaccess.datasource.wizard.controllers.MessageHandler; import org.pentaho.platform.dataaccess.datasource.wizard.controllers.WizardConnectionController; import org.pentaho.platform.dataaccess.datasource.wizard.controllers.WizardRelationalDatasourceController; import org.pentaho.platform.dataaccess.datasource.wizard.models.DatasourceModel; import org.pentaho.platform.dataaccess.datasource.wizard.models.IWizardModel; import org.pentaho.platform.dataaccess.datasource.wizard.service.IXulAsyncConnectionService; import org.pentaho.platform.dataaccess.datasource.wizard.service.IXulAsyncDatasourceService; import org.pentaho.platform.dataaccess.datasource.wizard.service.impl.ConnectionServiceGwtImpl; import org.pentaho.platform.dataaccess.datasource.wizard.service.impl.DatasourceServiceGwtImpl; import org.pentaho.platform.dataaccess.datasource.wizard.sources.csv.CsvDatasource; import org.pentaho.ui.xul.XulComponent; import org.pentaho.ui.xul.XulException; import org.pentaho.ui.xul.binding.Binding; import org.pentaho.ui.xul.binding.BindingConvertor; import org.pentaho.ui.xul.components.XulButton; import org.pentaho.ui.xul.components.XulTextbox; import org.pentaho.ui.xul.containers.XulListbox; import org.pentaho.ui.xul.containers.XulTree; import org.pentaho.ui.xul.containers.XulVbox; import org.pentaho.ui.xul.dom.Document; import org.pentaho.ui.xul.stereotype.Bindable; @SuppressWarnings("unchecked") public class QueryPhysicalStep extends AbstractWizardStep { public static final int DEFAULT_RELATIONAL_TABLE_ROW_COUNT = 5; private DatasourceModel datasourceModel; private IXulAsyncDatasourceService datasourceService; XulTextbox datasourceNameTextBox = null; XulButton okButton = null; XulButton cancelButton = null; private XulTree csvDataTable = null; private WizardConnectionController connectionController; private IXulAsyncConnectionService connectionService; private boolean isFinishable = false; private IConnection connection; private ConnectionController databaseConnectionController; public QueryPhysicalStep(DatasourceModel datasourceModel, IWizardDatasource parentDatasource, boolean isFinishable) { super(parentDatasource); this.datasourceModel = datasourceModel; this.datasourceService = new DatasourceServiceGwtImpl(); this.connectionService = new ConnectionServiceGwtImpl(); this.isFinishable = isFinishable; } public QueryPhysicalStep(DatasourceModel datasourceModel, IWizardDatasource parentDatasource) { this(datasourceModel, parentDatasource, true); } @Override public void activating() { XulVbox queryVbox = (XulVbox) document.getElementById("queryBox"); queryVbox.setVisible(true); XulVbox metadataVbox = (XulVbox) document.getElementById("metadata"); metadataVbox.setVisible(false); XulVbox connectionsVbox = (XulVbox) document.getElementById("connectionsLbl"); connectionsVbox.setVisible(false); XulListbox connections = (XulListbox) document.getElementById("connectionList"); connections.setWidth(180); connections.setHeight(325); } @Override public XulComponent getUIComponent() { return document.getElementById("queryDeckPanel"); } @Bindable public void init(IWizardModel wizardModel) throws XulException { datasourceNameTextBox = (XulTextbox) document.getElementById("datasourceName"); //$NON-NLS-1$ connectionController = new WizardConnectionController(document); connectionController.setDatasourceModel(datasourceModel); connectionController.setConnectionService(connectionService); getXulDomContainer().addEventHandler(connectionController); connectionController.init(); databaseConnectionController = new ConnectionController(); databaseConnectionController.setDatasourceModel(datasourceModel); databaseConnectionController.setService(connectionService); databaseConnectionController.reloadConnections(); WizardRelationalDatasourceController relationalDatasourceController = new WizardRelationalDatasourceController(); relationalDatasourceController.setService(datasourceService); getXulDomContainer().addEventHandler(relationalDatasourceController); relationalDatasourceController.init(datasourceModel); initialize(); datasourceModel.clearModel(); super.init(wizardModel); } public void initialize() { } public IXulAsyncConnectionService getConnectionService() { return connectionService; } public void setConnectionService(IXulAsyncConnectionService connectionService) { this.connectionService = connectionService; } public String getName() { return "datasourceController"; //$NON-NLS-1$ } @Bindable public void selectCsv() { csvDataTable.update(); datasourceModel.setDatasourceType(DatasourceType.CSV); } @Bindable public void selectSql() { datasourceModel.setDatasourceType(DatasourceType.SQL); } public IXulAsyncDatasourceService getDatasourceService() { return datasourceService; } public void setDatasourceService(IXulAsyncDatasourceService datasourceService) { this.datasourceService = datasourceService; } /* (non-Javadoc) * @see org.pentaho.platform.dataaccess.datasource.wizard.steps.IWizardStep#getStepName() */ public String getStepName() { return MessageHandler.getString("wizardStepName.SOURCE"); //$NON-NLS-1$ } /* (non-Javadoc) * @see org.pentaho.platform.dataaccess.datasource.wizard.steps.IWizardStep#setBindings() */ public void setBindings() { bf.setBindingType(Binding.Type.ONE_WAY); bf.createBinding(wizardModel, "selectedDatasource", datasourceModel, "datasourceType", new BindingConvertor<IWizardDatasource, DatasourceType>(){ @Override public DatasourceType sourceToTarget(IWizardDatasource iWizardDatasource) { if(iWizardDatasource instanceof QueryDatasource){ return DatasourceType.SQL; } else if( iWizardDatasource instanceof CsvDatasource){ return DatasourceType.CSV; } return DatasourceType.NONE; } @Override public IWizardDatasource targetToSource(DatasourceType datasourceType) { return null; } }); bf.setBindingType(Binding.Type.BI_DIRECTIONAL); bf.createBinding(datasourceModel, "datasourceName", datasourceNameTextBox, "value"); //$NON-NLS-1$ //$NON-NLS-2$ // create a binding from the headerRows property of the CsvFileInfo to the first-row-is-header check box datasourceModel.addPropertyChangeListener("datasourceName", new QueryAndDatasourceNamePropertyChangeListener()); //$NON-NLS-1$ datasourceModel.addPropertyChangeListener("query", new QueryAndDatasourceNamePropertyChangeListener()); //$NON-NLS-1$ bf.setBindingType(Binding.Type.ONE_WAY); bf.setBindingType(Binding.Type.ONE_WAY); bf.createBinding(datasourceModel, "datasourceName", datasourceModel.getModelInfo(), "stageTableName"); bf.createBinding(wizardModel, "editing", datasourceNameTextBox, "disabled"); bf.createBinding(datasourceModel, "selectedRelationalConnection", this, "connection"); } public void setFocus() { datasourceNameTextBox.setFocus(); setStepImageVisible(true); } public void reloadConnections() { databaseConnectionController.reloadConnections(); } public void selectConnectionByName(String name) { connection = databaseConnectionController.getDatasourceModel().getGuiStateModel().getConnectionByName(name); databaseConnectionController.getDatasourceModel().setSelectedRelationalConnection(connection); } private class QueryAndDatasourceNamePropertyChangeListener implements PropertyChangeListener { public void propertyChange(PropertyChangeEvent evt) { String newValue = (String) evt.getNewValue(); if(newValue == null || newValue.trim().length() == 0) { parentDatasource.setFinishable(false); } else { if(isFinishable) { datasourceModel.validate(); parentDatasource.setFinishable(datasourceModel.isValidated()); } else { parentDatasource.setFinishable(false); setValid(true); } } } } public boolean stepDeactivatingForward(){ return super.stepDeactivatingForward(); } public WizardConnectionController getConnectionController() { return connectionController; } public void setConnectionController(WizardConnectionController connectionController) { this.connectionController = connectionController; } @Bindable public IConnection getConnection() { return connection; } @Bindable public void setConnection(IConnection connection) { Object prevVal = this.connection == null ? new Object() : null; this.connection = connection; firePropertyChange("connection", prevVal, connection); } }