/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2017 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.repositoryexplorer.controllers; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.pentaho.di.cluster.SlaveServer; import org.pentaho.di.core.Const; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.i18n.BaseMessages; import org.pentaho.di.repository.ObjectId; import org.pentaho.di.repository.Repository; import org.pentaho.di.ui.cluster.dialog.SlaveServerDialog; import org.pentaho.di.ui.core.dialog.ErrorDialog; import org.pentaho.di.ui.repository.dialog.RepositoryExplorerDialog; import org.pentaho.di.ui.repository.repositoryexplorer.ControllerInitializationException; import org.pentaho.di.ui.repository.repositoryexplorer.IUISupportController; import org.pentaho.di.ui.repository.repositoryexplorer.model.UISlave; import org.pentaho.di.ui.repository.repositoryexplorer.model.UISlaves; import org.pentaho.di.ui.spoon.SharedObjectSyncUtil; import org.pentaho.ui.xul.XulException; import org.pentaho.ui.xul.binding.Binding; import org.pentaho.ui.xul.binding.BindingFactory; import org.pentaho.ui.xul.components.XulButton; import org.pentaho.ui.xul.containers.XulTree; import org.pentaho.ui.xul.swt.SwtBindingFactory; import org.pentaho.ui.xul.swt.tags.SwtDialog; public class SlavesController extends LazilyInitializedController implements IUISupportController { private static Class<?> PKG = RepositoryExplorerDialog.class; // for i18n purposes, needed by Translator2!! private XulTree slavesTable = null; protected BindingFactory bf = null; private Shell shell = null; private UISlaves slaveList = new UISlaves(); private MainController mainController; public SlavesController() { } public void init( Repository repository ) throws ControllerInitializationException { this.repository = repository; } @Override public String getName() { return "slavesController"; } public void createBindings() { refreshSlaves(); try { slavesTable = (XulTree) document.getElementById( "slaves-table" ); bf.setBindingType( Binding.Type.ONE_WAY ); bf.createBinding( slaveList, "children", slavesTable, "elements" ).fireSourceChanged(); bf.createBinding( slavesTable, "selectedItems", this, "enableButtons" ); } catch ( Exception e ) { if ( mainController == null || !mainController.handleLostRepository( e ) ) { // convert to runtime exception so it bubbles up through the UI throw new RuntimeException( e ); } } } @Override protected boolean doLazyInit() { // Load the SWT Shell from the explorer dialog shell = ( (SwtDialog) document.getElementById( "repository-explorer-dialog" ) ).getShell(); enableButtons( true, false, false ); bf = new SwtBindingFactory(); bf.setDocument( this.getXulDomContainer().getDocumentRoot() ); try { mainController = (MainController) this.getXulDomContainer().getEventHandler( "mainController" ); } catch ( XulException e ) { return false; } if ( bf != null ) { createBindings(); } return true; } public void refreshSlaves() { if ( repository != null ) { final List<UISlave> tmpList = new ArrayList<UISlave>(); Runnable r = new Runnable() { public void run() { try { ObjectId[] slaveIdList = repository.getSlaveIDs( false ); for ( ObjectId slaveId : slaveIdList ) { SlaveServer slave = repository.loadSlaveServer( slaveId, null ); // Add the database slave to the list tmpList.add( new UISlave( slave ) ); } } catch ( KettleException e ) { if ( mainController == null || !mainController.handleLostRepository( e ) ) { // convert to runtime exception so it bubbles up through the UI throw new RuntimeException( e ); } } } }; doWithBusyIndicator( r ); slaveList.setChildren( tmpList ); } } public void createSlave() { try { // Create a new SlaveServer for storing the result SlaveServer slaveServer = new SlaveServer(); SlaveServerDialog ssd = new SlaveServerDialog( shell, slaveServer ); if ( ssd.open() ) { ObjectId slaveId = repository.getSlaveID( slaveServer.getName() ); // Make sure the slave does not already exist if ( slaveId != null ) { MessageBox mb = new MessageBox( shell, SWT.ICON_ERROR | SWT.OK ); mb.setMessage( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Slave.AlreadyExists.Message", slaveServer.getName() ) ); mb.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Slave.Create.Title" ) ); mb.open(); } else { if ( slaveServer.getName() != null && !slaveServer.getName().equals( "" ) ) { repository.insertLogEntry( BaseMessages.getString( PKG, "SlavesController.Message.CreatingSlave", slaveServer.getName() ) ); repository.save( slaveServer, Const.VERSION_COMMENT_INITIAL_VERSION, null ); if ( getSharedObjectSyncUtil() != null ) { getSharedObjectSyncUtil().reloadJobRepositoryObjects( true ); getSharedObjectSyncUtil().reloadTransformationRepositoryObjects( true ); } } else { MessageBox mb = new MessageBox( shell, SWT.ICON_ERROR | SWT.OK ); mb .setMessage( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Slave.Edit.InvalidName.Message" ) ); mb.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Slave.Create.Title" ) ); mb.open(); } } } } catch ( KettleException e ) { if ( mainController == null || !mainController.handleLostRepository( e ) ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "RepositoryExplorerDialog.Slave.Create.Title" ), BaseMessages .getString( PKG, "RepositoryExplorerDialog.Slave.Create.UnexpectedError.Message" ), e ); } } finally { refreshSlaves(); } } public void editSlave() { String slaveServerName = ""; try { Collection<UISlave> slaves = slavesTable.getSelectedItems(); if ( slaves != null && !slaves.isEmpty() ) { // Grab the first item in the list & send it to the slave dialog SlaveServer slaveServer = ( (UISlave) slaves.toArray()[0] ).getSlaveServer(); slaveServerName = slaveServer.getName(); // Make sure the slave already exists ObjectId slaveId = repository.getSlaveID( slaveServer.getName() ); if ( slaveId == null ) { MessageBox mb = new MessageBox( shell, SWT.ICON_ERROR | SWT.OK ); mb.setMessage( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Slave.DoesNotExists.Message", slaveServerName ) ); mb.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Slave.Edit.Title" ) ); mb.open(); } else { SlaveServerDialog ssd = new SlaveServerDialog( shell, slaveServer ); if ( ssd.open() ) { if ( slaveServer.getName() != null && !slaveServer.getName().equals( "" ) ) { repository.insertLogEntry( BaseMessages.getString( PKG, "SlavesController.Message.UpdatingSlave", slaveServer.getName() ) ); repository.save( slaveServer, Const.VERSION_COMMENT_EDIT_VERSION, null ); if ( getSharedObjectSyncUtil() != null ) { getSharedObjectSyncUtil().synchronizeSlaveServers( slaveServer, slaveServerName ); } } else { MessageBox mb = new MessageBox( shell, SWT.ICON_ERROR | SWT.OK ); mb.setMessage( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Slave.Edit.InvalidName.Message" ) ); mb.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Slave.Edit.Title" ) ); mb.open(); } } } } else { MessageBox mb = new MessageBox( shell, SWT.ICON_ERROR | SWT.OK ); mb.setMessage( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Slave.NoItemSelected.Message" ) ); mb.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Slave.Edit.Title" ) ); mb.open(); } } catch ( KettleException e ) { if ( mainController == null || !mainController.handleLostRepository( e ) ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "RepositoryExplorerDialog.Slave.Edit.Title" ), BaseMessages .getString( PKG, "RepositoryExplorerDialog.Slave.Edit.UnexpectedError.Message" ) + slaveServerName + "]", e ); } } finally { refreshSlaves(); } } public void removeSlave() { String slaveServerName = ""; try { Collection<UISlave> slaves = slavesTable.getSelectedItems(); if ( slaves != null && !slaves.isEmpty() ) { for ( Object obj : slaves ) { if ( obj != null && obj instanceof UISlave ) { UISlave slave = (UISlave) obj; SlaveServer slaveServer = slave.getSlaveServer(); slaveServerName = slaveServer.getName(); // Make sure the slave to delete exists in the repository ObjectId slaveId = repository.getSlaveID( slaveServer.getName() ); if ( slaveId == null ) { MessageBox mb = new MessageBox( shell, SWT.ICON_ERROR | SWT.OK ); mb.setMessage( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Slave.DoesNotExists.Message", slaveServerName ) ); mb.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Slave.Delete.Title" ) ); mb.open(); } else { repository.deleteSlave( slaveId ); if ( getSharedObjectSyncUtil() != null ) { getSharedObjectSyncUtil().deleteSlaveServer( slaveServer ); } } } } } else { MessageBox mb = new MessageBox( shell, SWT.ICON_ERROR | SWT.OK ); mb.setMessage( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Slave.NoItemSelected.Message" ) ); mb.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Slave.Delete.Title" ) ); mb.open(); } } catch ( KettleException e ) { if ( mainController == null || !mainController.handleLostRepository( e ) ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "RepositoryExplorerDialog.Slave.Delete.Title" ), BaseMessages .getString( PKG, "RepositoryExplorerDialog.Slave.Delete.UnexpectedError.Message" ) + slaveServerName + "]", e ); } } finally { refreshSlaves(); } } public void setEnableButtons( List<UISlave> slaves ) { boolean enableEdit = false; boolean enableRemove = false; if ( slaves != null && slaves.size() > 0 ) { enableRemove = true; if ( slaves.size() == 1 ) { enableEdit = true; } } // Convenience - Leave 'new' enabled, modify 'edit' and 'remove' enableButtons( true, enableEdit, enableRemove ); } public void enableButtons( boolean enableNew, boolean enableEdit, boolean enableRemove ) { XulButton bNew = (XulButton) document.getElementById( "slaves-new" ); XulButton bEdit = (XulButton) document.getElementById( "slaves-edit" ); XulButton bRemove = (XulButton) document.getElementById( "slaves-remove" ); bNew.setDisabled( !enableNew ); bEdit.setDisabled( !enableEdit ); bRemove.setDisabled( !enableRemove ); } public void tabClicked() { lazyInit(); } private SharedObjectSyncUtil getSharedObjectSyncUtil() { return mainController != null ? mainController.getSharedObjectSyncUtil() : null; } }