org.pentaho.platform.dataaccess.datasource.wizard.GwtDatasourceEditorEntryPoint.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.platform.dataaccess.datasource.wizard.GwtDatasourceEditorEntryPoint.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.
*
*
* Created April 21, 2009
* @author rmansoor
*/
package org.pentaho.platform.dataaccess.datasource.wizard;

import java.util.List;

import org.pentaho.agilebi.modeler.ModelerPerspective;
import org.pentaho.agilebi.modeler.gwt.BogoPojo;
import org.pentaho.agilebi.modeler.services.IModelerServiceAsync;
import org.pentaho.agilebi.modeler.services.impl.GwtModelerServiceImpl;
import org.pentaho.database.model.IDatabaseConnection;
import org.pentaho.database.model.IDatabaseType;
import org.pentaho.database.util.DatabaseTypeHelper;
import org.pentaho.gwt.widgets.client.dialogs.GlassPane;
import org.pentaho.gwt.widgets.client.dialogs.GlassPaneNativeListener;
import org.pentaho.metadata.model.Domain;
import org.pentaho.platform.dataaccess.datasource.IDatasourceInfo;
import org.pentaho.platform.dataaccess.datasource.beans.LogicalModelSummary;
import org.pentaho.platform.dataaccess.datasource.modeler.ModelerDialog;
import org.pentaho.platform.dataaccess.datasource.ui.admindialog.GwtDatasourceAdminDialog;
import org.pentaho.platform.dataaccess.datasource.ui.importing.AnalysisImportDialogController;
import org.pentaho.platform.dataaccess.datasource.ui.importing.AnalysisImportDialogModel;
import org.pentaho.platform.dataaccess.datasource.ui.importing.GwtImportDialog;
import org.pentaho.platform.dataaccess.datasource.ui.importing.IOverwritableController;
import org.pentaho.platform.dataaccess.datasource.ui.importing.MetadataImportDialogController;
import org.pentaho.platform.dataaccess.datasource.ui.importing.MetadataImportDialogModel;
import org.pentaho.platform.dataaccess.datasource.ui.selectdialog.GwtDatasourceManageDialog;
import org.pentaho.platform.dataaccess.datasource.ui.selectdialog.GwtDatasourceSelectionDialog;
import org.pentaho.platform.dataaccess.datasource.ui.service.DSWUIDatasourceService;
import org.pentaho.platform.dataaccess.datasource.ui.service.JSUIDatasourceService;
import org.pentaho.platform.dataaccess.datasource.ui.service.JdbcDatasourceService;
import org.pentaho.platform.dataaccess.datasource.ui.service.MetadataUIDatasourceService;
import org.pentaho.platform.dataaccess.datasource.ui.service.MondrianUIDatasourceService;
import org.pentaho.platform.dataaccess.datasource.ui.service.UIDatasourceServiceManager;
import org.pentaho.platform.dataaccess.datasource.utils.WaitPopupUtil;
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.jsni.WAQRTransport;
import org.pentaho.platform.dataaccess.datasource.wizard.models.DatasourceModel;
import org.pentaho.platform.dataaccess.datasource.wizard.service.IXulAsyncDSWDatasourceService;
import org.pentaho.platform.dataaccess.datasource.wizard.service.IXulAsyncDatasourceServiceManager;
import org.pentaho.platform.dataaccess.datasource.wizard.service.gwt.ICsvDatasourceService;
import org.pentaho.platform.dataaccess.datasource.wizard.service.gwt.ICsvDatasourceServiceAsync;
import org.pentaho.platform.dataaccess.datasource.wizard.service.impl.AnalysisDatasourceServiceGwtImpl;
import org.pentaho.platform.dataaccess.datasource.wizard.service.impl.DSWDatasourceServiceGwtImpl;
import org.pentaho.platform.dataaccess.datasource.wizard.service.impl.DatasourceServiceManagerGwtImpl;
import org.pentaho.platform.dataaccess.datasource.wizard.service.impl.MetadataDatasourceServiceGwtImpl;
import org.pentaho.ui.database.event.IConnectionAutoBeanFactory;
import org.pentaho.ui.database.gwt.GwtDatabaseDialog;
import org.pentaho.ui.database.gwt.GwtXulAsyncDatabaseDialectService;
import org.pentaho.ui.xul.XulComponent;
import org.pentaho.ui.xul.XulException;
import org.pentaho.ui.xul.XulServiceCallback;
import org.pentaho.ui.xul.components.XulConfirmBox;
import org.pentaho.ui.xul.gwt.util.AsyncConstructorListener;
import org.pentaho.ui.xul.util.DialogController.DialogListener;
import org.pentaho.ui.xul.util.XulDialogCallback;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteEvent;
import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteHandler;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.web.bindery.autobean.shared.AutoBean;
import com.google.web.bindery.autobean.shared.AutoBeanCodex;

/**
* Creates the singleton datasource wizard and sets up native JavaScript functions to show the wizard.
*/
public class GwtDatasourceEditorEntryPoint implements EntryPoint {

    private static final String OVERWRITE_8 = "8";

    private static final String SUCCESS_3 = "3";

    private EmbeddedWizard wizard;

