/*! * 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 (c) 2002-2017 Pentaho Corporation.. All rights reserved. */ 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.RequestException; 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 OVERWRITE__CATALOG_7 = "7"; 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 final String url = GWT.getHostPageBaseURL() + "plugin/data-access/api/permissions/hasDataAccess"; //$NON-NLS-1$ RequestBuilder builder = new RequestBuilder( RequestBuilder.GET, url ); builder.setHeader( "accept", "application/json" ); builder.setHeader( "If-Modified-Since", "01 Jan 1970 00:00:00 GMT" ); try { builder.sendRequest( null, new RequestCallback() { public void onError( Request request, Throwable exception ) { setupStandardNativeHooks( GwtDatasourceEditorEntryPoint.this ); initDashboardButtons( false ); } public void onResponseReceived( Request request, Response response ) { hasPermissions = new Boolean( response.getText() ); setupStandardNativeHooks( GwtDatasourceEditorEntryPoint.this ); if ( hasPermissions ) { csvService = (ICsvDatasourceServiceAsync) GWT.create( ICsvDatasourceService.class ); setupPrivilegedNativeHooks( GwtDatasourceEditorEntryPoint.this ); loadOverlay( "startup.dataaccess" ); } initDashboardButtons( hasPermissions ); } } ); } catch ( RequestException e ) { // TODO Auto-generated catch block } } } ); 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 static native 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) { return wizard.@org.pentaho.platform.dataaccess.datasource.wizard.GwtDatasourceEditorEntryPoint::addGlassPaneListener(Lcom/google/gwt/core/client/JavaScriptObject;)(callback); } $wnd.removeDataAccessGlassPaneListenerById = function(uuid) { wizard.@org.pentaho.platform.dataaccess.datasource.wizard.GwtDatasourceEditorEntryPoint::removeGlassPaneListenerById(Ljava/lang/String;)(uuid); } $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(); } private String addGlassPaneListener( JavaScriptObject obj ) { return GlassPane.getInstance().addGlassPaneListener( new GlassPaneNativeListener( obj ) ); } private void removeGlassPaneListenerById( String uuid ) { GlassPane.getInstance().removeGlassPaneListenerById( uuid ); } 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: * <p> * 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: * <p> * 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 * <p> * 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(); } } 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 || hasPermissions ) ) { showAdminDialog( callback ); } else { showSelectionDialog( context, Boolean.valueOf( selectDatasource ), listener ); } } 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 ) { 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() { final MetadataImportDialogController controller = importDialog.getMetadataImportDialogController(); final FormPanel analysisDataFormPanel = controller.getFormPanel(); controller.removeHiddenPanels(); controller.buildAndSetParameters(); analysisDataFormPanel.removeFromParent(); RootPanel.get().add( analysisDataFormPanel ); } 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 ) || OVERWRITE__CATALOG_7.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 ) || OVERWRITE__CATALOG_7.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 = connectionController.getDatasourceModel(); if ( datasourceModel == null ) { datasourceModel = new DatasourceModel(); } connectionController.setDatasourceModel( datasourceModel ); connectionController.showAddConnectionDialog( listener ); } public void showEditDatabaseDialog( final DialogListener dialogListener, final String databaseName ) { String cacheBuster = String.valueOf( new java.util.Date().getTime() ); String url = ConnectionController.getServiceURL( "get", new String[][] { { "name", databaseName }, { "ts", cacheBuster } } ); 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, conn ); } } ); } 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); }-*/; }