/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2016 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ******************************************************************************/ package org.pentaho.di.ui.core.database.dialog; import java.util.Locale; import java.util.MissingResourceException; import java.util.ResourceBundle; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.widgets.Shell; import org.pentaho.di.core.database.DatabaseMeta; import org.pentaho.di.core.logging.LogChannel; import org.pentaho.di.core.logging.LogChannelInterface; import org.pentaho.di.core.util.Utils; import org.pentaho.di.i18n.BaseMessages; import org.pentaho.di.i18n.GlobalMessages; import org.pentaho.di.i18n.LanguageChoice; import org.pentaho.di.repository.ObjectId; import org.pentaho.di.ui.core.dialog.ErrorDialog; import org.pentaho.di.ui.xul.KettleXulLoader; import org.pentaho.ui.database.DatabaseConnectionDialog; import org.pentaho.ui.xul.XulComponent; import org.pentaho.ui.xul.XulDomContainer; import org.pentaho.ui.xul.XulException; import org.pentaho.ui.xul.containers.XulDialog; import org.pentaho.ui.xul.containers.XulTree; public class XulDatabaseDialog { private static Class<?> PKG = XulDatabaseDialog.class; // for i18n purposes, needed by Translator2!! private DatabaseMeta databaseMeta; /** * The original objectId of the databaseMeta before it was edited, possibly null. */ private ObjectId databaseMetaObjectId; protected Shell shell; private Shell parentShell; private String databaseName; private java.util.List<DatabaseMeta> databases; private boolean modalDialog; DataOverrideHandler dataHandler = null; private LogChannelInterface log; private static final String EVENT_ID = "dataHandler"; private static final String MESSAGES = "org.pentaho.di.ui.core.database.dialog.messages.messages"; private static final String DIALOG_FRAGMENT_FILE = "/feature_override.xul"; private static final String FRAGMENT_ID = "test-button-box"; private static final String EXTENDED_WIDGET_CLASSNAME = "org.pentaho.di.ui.core.database.dialog.tags.ExtTextbox"; private static final String EXTENDED_WIDGET_ID = "VARIABLETEXTBOX"; private DatabaseConnectionDialog databaseDialogInstance; private XulDialog xulDialogComponent; public XulDatabaseDialog( Shell parent ) { parentShell = parent; databases = null; log = new LogChannel( "XulDatabaseDialog" ); } /** * Opens the XUL database dialog * * @return databaseName (or NULL on error or cancel) TODO: Fix deprecation warning in v3.2 by using the new dialog */ public String open() { if ( databaseDialogInstance == null ) { createDialog(); } try { // PDI-5088 clear previous options selections since we are re-using the dialog XulTree tree = (XulTree) xulDialogComponent.getDocument().getRootElement().getElementById( "options-parameter-tree" ); tree.getRootChildren().removeAll(); dataHandler.setData( databaseMeta ); xulDialogComponent.show(); // Attention: onload: loadConnectionData() is called here the second time, see above // for first time // caught with a HACK in DataHandler.loadConnectionData() databaseMeta = (DatabaseMeta) dataHandler.getData(); // keep the original id if ( databaseMeta != null ) { databaseMeta.setObjectId( databaseMetaObjectId ); databaseName = Utils.isEmpty( databaseMeta.getName() ) ? null : databaseMeta.getName(); } else { databaseName = null; } } catch ( Exception e ) { new ErrorDialog( parentShell, BaseMessages.getString( PKG, "XulDatabaseDialog.Error.Title" ), BaseMessages .getString( PKG, "XulDatabaseDialog.Error.Dialog" ), e ); return null; } return databaseName; } @SuppressWarnings( "deprecation" ) private void createDialog() { XulDomContainer container = null; try { databaseDialogInstance = new DatabaseConnectionDialog(); databaseDialogInstance.registerClass( EXTENDED_WIDGET_ID, EXTENDED_WIDGET_CLASSNAME ); /* * Attention: onload: loadConnectionData() is called here the first time, see below for second time */ container = databaseDialogInstance.getSwtInstance( new KettleXulLoader(), parentShell ); container.addEventHandler( EVENT_ID, DataOverrideHandler.class.getName() ); dataHandler = (DataOverrideHandler) container.getEventHandler( EVENT_ID ); if ( databaseMeta != null ) { dataHandler.setData( databaseMeta ); } dataHandler.setDatabases( databases ); dataHandler.getControls(); } catch ( XulException e ) { new ErrorDialog( parentShell, BaseMessages.getString( PKG, "XulDatabaseDialog.Error.Title" ), BaseMessages .getString( PKG, "XulDatabaseDialog.Error.HandleXul" ), e ); return; } try { // Inject the button panel that contains the "Feature List" and "Explore" buttons XulComponent boxElement = container.getDocumentRoot().getElementById( FRAGMENT_ID ); XulComponent parentElement = boxElement.getParent(); ResourceBundle res = null; Locale primaryLocale = GlobalMessages.getLocale(); Locale failOverLocale = LanguageChoice.getInstance().getFailoverLocale(); try { res = GlobalMessages.getBundle( primaryLocale, MESSAGES ); } catch ( MissingResourceException e ) { try { res = GlobalMessages.getBundle( failOverLocale, MESSAGES ); } catch ( MissingResourceException e2 ) { res = null; log.logError( BaseMessages.getString( PKG, "XulDatabaseDialog.Error.ResourcesNotFound.Title" ), BaseMessages .getString( PKG, "XulDatabaseDialog.Error.ResourcesNotFound", primaryLocale == null ? "" : primaryLocale.toString(), failOverLocale == null ? "" : failOverLocale.toString() ), e2 ); } } XulDomContainer fragmentContainer = null; String pkg = getClass().getPackage().getName().replace( '.', '/' ); // Kludge: paths of execution do not account for a null resourcebundle gracefully, need // to check for it here. if ( res != null ) { fragmentContainer = container.loadFragment( pkg.concat( DIALOG_FRAGMENT_FILE ), res ); } else { fragmentContainer = container.loadFragment( pkg.concat( DIALOG_FRAGMENT_FILE ) ); } XulComponent newBox = fragmentContainer.getDocumentRoot().getFirstChild(); parentElement.replaceChild( boxElement, newBox ); } catch ( Exception e ) { new ErrorDialog( parentShell, BaseMessages.getString( PKG, "XulDatabaseDialog.Error.Title" ), BaseMessages .getString( PKG, "XulDatabaseDialog.Error.HandleXul" ), e ); return; } try { xulDialogComponent = (XulDialog) container.getDocumentRoot().getRootElement(); parentShell.addDisposeListener( new DisposeListener() { public void widgetDisposed( DisposeEvent arg0 ) { xulDialogComponent.hide(); } } ); } catch ( Exception e ) { new ErrorDialog( parentShell, BaseMessages.getString( PKG, "XulDatabaseDialog.Error.Title" ), BaseMessages .getString( PKG, "XulDatabaseDialog.Error.Dialog" ), e ); return; } } public void setDatabaseMeta( DatabaseMeta dbMeta ) { databaseMeta = dbMeta; if ( dbMeta != null ) { databaseMetaObjectId = databaseMeta.getObjectId(); databaseName = databaseMeta.getDisplayName(); } } public DatabaseMeta getDatabaseMeta() { return databaseMeta; } public void setDatabases( java.util.List<DatabaseMeta> databases ) { this.databases = databases; } /** * @return the modalDialog */ public boolean isModalDialog() { return modalDialog; } /** * @param modalDialog * the modalDialog to set */ public void setModalDialog( boolean modalDialog ) { this.modalDialog = modalDialog; } }