/*
* 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;
import java.util.ArrayList;
import java.util.List;
import org.pentaho.gwt.widgets.client.utils.i18n.ResourceBundle;
import org.pentaho.metadata.model.Domain;
import org.pentaho.platform.dataaccess.datasource.IConnection;
import org.pentaho.platform.dataaccess.datasource.wizard.controllers.ConnectionController;
import org.pentaho.platform.dataaccess.datasource.wizard.controllers.CsvDatasourceController;
import org.pentaho.platform.dataaccess.datasource.wizard.controllers.DatasourceController;
import org.pentaho.platform.dataaccess.datasource.wizard.controllers.IDatasourceTypeController;
import org.pentaho.platform.dataaccess.datasource.wizard.controllers.RelationalDatasourceController;
import org.pentaho.platform.dataaccess.datasource.wizard.models.DatasourceModel;
import org.pentaho.platform.dataaccess.datasource.wizard.service.IXulAsyncConnectionService;
import org.pentaho.platform.dataaccess.datasource.wizard.service.IXulAsyncDatasourceService;
import org.pentaho.ui.xul.XulServiceCallback;
import org.pentaho.ui.xul.components.XulLabel;
import org.pentaho.ui.xul.containers.XulDialog;
import org.pentaho.ui.xul.gwt.GwtXulDomContainer;
import org.pentaho.ui.xul.gwt.GwtXulRunner;
import org.pentaho.ui.xul.gwt.binding.GwtBindingFactory;
import org.pentaho.ui.xul.gwt.util.AsyncConstructorListener;
import org.pentaho.ui.xul.gwt.util.AsyncXulLoader;
import org.pentaho.ui.xul.gwt.util.IXulLoaderCallback;
/**
* GWT implementation of a datasource editor. Constructor takes all external dependencies. Dialog is shown/hidden via
* the <code>DialogController</code>.
*/
public class GwtDatasourceEditor implements IXulLoaderCallback, IDatasourceEditor {
DatasourceController datasourceController = new DatasourceController();
private CsvDatasourceController csvDatasourceController = new CsvDatasourceController();
private RelationalDatasourceController relationalDatasourceController = new RelationalDatasourceController();
private ConnectionController connectionController = new ConnectionController();
private IXulAsyncConnectionService connectionService;
private IXulAsyncDatasourceService datasourceService;
private DatasourceModel datasourceModel = new DatasourceModel();
private DatasourceMessages datasourceMessages = new GwtDatasourceMessages();
private WaitingDialog waitingDialog;
private GwtXulDomContainer container;
private AsyncConstructorListener constructorListener;
private boolean initialized;
public GwtDatasourceEditor(final IXulAsyncDatasourceService datasourceService, final IXulAsyncConnectionService connectionService, final AsyncConstructorListener constructorListener) {
this(datasourceService, connectionService, constructorListener, true);
}
public GwtDatasourceEditor(final IXulAsyncDatasourceService datasourceService, final IXulAsyncConnectionService connectionService, final AsyncConstructorListener constructorListener, boolean checkHasAccess) {
this.constructorListener = constructorListener;
if (checkHasAccess) {
datasourceService.hasPermission(new XulServiceCallback<Boolean>() {
public void error(String message, Throwable error) {
showErrorDialog(
datasourceMessages.getString("DatasourceEditor.ERROR"), //$NON-NLS-1$
datasourceMessages.getString("DatasourceEditor.ERROR_0002_UNABLE_TO_SHOW_DIALOG",error.getLocalizedMessage())); //$NON-NLS-1$
}
public void success(Boolean retVal) {
if (retVal) {
init(datasourceService, connectionService);
} else {
if (constructorListener != null) {
constructorListener.asyncConstructorDone();
}
datasourceController.onDialogReady();
}
}
});
} else {
init(datasourceService, connectionService);
}
}
private void init(final IXulAsyncDatasourceService datasourceService, final IXulAsyncConnectionService connectionService) {
setDatasourceService(datasourceService);
setConnectionService(connectionService);
AsyncXulLoader.loadXulFromUrl("datasourceEditorDialog.xul", "datasourceEditorDialog", GwtDatasourceEditor.this); //$NON-NLS-1$//$NON-NLS-2$
}
private void reloadConnections() {
if(connectionService != null) {
connectionService.getConnections(new XulServiceCallback<List<IConnection>>(){
public void error(String message, Throwable error) {
showErrorDialog(datasourceMessages.getString("DatasourceEditor.ERROR"),datasourceMessages.getString("DatasourceEditor.ERROR_0002_UNABLE_TO_SHOW_DIALOG",error.getLocalizedMessage()));
}
public void success(List<IConnection> connections) {
datasourceModel.getRelationalModel().setConnections(connections);
}
});
} else {
showErrorDialog(datasourceMessages.getString("DatasourceEditor.ERROR"),"DatasourceEditor.ERROR_0004_CONNECTION_SERVICE_NULL");
}
}
private void showErrorDialog(String title, String message) {
XulDialog errorDialog = (XulDialog) container.getDocumentRoot().getElementById("errorDialog");
XulLabel errorLabel = (XulLabel) container.getDocumentRoot().getElementById("errorLabel");
errorDialog.setTitle(title);
errorLabel.setValue(message);
}
public void addConnectionDialogListener(ConnectionDialogListener listener){
checkInitialized();
connectionController.addConnectionDialogListener(listener);
}
public void removeConnectionDialogListener(ConnectionDialogListener listener){
checkInitialized();
connectionController.removeConnectionDialogListener(listener);
}
/**
* Specified by <code>IXulLoaderCallback</code>.
*/
public void overlayLoaded() {
}
/**
* Specified by <code>IXulLoaderCallback</code>.
*/
public void overlayRemoved() {
}
/**
* Specified by <code>IXulLoaderCallback</code>.
*/
public void xulLoaded(final GwtXulRunner runner) {
try {
container = (GwtXulDomContainer) runner.getXulDomContainers().get(0);
AsyncXulLoader.loadOverlayFromUrl("datasourceEditorDialog-gwt-overlay.xul", "datasourceEditorDialog", container, this); //$NON-NLS-1$//$NON-NLS-2$
datasourceMessages.setMessageBundle((ResourceBundle) container.getResourceBundles().get(0));
GwtBindingFactory bf = new GwtBindingFactory(container.getDocumentRoot());
datasourceController.setBindingFactory(bf);
datasourceController.setDatasourceMessages(datasourceMessages);
waitingDialog = new GwtWaitingDialog(datasourceMessages.getString("waitingDialog.previewLoading"),datasourceMessages.getString("waitingDialog.generatingPreview"));
container.addEventHandler(datasourceController);
csvDatasourceController.setBindingFactory(bf);
csvDatasourceController.setDatasourceMessages(datasourceMessages);
csvDatasourceController.setWaitingDialog(waitingDialog);
container.addEventHandler(csvDatasourceController);
relationalDatasourceController.setBindingFactory(bf);
relationalDatasourceController.setDatasourceMessages(datasourceMessages);
relationalDatasourceController.setWaitingDialog(waitingDialog);
container.addEventHandler(relationalDatasourceController);
connectionController.setDatasourceMessages(datasourceMessages);
container.addEventHandler(connectionController);
datasourceModel.getCsvModel().setMessages(datasourceMessages);
datasourceController.setDatasourceModel(datasourceModel);
csvDatasourceController.setDatasourceModel(datasourceModel);
relationalDatasourceController.setDatasourceModel(datasourceModel);
connectionController.setDatasourceModel(datasourceModel);
List<IDatasourceTypeController> datasourceTypeControllers = new ArrayList<IDatasourceTypeController>();
datasourceTypeControllers.add(relationalDatasourceController);
datasourceTypeControllers.add(csvDatasourceController);
datasourceController.setDatasourceTypeControllers(datasourceTypeControllers);
runner.initialize();
runner.start();
initialized = true;
if (constructorListener != null) {
constructorListener.asyncConstructorDone();
}
datasourceController.onDialogReady();
} catch (Exception e) {
e.printStackTrace();
}
}
private void checkInitialized() {
if (!initialized) {
throw new IllegalStateException(datasourceMessages.getString("DatasourceEditor.ERROR_0003_CONSTRUCTOR_NOT_INITIALIZED_ERROR")); //$NON-NLS-1$
}
}
private void setConnectionService(IXulAsyncConnectionService service){
this.connectionService = service;
connectionController.setService(service);
// relationalDatasourceController.setConnectionService(service);
reloadConnections();
}
private void setDatasourceService(IXulAsyncDatasourceService service){
this.datasourceService = service;
datasourceController.setService(service);
csvDatasourceController.setService(service);
relationalDatasourceController.setService(service);
}
public DatasourceModel getDatasourceModel() {
checkInitialized();
return datasourceModel;
}
/**
* Specified by <code>DialogController</code>.
*/
public void addDialogListener(org.pentaho.ui.xul.util.DialogController.DialogListener<Domain> listener) {
checkInitialized();
datasourceController.addDialogListener(listener);
listener.onDialogReady();
}
/**
* Specified by <code>DialogController</code>.
*/
public void hideDialog() {
checkInitialized();
datasourceController.hideDialog();
}
/**
* Specified by <code>DialogController</code>.
*/
public void removeDialogListener(org.pentaho.ui.xul.util.DialogController.DialogListener<Domain> listener) {
checkInitialized();
datasourceController.removeDialogListener(listener);
}
/**
* Specified by <code>DialogController</code>.
*/
public void showDialog() {
if(datasourceModel.getRelationalModel().getConnections() == null || datasourceModel.getRelationalModel().getConnections().size() <= 0) {
checkInitialized();
reloadConnections();
}
datasourceController.initialize();
datasourceController.showDialog();
}
public void showEditDialog(final String domainId, final String modelId) {
// initialize connections
if(datasourceModel.getRelationalModel().getConnections() == null || datasourceModel.getRelationalModel().getConnections().size() <= 0) {
checkInitialized();
reloadConnections();
}
datasourceController.showEditDialog(domainId, modelId);
}
}