/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2013 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.repository.controllers; import java.util.ResourceBundle; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.pentaho.di.i18n.BaseMessages; import org.pentaho.di.repository.RepositoryMeta; import org.pentaho.di.ui.repository.ILoginCallback; import org.pentaho.di.ui.repository.RepositoriesHelper; import org.pentaho.di.ui.repository.dialog.RepositoryDialogInterface; import org.pentaho.di.ui.repository.model.RepositoriesModel; import org.pentaho.di.ui.repository.repositoryexplorer.ControllerInitializationException; import org.pentaho.di.ui.xul.KettleWaitBox; import org.pentaho.ui.xul.XulException; import org.pentaho.ui.xul.binding.Binding; import org.pentaho.ui.xul.binding.BindingConvertor; import org.pentaho.ui.xul.binding.BindingFactory; import org.pentaho.ui.xul.components.WaitBoxRunnable; import org.pentaho.ui.xul.components.XulButton; import org.pentaho.ui.xul.components.XulCheckbox; import org.pentaho.ui.xul.components.XulConfirmBox; import org.pentaho.ui.xul.components.XulMessageBox; import org.pentaho.ui.xul.components.XulTextbox; import org.pentaho.ui.xul.containers.XulDialog; import org.pentaho.ui.xul.containers.XulListbox; import org.pentaho.ui.xul.impl.AbstractXulEventHandler; public class RepositoriesController extends AbstractXulEventHandler { private static Class<?> PKG = RepositoryDialogInterface.class; // for i18n purposes, needed by Translator2!! private ResourceBundle messages; private BindingFactory bf; private XulDialog loginDialog; private XulTextbox username; private XulTextbox userPassword; private XulListbox availableRepositories; private XulButton repositoryEditButton; private XulButton repositoryRemoveButton; private XulCheckbox showAtStartup; private RepositoriesModel loginModel; private XulButton okButton; private XulButton cancelButton; private XulMessageBox messageBox; protected XulConfirmBox confirmBox; private RepositoriesHelper helper; private String preferredRepositoryName; private ILoginCallback callback; private Shell shell; public RepositoriesController() { super(); loginModel = new RepositoriesModel(); } public void init() throws ControllerInitializationException { // TODO Initialize the Repository Login Dialog try { messageBox = (XulMessageBox) document.createElement( "messagebox" ); confirmBox = (XulConfirmBox) document.createElement( "confirmbox" ); } catch ( Exception e ) { throw new ControllerInitializationException( e ); } if ( bf != null ) { createBindings(); } } private void createBindings() { loginDialog = (XulDialog) document.getElementById( "repository-login-dialog" ); repositoryEditButton = (XulButton) document.getElementById( "repository-edit" ); repositoryRemoveButton = (XulButton) document.getElementById( "repository-remove" ); username = (XulTextbox) document.getElementById( "user-name" ); userPassword = (XulTextbox) document.getElementById( "user-password" ); availableRepositories = (XulListbox) document.getElementById( "available-repository-list" ); showAtStartup = (XulCheckbox) document.getElementById( "show-login-dialog-at-startup" ); okButton = (XulButton) document.getElementById( "repository-login-dialog_accept" ); cancelButton = (XulButton) document.getElementById( "repository-login-dialog_cancel" ); bf.setBindingType( Binding.Type.BI_DIRECTIONAL ); bf.createBinding( loginModel, "username", username, "value" ); bf.createBinding( loginModel, "password", userPassword, "value" ); bf.createBinding( loginModel, "availableRepositories", availableRepositories, "elements" ); bf.createBinding( loginModel, "selectedRepository", availableRepositories, "selectedItem" ); bf.createBinding( loginModel, "showDialogAtStartup", showAtStartup, "checked" ); bf.setBindingType( Binding.Type.ONE_WAY ); bf.createBinding( loginModel, "valid", okButton, "!disabled" ); BindingConvertor<RepositoryMeta, Boolean> buttonConverter = new BindingConvertor<RepositoryMeta, Boolean>() { @Override public Boolean sourceToTarget( RepositoryMeta value ) { return ( value == null ); } @Override public RepositoryMeta targetToSource( Boolean value ) { return null; } }; BindingConvertor<RepositoryMeta, Boolean> userpassConverter = new BindingConvertor<RepositoryMeta, Boolean>() { @Override public Boolean sourceToTarget( RepositoryMeta value ) { return ( value == null ) || !value.getRepositoryCapabilities().supportsUsers(); } @Override public RepositoryMeta targetToSource( Boolean value ) { return null; } }; bf.createBinding( loginModel, "selectedRepository", username, "disabled", userpassConverter ); bf.createBinding( loginModel, "selectedRepository", userPassword, "disabled", userpassConverter ); bf.createBinding( loginModel, "selectedRepository", repositoryEditButton, "disabled", buttonConverter ); bf.createBinding( loginModel, "selectedRepository", repositoryRemoveButton, "disabled", buttonConverter ); final Shell loginShell = (Shell) loginDialog.getRootObject(); helper = new RepositoriesHelper( loginModel, document, loginShell ); helper.setPreferredRepositoryName( preferredRepositoryName ); helper.getMetaData(); } public void setBindingFactory( BindingFactory bf ) { this.bf = bf; } public BindingFactory getBindingFactory() { return this.bf; } public String getName() { return "repositoryLoginController"; } public void show() { if ( loginModel.getUsername() != null ) { userPassword.setFocus(); } else { username.setFocus(); } // PDI-7443: The repo list does not show the selected repo // make the layout play nice, this is necessary to have the selection box scroll reliably if ( availableRepositories.getRows() < 4 ) { availableRepositories.setRows( 4 ); } int idx = loginModel.getRepositoryIndex( loginModel.getSelectedRepository() ); if ( idx >= 0 ) { availableRepositories.setSelectedIndex( idx ); } // END OF PDI-7443 loginDialog.show(); } public void login() { if ( loginModel.isValid() == false ) { return; } KettleWaitBox box; try { box = (KettleWaitBox) document.createElement( "iconwaitbox" ); box.setIndeterminate( true ); box.setCanCancel( false ); box.setIcon( "ui/images/kettle_logo_small.svg" ); box.setTitle( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Connection.Wait.Title" ) ); box.setMessage( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Connection.Wait.Message" ) ); final Shell loginShell = (Shell) loginDialog.getRootObject(); final Display display = loginShell.getDisplay(); box.setDialogParent( loginShell ); box.setRunnable( new WaitBoxRunnable( box ) { @Override public void run() { try { helper.loginToRepository(); waitBox.stop(); display.syncExec( new Runnable() { public void run() { loginDialog.hide(); okButton.setDisabled( false ); cancelButton.setDisabled( false ); if ( helper.getConnectedRepository().getConnectMessage() != null ) { getMessageBox().setTitle( BaseMessages.getString( PKG, "ConnectMessageTitle" ) ); getMessageBox().setMessage( helper.getConnectedRepository().getConnectMessage() ); getMessageBox().open(); } getCallback().onSuccess( helper.getConnectedRepository() ); } } ); } catch ( final Throwable th ) { waitBox.stop(); try { display.syncExec( new Runnable() { public void run() { getCallback().onError( th ); okButton.setDisabled( false ); cancelButton.setDisabled( false ); } } ); } catch ( Exception e ) { e.printStackTrace(); } } } @Override public void cancel() { } } ); okButton.setDisabled( true ); cancelButton.setDisabled( true ); box.start(); } catch ( XulException e1 ) { getCallback().onError( e1 ); } } /** * Executed when the user clicks the new repository image from the Repository Login Dialog It present a new dialog * where the user can selected what type of repository to create */ public void newRepository() { helper.newRepository(); } /** * Executed when the user clicks the edit repository image from the Repository Login Dialog It presents an edit dialog * where the user can edit information about the currently selected repository */ public void editRepository() { helper.editRepository(); } /** * Executed when the user clicks the delete repository image from the Repository Login Dialog It prompts the user with * a warning about the action to be performed and upon the approval of this action from the user, the selected * repository is deleted */ public void deleteRepository() { helper.deleteRepository(); } /** * Executed when user clicks cancel button on the Repository Login Dialog */ public void closeRepositoryLoginDialog() { loginDialog.hide(); getCallback().onCancel(); } /** * Executed when the user checks or uncheck the "show this dialog at startup checkbox" It saves the current selection. */ public void updateShowDialogAtStartup() { helper.updateShowDialogOnStartup( showAtStartup.isChecked() ); } public XulMessageBox getMessageBox() { return messageBox; } public void setMessageBox( XulMessageBox messageBox ) { this.messageBox = messageBox; } public void setMessages( ResourceBundle messages ) { this.messages = messages; } public ResourceBundle getMessages() { return messages; } public String getPreferredRepositoryName() { return preferredRepositoryName; } public void setPreferredRepositoryName( String preferredRepositoryName ) { this.preferredRepositoryName = preferredRepositoryName; } public void setCallback( ILoginCallback callback ) { this.callback = callback; } public ILoginCallback getCallback() { return callback; } public void setShell( final Shell shell ) { this.shell = shell; } public Shell getShell() { return shell; } }