    // TODO: make this lazily loaded when the modelerMessages issue is fixed
    private ModelerDialog modeler;

    private IXulAsyncDSWDatasourceService datasourceService;

    //  private IXulAsyncConnectionService connectionService;
    private IModelerServiceAsync modelerService;

    private IXulAsyncDatasourceServiceManager datasourceServiceManager;

    private ICsvDatasourceServiceAsync csvService;

    private GwtDatasourceSelectionDialog gwtDatasourceSelectionDialog;

    private GwtDatabaseDialog gwtDatabaseDialog;

    private DatabaseTypeHelper databaseTypeHelper;

    private DatabaseConnectionConverter databaseConnectionConverter;

    private EmbeddedWizard gwtDatasourceEditor;

    private GwtDatasourceManageDialog manageDialog;

    private GwtDatasourceSelectionDialog selectDialog;

    private GwtDatasourceAdminDialog adminDialog;

    private GwtImportDialog importDialog;

    private boolean asyncConstructorDone;

    private boolean hasPermissions;

    private boolean isAdmin;

    private Timer timer;

    //  private GwtXulAsyncDatabaseConnectionService connService = new GwtXulAsyncDatabaseConnectionService();
    private GwtXulAsyncDatabaseDialectService dialectService = new GwtXulAsyncDatabaseDialectService();

    private IConnectionAutoBeanFactory connectionAutoBeanFactory = GWT.create(IConnectionAutoBeanFactory.class);

    public void onModuleLoad() {
        datasourceServiceManager = new DatasourceServiceManagerGwtImpl();
        datasourceServiceManager.isAdmin(new XulServiceCallback<Boolean>() {
            public void error(String message, Throwable error) {
            }

            public void success(Boolean retVal) {
                isAdmin = retVal;
                datasourceService = new DSWDatasourceServiceGwtImpl();
                modelerService = new GwtModelerServiceImpl();
                BogoPojo bogo = new BogoPojo();
                modelerService.gwtWorkaround(bogo, new XulServiceCallback<BogoPojo>() {
                    public void success(BogoPojo retVal) {

                    }

                    public void error(String message, Throwable error) {

                    }
                });

                // only init the app if the user has permissions

                datasourceService.hasPermission(new XulServiceCallback<Boolean>() {
                    public void error(String message, Throwable error) {
                        setupStandardNativeHooks(GwtDatasourceEditorEntryPoint.this);
                        initDashboardButtons(false);
                    }

                    public void success(Boolean retVal) {
                        hasPermissions = retVal;
                        setupStandardNativeHooks(GwtDatasourceEditorEntryPoint.this);
                        if (isAdmin || hasPermissions) {
                            //              connectionService = new ConnectionServiceGwtImpl();
                            csvService = (ICsvDatasourceServiceAsync) GWT.create(ICsvDatasourceService.class);
                            setupPrivilegedNativeHooks(GwtDatasourceEditorEntryPoint.this);
                            loadOverlay("startup.dataaccess");
                        }
                        initDashboardButtons(retVal);
                    }
                });
            }
        });

        XulServiceCallback<List<IDatabaseType>> callback = new XulServiceCallback<List<IDatabaseType>>() {
            public void error(String message, Throwable error) {
                error.printStackTrace();
            }

            public void success(List<IDatabaseType> retVal) {
                databaseTypeHelper = new DatabaseTypeHelper(retVal);
                databaseConnectionConverter = new DatabaseConnectionConverter(databaseTypeHelper);

            }
        };
        dialectService.getDatabaseTypes(callback);

        UIDatasourceServiceManager manager = UIDatasourceServiceManager.getInstance();
        manager.registerService(new JdbcDatasourceService());
        manager.registerService(new MondrianUIDatasourceService(datasourceServiceManager));
        manager.registerService(new MetadataUIDatasourceService(datasourceServiceManager));
        manager.registerService(new DSWUIDatasourceService(datasourceServiceManager));
        manager.getIds(null);

    }

    private native static void loadOverlay(String overlayId) /*-{
                                                             if(!$wnd.mantle_loadOverlay){
                                                             setTimeout(function(){
                                                             @org.pentaho.platform.dataaccess.datasource.wizard.GwtDatasourceEditorEntryPoint::loadOverlay(Ljava/lang/String;)(overlayId);
                                                             }, 200);
                                                             return;
                                                             }
                                                             $wnd.mantle_loadOverlay(overlayId)
                                                             }-*/;

    private native void removeOverlay(String overlayId) /*-{
                                                        if($wnd.mantle_removeOverlay)
                                                        $wnd.mantle_removeOverlay(overlayId)
                                                        }-*/;

    public native void initDashboardButtons(boolean val) /*-{
                                                         if($wnd.initDataAccess){
                                                         $wnd.initDataAccess(val);
                                                         }
                                                         }-*/;

