/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2015 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.ui.database.event; import java.io.InputStream; import org.pentaho.di.core.database.DatabaseInterface; import org.pentaho.di.core.database.DatabaseMeta; import org.pentaho.di.core.plugins.DatabasePluginType; import org.pentaho.di.core.plugins.PluginRegistry; import org.pentaho.ui.database.Messages; import org.pentaho.ui.xul.XulComponent; import org.pentaho.ui.xul.XulDomContainer; import org.pentaho.ui.xul.XulException; import org.pentaho.ui.xul.components.XulMessageBox; import org.pentaho.ui.xul.components.XulTextbox; import org.pentaho.ui.xul.containers.XulListbox; import org.pentaho.ui.xul.impl.AbstractXulEventHandler; /** * Fragment handler deals with the logistics of replacing a portion of the dialog from a XUL fragment when the * combination of database connection type and database access method calls for a replacement. * * @author gmoran * @created Mar 19, 2008 */ public class FragmentHandler extends AbstractXulEventHandler { private XulListbox connectionBox; private XulListbox accessBox; private String packagePath = "org/pentaho/ui/database/"; public FragmentHandler() { } protected void loadDatabaseOptionsFragment( String fragmentUri ) throws XulException { XulComponent groupElement = document.getElementById( "database-options-box" ); XulComponent parentElement = groupElement.getParent(); XulDomContainer fragmentContainer; try { // Get new group box fragment ... // This will effectively set up the SWT parent child relationship... fragmentContainer = this.xulDomContainer.loadFragment( fragmentUri, Messages.getBundle() ); XulComponent newGroup = fragmentContainer.getDocumentRoot().getFirstChild(); parentElement.replaceChild( groupElement, newGroup ); } catch ( XulException e ) { e.printStackTrace(); throw e; } } /** * This method handles the resource-like loading of the XUL fragment definitions based on connection type and access * method. If there is a common definition, and no connection specific override definition, then the common definition * is used. Connection specific definition resources follow the naming pattern [connection type code]_[access * method].xul. */ public void refreshOptions() { connectionBox = (XulListbox) document.getElementById( "connection-type-list" ); accessBox = (XulListbox) document.getElementById( "access-type-list" ); Object connectionKey = DataHandler.connectionNametoID.get( connectionBox.getSelectedItem() ); String databaseName = null; try { databaseName = PluginRegistry.getInstance().getPlugin( DatabasePluginType.class, "" + connectionKey ).getIds()[0]; } catch ( Exception e ) { e.printStackTrace(); } DatabaseInterface database = DataHandler.connectionMap.get( connectionBox.getSelectedItem() ); Object accessKey = accessBox.getSelectedItem(); int access = DatabaseMeta.getAccessType( (String) accessKey ); String fragment = null; DataHandler dataHandler = null; try { dataHandler = (DataHandler) xulDomContainer.getEventHandler( "dataHandler" ); dataHandler.pushCache(); } catch ( XulException e ) { // TODO not a critical function, but should log a problem... } switch ( access ) { case DatabaseMeta.TYPE_ACCESS_JNDI: fragment = getFragment( database, databaseName, "_jndi.xul", "common_jndi.xul" ); break; case DatabaseMeta.TYPE_ACCESS_NATIVE: fragment = getFragment( database, databaseName, "_native.xul", "common_native.xul" ); break; case DatabaseMeta.TYPE_ACCESS_OCI: fragment = getFragment( database, databaseName, "_oci.xul", "common_native.xul" ); break; case DatabaseMeta.TYPE_ACCESS_ODBC: fragment = getFragment( database, databaseName, "_odbc.xul", "common_odbc.xul" ); break; case DatabaseMeta.TYPE_ACCESS_PLUGIN: fragment = getFragment( database, databaseName, "_plugin.xul", "common_native.xul" ); break; default: break; } try { loadDatabaseOptionsFragment( fragment.toLowerCase() ); } catch ( XulException e ) { // TODO should be reporting as an error dialog; need error dialog in XUL framework showMessage( Messages.getString( "FragmentHandler.USER.CANT_LOAD_OPTIONS", databaseName ) ); } XulTextbox portBox = (XulTextbox) document.getElementById( "port-number-text" ); if ( portBox != null ) { int port = database.getDefaultDatabasePort(); if ( port > 0 ) { portBox.setValue( Integer.toString( port ) ); } } if ( dataHandler != null ) { dataHandler.popCache(); } } protected String getFragment( DatabaseInterface database, String dbName, String extension, String defaultFragment ) { String fragment; String ext = ( extension == null ? "" : extension ); String databaseName = ( dbName == null ? "" : dbName ); String defaultFrag = ( defaultFragment == null ? "" : defaultFragment ); if ( database.getXulOverlayFile() != null ) { fragment = packagePath.concat( database.getXulOverlayFile() ).concat( ext ); } else { fragment = packagePath.concat( databaseName ).concat( ext ); } InputStream in = getClass().getClassLoader().getResourceAsStream( fragment.toLowerCase() ); if ( in == null ) { fragment = packagePath.concat( defaultFrag ); } return fragment; } public Object getData() { return null; } public void setData( Object arg0 ) { } protected void showMessage( String message ) { try { XulMessageBox box = (XulMessageBox) document.createElement( "messagebox" ); box.setMessage( message ); box.open(); } catch ( XulException e ) { System.out.println( "Error creating messagebox " + e.getMessage() ); } } }