    private native void setupStandardNativeHooks(GwtDatasourceEditorEntryPoint wizard)/*-{
                                                                                      if(!$wnd.pho){
                                                                                      $wnd.pho = {};
                                                                                      }
                                                                                      $wnd.addDataAccessGlassPaneListener = function(callback) {
                                                                                      wizard.@org.pentaho.platform.dataaccess.datasource.wizard.GwtDatasourceEditorEntryPoint::addGlassPaneListener(Lcom/google/gwt/core/client/JavaScriptObject;)(callback);
                                                                                      }
                                                                                          
                                                                                      $wnd.pho.showDatasourceSelectionDialog = function(context, callback) {
                                                                                      wizard.@org.pentaho.platform.dataaccess.datasource.wizard.GwtDatasourceEditorEntryPoint::showSelectionDialog(Ljava/lang/String;Ljava/lang/String;Lcom/google/gwt/core/client/JavaScriptObject;)(context,"true", callback);
                                                                                      }
                                                                                      $wnd.pho.showDatabaseDialog = function(callback) {
                                                                                      wizard.@org.pentaho.platform.dataaccess.datasource.wizard.GwtDatasourceEditorEntryPoint::showDatabaseDialog(Lcom/google/gwt/core/client/JavaScriptObject;)(callback);
                                                                                      }
                                                                                      $wnd.gwtConfirm = function(message, callback, options){
                                                                                      var title = options.title || $wnd.pho_messages.getMessage("prompt","Prompt");
                                                                                      var accept = options.acceptLabel || $wnd.pho_messages.getMessage("okButton","OK");
                                                                                      var cancel = options.cancelLabel || $wnd.pho_messages.getMessage("cancelButton","Cancel");
                                                                                      try{
                                                                                      wizard.@org.pentaho.platform.dataaccess.datasource.wizard.GwtDatasourceEditorEntryPoint::showConfirm(Lcom/google/gwt/core/client/JavaScriptObject;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)(callback, message, title, accept, cancel);
                                                                                      } catch(e) {
                                                                                      // if it fails just show browser prompt
                                                                                      callback.okOk($wnd.confirm(message));
                                                                                      }
                                                                                      }
                                                                                      }-*/;

    private native void setupPrivilegedNativeHooks(GwtDatasourceEditorEntryPoint wizard)/*-{
                                                                                        $wnd.pho.openDatasourceEditor= function(callback, reportingOnlyValid) {
                                                                                        if(typeof reportingOnlyValid == "undefined"){
                                                                                        reportingOnlyValid = true;
                                                                                        }
                                                                                        wizard.@org.pentaho.platform.dataaccess.datasource.wizard.GwtDatasourceEditorEntryPoint::showWizard(ZLcom/google/gwt/core/client/JavaScriptObject;)(reportingOnlyValid, callback);
                                                                                        }
                                                                                        $wnd.pho.openEditDatasourceEditor= function(domainId, modelId, callback, perspective, reportingOnlyValid) {
                                                                                        if(typeof reportingOnlyValid == "undefined"){
                                                                                        reportingOnlyValid = true;
                                                                                        }
                                                                                        wizard.@org.pentaho.platform.dataaccess.datasource.wizard.GwtDatasourceEditorEntryPoint::showWizardEdit(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLcom/google/gwt/core/client/JavaScriptObject;)(domainId, modelId, perspective, reportingOnlyValid, callback);
                                                                                        }
                                                                                        $wnd.pho.deleteModel=function(domainId, modelName, callback) {
                                                                                        wizard.@org.pentaho.platform.dataaccess.datasource.wizard.GwtDatasourceEditorEntryPoint::deleteLogicalModel(Ljava/lang/String;Ljava/lang/String;Lcom/google/gwt/core/client/JavaScriptObject;)(domainId, modelName, callback);
                                                                                        }
                                                                                            
                                                                                        $wnd.pho.showDatasourceManageDialog = function(callback) {
                                                                                        wizard.@org.pentaho.platform.dataaccess.datasource.wizard.GwtDatasourceEditorEntryPoint::showSelectionDialog(Ljava/lang/String;Ljava/lang/String;Lcom/google/gwt/core/client/JavaScriptObject;)("manage", "false", callback);
                                                                                        }
                                                                                        $wnd.pho.showMetadataImportDialog = function(callback) {
                                                                                        wizard.@org.pentaho.platform.dataaccess.datasource.wizard.GwtDatasourceEditorEntryPoint::showMetadataImportDialog(Lcom/google/gwt/core/client/JavaScriptObject;)(callback);
                                                                                        }
                                                                                            
                                                                                        $wnd.pho.showAnalysisImportDialog = function(callback) {
                                                                                        wizard.@org.pentaho.platform.dataaccess.datasource.wizard.GwtDatasourceEditorEntryPoint::showAnalysisImportDialog(Lcom/google/gwt/core/client/JavaScriptObject;)(callback);
                                                                                        }
                                                                                            
                                                                                        $wnd.pho.registerUIDatasourceService = function(jsDatasourceService) {
                                                                                        wizard.@org.pentaho.platform.dataaccess.datasource.wizard.GwtDatasourceEditorEntryPoint::registerDatasourceService(Lcom/google/gwt/core/client/JavaScriptObject;)(jsDatasourceService);
                                                                                        }
                                                                                        }-*/;

    private void registerDatasourceService(JavaScriptObject javascriptObject) {
        JSUIDatasourceService datasourceService = new JSUIDatasourceService(javascriptObject);
        UIDatasourceServiceManager.getInstance().registerService(datasourceService);
    }

    public void showConfirm(final JavaScriptObject callback, String message, String title, String okText,
            String cancelText) throws XulException {
        XulConfirmBox confirm = (XulConfirmBox) wizard.getMainWizardContainer().getDocumentRoot()
                .createElement("confirmbox");
        confirm.setTitle(title);
        confirm.setMessage(message);
        confirm.setAcceptLabel(okText);
        confirm.setCancelLabel(cancelText);
        confirm.addDialogCallback(new XulDialogCallback<String>() {
            public void onClose(XulComponent component, Status status, String value) {
                if (status == XulDialogCallback.Status.ACCEPT) {
                    notifyDialogCallbackSuccess(callback, value);
                }
            }

            public void onError(XulComponent component, Throwable err) {
                notifyDialogCallbackError(callback, err.getMessage());
            }
        });
        confirm.open();
    }

    /**
     * used to handle the overwrite in repository message
     * @param parentFormPanel
     * @param message
     * @param controller
     */
    public void overwriteFileDialog(final FormPanel parentFormPanel, String message,
            final IOverwritableController controller) {
        //Experiment
        XulConfirmBox confirm = null;
        try {
            confirm = (XulConfirmBox) wizard.getMainWizardContainer().getDocumentRoot().createElement("confirmbox");
        } catch (XulException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        confirm.setTitle("Confirmation");
        confirm.setMessage(message);
        confirm.setAcceptLabel("Ok");
        confirm.setCancelLabel("Cancel");
        confirm.addDialogCallback(new XulDialogCallback<String>() {
            public void onClose(XulComponent component, Status status, String value) {
                if (status == XulDialogCallback.Status.ACCEPT) {
                    controller.setOverwrite(true);
                    controller.removeHiddenPanels();
                    controller.buildAndSetParameters();
                    parentFormPanel.submit();
                }
            }

            public void onError(XulComponent component, Throwable err) {
                return;
            }
        });
        confirm.open();
    }

    @SuppressWarnings("unused")
    private void addGlassPaneListener(JavaScriptObject obj) {
        GlassPane.getInstance().addGlassPaneListener(new GlassPaneNativeListener(obj));
    }

    public void showWizard(final boolean reportingOnlyValid, final DialogListener<Domain> listener) {

        if (wizard == null) {
            wizard = new EmbeddedWizard(false);
            wizard.setDatasourceService(datasourceService);
            //      wizard.setConnectionService(connectionService);
            wizard.setCsvDatasourceService(csvService);
            wizard.setReportingOnlyValid(reportingOnlyValid);
            wizard.init(new AsyncConstructorListener<EmbeddedWizard>() {
                @Override
                public void asyncConstructorDone(EmbeddedWizard source) {
                    wizard.addDialogListener(listener);
                    wizard.showDialog();
                }
            });
        } else {
            wizard.addDialogListener(listener);
            wizard.setReportingOnlyValid(reportingOnlyValid);
            wizard.showDialog();
        }
    }

    /**
    * Entry-point from Javascript, responds to provided callback with the following:
    *
    * onOk(String JSON, String mqlString);
    * onCancel();
    * onError(String errorMessage);
    *
    * @param callback
    *
    */
    private void showWizard(final boolean reportingOnlyValid, final JavaScriptObject callback) {

        final DialogListener<Domain> listener = new DialogListener<Domain>() {
            public void onDialogCancel() {
                wizard.removeDialogListener(this);
                if (callback != null) {
                    notifyCallbackCancel(callback);
                }
            }

            public void onDialogAccept(final Domain domain) {
                MessageHandler.getInstance().closeWaitingDialog();
                wizard.removeDialogListener(this);
                WAQRTransport transport = WAQRTransport.createFromMetadata(domain);
                notifyCallbackSuccess(callback, true, transport);
                notifyDialogCallbackSuccess(callback, domain.getId());
            }

            public void onDialogReady() {
                if (callback != null) {
                    notifyCallbackReady(callback);
                }
            }

            @Override
            public void onDialogError(String errorMessage) {
                notifyCallbackError(callback, errorMessage);
            }
        };
        showWizard(reportingOnlyValid, listener);

    }

    public void showWizardEdit(final String domainId, final String modelId, boolean reportingOnlyValid,
            final DialogListener<Domain> listener) {
        showWizardEdit(domainId, modelId, ModelerPerspective.ANALYSIS.name(), reportingOnlyValid, listener);
    }

    public void showWizardEdit(final String domainId, final String modelId, final String perspective,
            boolean reportingOnlyValid, final DialogListener<Domain> listener) {
        final String modelPerspective;
        if (perspective == null) {
            modelPerspective = ModelerPerspective.ANALYSIS.name();
        } else {
            modelPerspective = perspective;
        }

        modeler = ModelerDialog.getInstance(wizard, new AsyncConstructorListener<ModelerDialog>() {
            public void asyncConstructorDone(ModelerDialog dialog) {

                ModelerPerspective modelerPerspective;
                try {
                    modelerPerspective = ModelerPerspective.valueOf(modelPerspective);
                } catch (IllegalArgumentException e) {
                    modelerPerspective = ModelerPerspective.ANALYSIS;
                }
                dialog.addDialogListener(listener);
                dialog.showDialog(domainId, modelId, modelerPerspective);
            }
        });

    }

    private void showWizardEdit(final String domainId, final String modelId, boolean reportingOnlyValid,
            final JavaScriptObject callback) {
        showWizardEdit(domainId, modelId, ModelerPerspective.ANALYSIS.name(), reportingOnlyValid, callback);
    }

    /**
    * edit entry-point from Javascript, responds to provided callback with the following:
    *
    * onOk(String JSON, String mqlString);
    * onCancel();
    * onError(String errorMessage);
    *
    * @param callback
    *
    */
    private void showWizardEdit(final String domainId, final String modelId, final String perspective,
            boolean reportingOnlyValid, final JavaScriptObject callback) {
        final DialogListener<Domain> listener = new DialogListener<Domain>() {
            public void onDialogCancel() {
                modeler.removeDialogListener(this);
                if (callback != null) {
                    notifyCallbackCancel(callback);
                }
            }

            public void onDialogAccept(final Domain domain) {
                modeler.removeDialogListener(this);
                WAQRTransport transport = WAQRTransport.createFromMetadata(domain);
                notifyCallbackSuccess(callback, true, transport);
            }

            public void onDialogReady() {
                if (callback != null) {
                    notifyCallbackReady(callback);
                }
            }

            @Override
            public void onDialogError(String errorMessage) {
                notifyCallbackError(callback, errorMessage);
            }
        };
        showWizardEdit(domainId, modelId, perspective, reportingOnlyValid, listener);
    }

    /**
    * Deletes the selected model
    *
    * onOk(Boolean value);
    * onCancel();
    * onError(String errorMessage);
    *
    * @param callback
    *
    */
    private void deleteLogicalModel(String domainId, String modelName, final JavaScriptObject callback) {
        datasourceService.deleteLogicalModel(domainId, modelName, new XulServiceCallback<Boolean>() {
            public void success(Boolean value) {
                notifyCallbackSuccess(callback, value);
            }

            public void error(String s, Throwable throwable) {
                notifyCallbackError(callback, throwable.getMessage());
            }
        });
    }

    private void showAdminDialog(final DialogListener<IDatasourceInfo> listener) {
        if (adminDialog == null) {
            final AsyncConstructorListener<GwtDatasourceAdminDialog> constructorListener = getAdminDialogListener(
                    listener);
            asyncConstructorDone = false;
            adminDialog = new GwtDatasourceAdminDialog(datasourceServiceManager, modelerService, datasourceService,
                    this, constructorListener);
        } else {
            adminDialog.addDialogListener(listener);
            adminDialog.showDialog();
        }
    }

    @SuppressWarnings("unused")
    private void showAdminDialog(final JavaScriptObject callback) {

        final DialogListener<IDatasourceInfo> listener = new DialogListener<IDatasourceInfo>() {
            public void onDialogCancel() {
                adminDialog.removeDialogListener(this);
                asyncConstructorDone = false;
                notifyCallbackCancel(callback);
            }

            public void onDialogAccept(final IDatasourceInfo genericDatasourceInfo) {
                adminDialog.removeDialogListener(this);
                asyncConstructorDone = false;
                notifyCallbackSuccess(callback, genericDatasourceInfo.getId(), genericDatasourceInfo.getType());
            }

            public void onDialogReady() {
            }

            @Override
            public void onDialogError(String errorMessage) {
                notifyCallbackError(callback, errorMessage);

            }
        };
        showAdminDialog(listener);
    }

    private void showSelectionOrAdminDialog(final String context, final String selectDatasource,
            final JavaScriptObject callback, final DialogListener<LogicalModelSummary> listener) {
        if ("manage".equals(context) && isAdmin) {
            showAdminDialog(callback);
        } else {
            showSelectionDialog(context, Boolean.valueOf(selectDatasource), listener);
        }
    }

    @SuppressWarnings("unused")
    private void showSelectionDialog(final String context, final String selectDatasource,
            final JavaScriptObject callback) {
        final DialogListener<LogicalModelSummary> listener = new DialogListener<LogicalModelSummary>() {
            public void onDialogCancel() {
                selectDialog.removeDialogListener(this);
                asyncConstructorDone = false;
                notifyCallbackCancel(callback);
            }

            public void onDialogAccept(final LogicalModelSummary logicalModelSummary) {
                selectDialog.removeDialogListener(this);
                asyncConstructorDone = false;
                notifyCallbackSuccess(callback, logicalModelSummary.getDomainId(), logicalModelSummary.getModelId(),
                        logicalModelSummary.getModelName());
            }

            public void onDialogReady() {
            }

            public void onDialogError(String errorMessage) {
                notifyDialogCallbackError(callback, errorMessage);
            }
        };

        if (wizard == null && this.hasPermissions) {
            WaitPopupUtil.showWaitPopup();

            wizard = new EmbeddedWizard(false);

            wizard.setDatasourceService(datasourceService);
            //      wizard.setConnectionService(connectionService);
            wizard.setCsvDatasourceService(csvService);
            wizard.init(new AsyncConstructorListener<EmbeddedWizard>() {
                public void asyncConstructorDone(EmbeddedWizard source) {
                    showSelectionOrAdminDialog(context, selectDatasource, callback, listener);
                    WaitPopupUtil.hideWaitPopup();
                }
            });
        } else {
            showSelectionOrAdminDialog(context, selectDatasource, callback, listener);
        }
    }

    private void showMetadataImportDialog(final JavaScriptObject callback) {
        final DialogListener<MetadataImportDialogModel> listener = new DialogListener<MetadataImportDialogModel>() {

            public void onDialogCancel() {
            }

            public void onDialogAccept(final MetadataImportDialogModel importDialogModel) {

                final MetadataImportDialogController controller = importDialog.getMetadataImportDialogController();

                MetadataDatasourceServiceGwtImpl service = new MetadataDatasourceServiceGwtImpl();

                service.importMetadataDatasource(importDialogModel.getDomainId(),
                        importDialogModel.getUploadedFile(), importDialogModel.getLocalizedBundleEntries(),
                        new XulServiceCallback<String>() {

                            @Override
                            public void success(String retVal) {
                                notifyDialogCallbackSuccess(callback, retVal);
                            }

                            @Override
                            public void error(String message, Throwable error) {
                                notifyDialogCallbackError(callback, message);
                            }
                        });

            }

            public void onDialogReady() {
            }

            @Override
            public void onDialogError(String errorMessage) {
                // TODO Auto-generated method stub

            }
        };
        showMetadataImportDialog(listener);
    }

    public void showMetadataImportDialog(final DialogListener listener) {
        final DialogListener<MetadataImportDialogModel> importDialoglistener = new DialogListener<MetadataImportDialogModel>() {

            public void onDialogCancel() {
            }

            public void onDialogAccept(final MetadataImportDialogModel importDialogModel) {

                final MetadataImportDialogController controller = importDialog.getMetadataImportDialogController();
                final FormPanel metaDataFormPanel = controller.getFormPanel();
                controller.removeHiddenPanels();
                controller.buildAndSetParameters();
                metaDataFormPanel.removeFromParent();
                RootPanel.get().add(metaDataFormPanel);

                metaDataFormPanel.addSubmitCompleteHandler(new SubmitCompleteHandler() {

                    @Override
                    public void onSubmitComplete(SubmitCompleteEvent event) {
                        String results = event.getResults();
                        String message = controller.convertToNLSMessage(results, controller.getFileName());

                        if (SUCCESS_3.equals(results)) {
                            metaDataFormPanel.removeFromParent();
                            listener.onDialogAccept(null);
                        } else {
                            if (OVERWRITE_8.equals(results)) {
                                overwriteFileDialog(metaDataFormPanel, message, controller);
                            } else {
                                listener.onDialogError(message);
                            }
                        }
                    }

                });
                metaDataFormPanel.submit();
            }

            public void onDialogReady() {
            }

            @Override
            public void onDialogError(String errorMessage) {
                listener.onDialogError(errorMessage);
            }
        };

        final AsyncConstructorListener<GwtImportDialog> constructorListener = new AsyncConstructorListener<GwtImportDialog>() {

            public void asyncConstructorDone(GwtImportDialog dialog) {
                dialog.showMetadataImportDialog(importDialoglistener);
            }
        };

        if (importDialog == null) {
            importDialog = new GwtImportDialog(constructorListener);
        } else {
            importDialog.showMetadataImportDialog(importDialoglistener);
        }
    }

    private void showAnalysisImportDialog(final JavaScriptObject callback) {
        final DialogListener<AnalysisImportDialogModel> listener = new DialogListener<AnalysisImportDialogModel>() {

            public void onDialogCancel() {
            }

            public void onDialogAccept(final AnalysisImportDialogModel importDialogModel) {

                AnalysisDatasourceServiceGwtImpl service = new AnalysisDatasourceServiceGwtImpl();
                service.importAnalysisDatasource(importDialogModel.getUploadedFile(),
                        importDialogModel.getConnection().getName(), importDialogModel.getParameters(),
                        new XulServiceCallback<String>() {

                            @Override
                            public void success(String retVal) {
                                notifyDialogCallbackSuccess(callback, retVal);
                            }

                            @Override
                            public void error(String message, Throwable error) {
                                notifyDialogCallbackError(callback, message);
                            }
                        });

            }

            public void onDialogReady() {
            }

            @Override
            public void onDialogError(String errorMessage) {
                // TODO Auto-generated method stub

            }
        };
        showAnalysisImportDialog(listener);
    }

    public void showEditAnalysisDialog(final DialogListener listener, final IDatasourceInfo datasourceInfo) {
        final DialogListener<AnalysisImportDialogModel> importDialoglistener = new DialogListener<AnalysisImportDialogModel>() {

            public void onDialogCancel() {
                final AnalysisImportDialogController controller = importDialog.getAnalysisImportDialogController();
                final FormPanel analysisDataFormPanel = controller.getFormPanel();
                controller.removeHiddenPanels();
                controller.buildAndSetParameters();
                analysisDataFormPanel.removeFromParent();
                RootPanel.get().add(analysisDataFormPanel);
            }

            public void onDialogAccept(final AnalysisImportDialogModel importDialogModel) {
                final AnalysisImportDialogController controller = importDialog.getAnalysisImportDialogController();
                final FormPanel analysisDataFormPanel = controller.getFormPanel();
                controller.removeHiddenPanels();
                controller.buildAndSetParameters(true);
                analysisDataFormPanel.removeFromParent();
                RootPanel.get().add(analysisDataFormPanel);
                analysisDataFormPanel.addSubmitCompleteHandler(new SubmitCompleteHandler() {

                    @Override
                    public void onSubmitComplete(SubmitCompleteEvent event) {
                        String results = event.getResults();
                        String message = controller.convertToNLSMessage(results, controller.getFileName());

                        if (!SUCCESS_3.equals(results)) {
                            if (OVERWRITE_8.equals(results)) {
                                overwriteFileDialog(analysisDataFormPanel, message, controller);
                            } else {
                                listener.onDialogError(message);
                            }
                        } else {
                            analysisDataFormPanel.removeFromParent();
                            listener.onDialogAccept(null);
                        }
                    }
                });
                analysisDataFormPanel.submit();
            }

            public void onDialogReady() {
            }

            public void onDialogError(String errorMessage) {
                listener.onDialogError(errorMessage);
            }
        };

        final AsyncConstructorListener<GwtImportDialog> constructorListener = new AsyncConstructorListener<GwtImportDialog>() {

            public void asyncConstructorDone(GwtImportDialog dialog) {
                dialog.showAnalysisImportDialog(importDialoglistener, datasourceInfo);
            }
        };

        if (importDialog == null) {
            importDialog = new GwtImportDialog(constructorListener);
        } else {
            importDialog.showAnalysisImportDialog(importDialoglistener, datasourceInfo);
        }
    }

    public void showAnalysisImportDialog(final DialogListener listener) {
        final DialogListener<AnalysisImportDialogModel> importDialoglistener = new DialogListener<AnalysisImportDialogModel>() {

            public void onDialogCancel() {
                final AnalysisImportDialogController controller = importDialog.getAnalysisImportDialogController();
                final FormPanel analysisDataFormPanel = controller.getFormPanel();
                controller.removeHiddenPanels();
                controller.buildAndSetParameters();
                analysisDataFormPanel.removeFromParent();
                RootPanel.get().add(analysisDataFormPanel);
            }

            public void onDialogAccept(final AnalysisImportDialogModel importDialogModel) {
                final AnalysisImportDialogController controller = importDialog.getAnalysisImportDialogController();
                final FormPanel analysisDataFormPanel = controller.getFormPanel();
                controller.removeHiddenPanels();
                controller.buildAndSetParameters();
                analysisDataFormPanel.removeFromParent();
                RootPanel.get().add(analysisDataFormPanel);
                analysisDataFormPanel.addSubmitCompleteHandler(new SubmitCompleteHandler() {

                    @Override
                    public void onSubmitComplete(SubmitCompleteEvent event) {
                        String results = event.getResults();
                        String message = controller.convertToNLSMessage(results, controller.getFileName());

                        if (!SUCCESS_3.equals(results)) {
                            if (OVERWRITE_8.equals(results)) {
                                overwriteFileDialog(analysisDataFormPanel, message, controller);
                            } else {
                                listener.onDialogError(message);
                            }
                        } else {
                            analysisDataFormPanel.removeFromParent();
                            listener.onDialogAccept(null);
                        }
                    }
                });
                analysisDataFormPanel.submit();
            }

            public void onDialogReady() {
            }

            @Override
            public void onDialogError(String errorMessage) {
                listener.onDialogError(errorMessage);

            }
        };

        final AsyncConstructorListener<GwtImportDialog> constructorListener = new AsyncConstructorListener<GwtImportDialog>() {

            public void asyncConstructorDone(GwtImportDialog dialog) {
                dialog.showAnalysisImportDialog(importDialoglistener);
            }
        };

        if (importDialog == null) {
            importDialog = new GwtImportDialog(constructorListener);
        } else {
            importDialog.showAnalysisImportDialog(importDialoglistener);
        }
    }

    private void showSelectionDialog(final String context, final boolean selectDs,
            final DialogListener<LogicalModelSummary> listener) {
        if (selectDs) {
            // selection dialog
            if (selectDialog == null) {

                final AsyncConstructorListener<GwtDatasourceSelectionDialog> constructorListener = getSelectionDialogListener(
                        listener);
                asyncConstructorDone = false;
                selectDialog = new GwtDatasourceSelectionDialog(context, datasourceService, wizard,
                        constructorListener);

            } else {
                selectDialog.addDialogListener(listener);
                selectDialog.reset();
                selectDialog.setContext(context);
                selectDialog.showDialog();
            }

        } else {
            // manage dialog
            if (manageDialog == null) {

                final AsyncConstructorListener<GwtDatasourceSelectionDialog> constructorListener = getSelectionDialogListener(
                        listener);
                asyncConstructorDone = false;
                manageDialog = new GwtDatasourceManageDialog(datasourceService, wizard, constructorListener);
            } else {
                manageDialog.reset();
                manageDialog.showDialog();
            }
        }
    }

    private AsyncConstructorListener<GwtDatasourceSelectionDialog> getSelectionDialogListener(
            final DialogListener<LogicalModelSummary> listener) {
        return new AsyncConstructorListener<GwtDatasourceSelectionDialog>() {

            public void asyncConstructorDone(GwtDatasourceSelectionDialog dialog) {
                dialog.removeDialogListener(listener);
                dialog.addDialogListener(listener);
                if (!asyncConstructorDone) {
                    dialog.showDialog();
                }
                asyncConstructorDone = true;
            }
        };

    }

    private AsyncConstructorListener<GwtDatasourceAdminDialog> getAdminDialogListener(
            final DialogListener<IDatasourceInfo> listener) {
        return new AsyncConstructorListener<GwtDatasourceAdminDialog>() {

            public void asyncConstructorDone(GwtDatasourceAdminDialog dialog) {
                dialog.removeDialogListener(listener);
                dialog.addDialogListener(listener);
                if (!asyncConstructorDone) {
                    dialog.showDialog();
                }
                asyncConstructorDone = true;
            }
        };

    }

    private void showDatabaseDialog(final JavaScriptObject callback) {

        final DialogListener<IDatabaseConnection> listener = new DialogListener<IDatabaseConnection>() {
            public void onDialogCancel() {
                if (callback != null) {
                    notifyCallbackCancel(callback);
                }
            }

            public void onDialogAccept(final IDatabaseConnection connection) {
                if (callback != null) {
                    notifyCallbackSuccess(callback, true);
                }
            }

            public void onDialogReady() {
                if (callback != null) {
                    notifyCallbackCancel(callback);
                }
            }

            @Override
            public void onDialogError(String errorMessage) {
                if (callback != null) {
                    notifyCallbackError(callback, errorMessage);
                }
            }
        };
        showDatabaseDialog(listener);
    }

    public void showDatabaseDialog(final DialogListener<IDatabaseConnection> listener) {
        ConnectionController connectionController = wizard.getConnectionController();
        connectionController.init();
        DatasourceModel datasourceModel = new DatasourceModel();
        connectionController.setDatasourceModel(datasourceModel);
        connectionController.showAddConnectionDialog(listener);
    }

    public void showEditDatabaseDialog(final DialogListener dialogListener, final String databaseName) {
        String url = ConnectionController.getServiceURL("get", new String[][] { { "name", databaseName } });
        RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url);
        builder.setHeader("Accept", "application/json");

        try {
            builder.sendRequest(null, new RequestCallback() {

                public void onError(Request request, Throwable exception) {
                    Window.alert(exception.toString());
                }

                @SuppressWarnings("deprecation")
                public void onResponseReceived(Request request, Response response) {
                    IDatabaseConnection conn = null;
                    if (response.getStatusCode() == Response.SC_OK) {
                        AutoBean<IDatabaseConnection> bean = AutoBeanCodex.decode(connectionAutoBeanFactory,
                                IDatabaseConnection.class, response.getText());
                        conn = bean.as();
                    }

                    ConnectionController connectionController = wizard.getConnectionController();
                    connectionController.init();
                    DatasourceModel datasourceModel = connectionController.getDatasourceModel();
                    if (datasourceModel == null) {
                        datasourceModel = new DatasourceModel();
                    }
                    datasourceModel.setSelectedRelationalConnection(conn);
                    // This is important for edit mode of datasource model
                    datasourceModel.setEditing(true);
                    connectionController.setDatasourceModel(datasourceModel);
                    connectionController.showEditConnectionDialog(dialogListener);
                }
            });
        } catch (Exception e) {
            Window.alert("Cannot edit datasource");
        }
    }

    private native void notifyCallbackSuccess(JavaScriptObject callback, String domainId, String modelId,
            String modelName) /*-{
                              callback.onFinish(domainId, modelId, modelName);
                              }-*/;

    private native void notifyCallbackSuccess(JavaScriptObject callback, String domainId, String modelId) /*-{
                                                                                                          callback.onFinish(domainId, modelId);
                                                                                                          }-*/;

    private native void notifyCallbackSuccess(JavaScriptObject callback, Boolean value,
            WAQRTransport transport)/*-{
                                    callback.onFinish(value, transport);
                                    }-*/;

    private native void notifyCallbackSuccess(JavaScriptObject callback, Boolean value)/*-{
                                                                                       callback.onFinish(value);
                                                                                       }-*/;

    private native void notifyCallbackError(JavaScriptObject callback, String error)/*-{
                                                                                    callback.onError(error);
                                                                                    }-*/;

    private native void notifyCallbackCancel(JavaScriptObject callback)/*-{
                                                                       callback.onCancel();
                                                                       }-*/;

    private native void notifyCallbackReady(JavaScriptObject callback)/*-{
                                                                      callback.onReady();
                                                                      }-*/;

    private native void notifyDialogCallbackSuccess(JavaScriptObject callback, Object value)/*-{
                                                                                            callback.onOk(value);
                                                                                            }-*/;

    private native void notifyDialogCallbackCancel(JavaScriptObject callback)/*-{
                                                                             callback.onCancel();
                                                                             }-*/;

    private native void notifyDialogCallbackError(JavaScriptObject callback, String error)/*-{
                                                                                          callback.onError(error);
                                                                                          }-*/;

}