/*! ****************************************************************************** * * 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.trans.steps.ssh; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.ShellAdapter; import org.eclipse.swt.events.ShellEvent; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.pentaho.di.core.Const; import org.pentaho.di.core.util.Utils; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.row.RowMetaInterface; import org.pentaho.di.i18n.BaseMessages; import org.pentaho.di.trans.Trans; import org.pentaho.di.trans.TransMeta; import org.pentaho.di.trans.TransPreviewFactory; import org.pentaho.di.trans.step.BaseStepMeta; import org.pentaho.di.trans.step.StepDialogInterface; import org.pentaho.di.trans.steps.ssh.SSHData; import org.pentaho.di.trans.steps.ssh.SSHMeta; import org.pentaho.di.ui.core.PropsUI; import org.pentaho.di.ui.core.dialog.EnterNumberDialog; import org.pentaho.di.ui.core.dialog.EnterTextDialog; import org.pentaho.di.ui.core.dialog.ErrorDialog; import org.pentaho.di.ui.core.dialog.PreviewRowsDialog; import org.pentaho.di.ui.core.widget.LabelTextVar; import org.pentaho.di.ui.core.widget.StyledTextComp; import org.pentaho.di.ui.trans.dialog.TransPreviewProgressDialog; import org.pentaho.di.ui.trans.step.BaseStepDialog; import com.trilead.ssh2.Connection; public class SSHDialog extends BaseStepDialog implements StepDialogInterface { private static Class<?> PKG = SSHMeta.class; // for i18n purposes, needed by Translator2!! private CTabFolder wTabFolder; private FormData fdTabFolder; private CTabItem wGeneralTab, wSettingsTab; private Composite wGeneralComp, wSettingsComp; private FormData fdGeneralComp, fdSettingsComp; private Label wlCommandField; private CCombo wCommandField; private FormData fdlCommandField, fdCommandField; private Group wSettingsGroup; private FormData fdSettingsGroup; private Group wOutput; private FormData fdOutput; private FormData fdTimeOut; private LabelTextVar wTimeOut; private SSHMeta input; private Group wCommands; private FormData fdLogSettings; private Label wldynamicCommand; private FormData fdlynamicBase; private Button wdynamicCommand; private FormData fdynamicCommand; private FormData fdPort; private LabelTextVar wPort; private LabelTextVar wUserName; private FormData fdUserName; private LabelTextVar wPassword; private FormData fdPassword; private Label wlUseKey; private FormData fdlUseKey; private Button wUseKey; private FormData fdUseKey; private LabelTextVar wPrivateKey; private FormData fdPrivateKey; private LabelTextVar wPassphrase; private FormData fdPassphrase; private LabelTextVar wResultOutFieldName, wResultErrFieldName; private FormData fdResultOutFieldName, fdResultErrFieldName; private Label wlCommand; private StyledTextComp wCommand; private FormData fdlCommand, fdCommand; private Button wTest; private FormData fdTest; private Listener lsTest; private LabelTextVar wProxyHost; private FormData fdProxyHost; private LabelTextVar wProxyPort; private FormData fdProxyPort; private LabelTextVar wProxyUsername; private FormData fdProxyUsername; private LabelTextVar wProxyPassword; private FormData fdProxyPassword; private LabelTextVar wServerName; private FormData fdServerName; private Button wbFilename; private FormData fdbFilename; private boolean gotPreviousFields = false; public SSHDialog( Shell parent, Object in, TransMeta transMeta, String sname ) { super( parent, (BaseStepMeta) in, transMeta, sname ); input = (SSHMeta) in; } @Override public String open() { Shell parent = getParent(); Display display = parent.getDisplay(); shell = new Shell( parent, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.MIN ); props.setLook( shell ); setShellImage( shell, input ); ModifyListener lsMod = new ModifyListener() { @Override public void modifyText( ModifyEvent e ) { input.setChanged(); } }; changed = input.hasChanged(); FormLayout formLayout = new FormLayout(); formLayout.marginWidth = Const.FORM_MARGIN; formLayout.marginHeight = Const.FORM_MARGIN; shell.setLayout( formLayout ); shell.setText( BaseMessages.getString( PKG, "SSHDialog.Shell.Title" ) ); int middle = props.getMiddlePct(); int margin = Const.MARGIN; // Stepname line wlStepname = new Label( shell, SWT.RIGHT ); wlStepname.setText( BaseMessages.getString( PKG, "SSHDialog.Stepname.Label" ) ); props.setLook( wlStepname ); fdlStepname = new FormData(); fdlStepname.left = new FormAttachment( 0, 0 ); fdlStepname.right = new FormAttachment( middle, -margin ); fdlStepname.top = new FormAttachment( 0, margin ); wlStepname.setLayoutData( fdlStepname ); wStepname = new Text( shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); wStepname.setText( stepname ); props.setLook( wStepname ); wStepname.addModifyListener( lsMod ); fdStepname = new FormData(); fdStepname.left = new FormAttachment( middle, 0 ); fdStepname.top = new FormAttachment( 0, margin ); fdStepname.right = new FormAttachment( 100, 0 ); wStepname.setLayoutData( fdStepname ); wTabFolder = new CTabFolder( shell, SWT.BORDER ); props.setLook( wTabFolder, PropsUI.WIDGET_STYLE_TAB ); // //////////////////////// // START OF GENERAL TAB /// // //////////////////////// wGeneralTab = new CTabItem( wTabFolder, SWT.NONE ); wGeneralTab.setText( BaseMessages.getString( PKG, "SSHDialog.General.Tab" ) ); wGeneralComp = new Composite( wTabFolder, SWT.NONE ); props.setLook( wGeneralComp ); FormLayout fileLayout = new FormLayout(); fileLayout.marginWidth = 3; fileLayout.marginHeight = 3; wGeneralComp.setLayout( fileLayout ); // /////////////////////////////// // START OF Settings GROUP // // /////////////////////////////// wSettingsGroup = new Group( wGeneralComp, SWT.SHADOW_NONE ); props.setLook( wSettingsGroup ); wSettingsGroup.setText( BaseMessages.getString( PKG, "SSHDialog.wSettingsGroup.Label" ) ); FormLayout settingGroupLayout = new FormLayout(); settingGroupLayout.marginWidth = 10; settingGroupLayout.marginHeight = 10; wSettingsGroup.setLayout( settingGroupLayout ); // Server port line wServerName = new LabelTextVar( transMeta, wSettingsGroup, BaseMessages.getString( PKG, "SSHDialog.Server.Label" ), BaseMessages .getString( PKG, "SSHDialog.Server.Tooltip" ) ); props.setLook( wServerName ); wServerName.addModifyListener( lsMod ); fdServerName = new FormData(); fdServerName.left = new FormAttachment( 0, 0 ); fdServerName.top = new FormAttachment( wStepname, margin ); fdServerName.right = new FormAttachment( 100, 0 ); wServerName.setLayoutData( fdServerName ); // Server port line wPort = new LabelTextVar( transMeta, wSettingsGroup, BaseMessages.getString( PKG, "SSHDialog.Port.Label" ), BaseMessages .getString( PKG, "SSHDialog.Port.Tooltip" ) ); props.setLook( wPort ); wPort.addModifyListener( lsMod ); fdPort = new FormData(); fdPort.left = new FormAttachment( 0, 0 ); fdPort.top = new FormAttachment( wServerName, margin ); fdPort.right = new FormAttachment( 100, 0 ); wPort.setLayoutData( fdPort ); // Server TimeOut line wTimeOut = new LabelTextVar( transMeta, wSettingsGroup, BaseMessages.getString( PKG, "SSHDialog.TimeOut.Label" ), BaseMessages .getString( PKG, "SSHDialog.TimeOut.Tooltip" ) ); props.setLook( wTimeOut ); wTimeOut.addModifyListener( lsMod ); fdTimeOut = new FormData(); fdTimeOut.left = new FormAttachment( 0, 0 ); fdTimeOut.top = new FormAttachment( wPort, margin ); fdTimeOut.right = new FormAttachment( 100, 0 ); wTimeOut.setLayoutData( fdTimeOut ); // Usernameline wUserName = new LabelTextVar( transMeta, wSettingsGroup, BaseMessages.getString( PKG, "SSHDialog.UserName.Label" ), BaseMessages .getString( PKG, "SSHDialog.UserName.Tooltip" ) ); props.setLook( wUserName ); wUserName.addModifyListener( lsMod ); fdUserName = new FormData(); fdUserName.left = new FormAttachment( 0, 0 ); fdUserName.top = new FormAttachment( wTimeOut, margin ); fdUserName.right = new FormAttachment( 100, 0 ); wUserName.setLayoutData( fdUserName ); // Passwordline wPassword = new LabelTextVar( transMeta, wSettingsGroup, BaseMessages.getString( PKG, "SSHDialog.Password.Label" ), BaseMessages .getString( PKG, "SSHDialog.Password.Tooltip" ), true ); props.setLook( wPassword ); wPassword.addModifyListener( lsMod ); fdPassword = new FormData(); fdPassword.left = new FormAttachment( 0, 0 ); fdPassword.top = new FormAttachment( wUserName, margin ); fdPassword.right = new FormAttachment( 100, 0 ); wPassword.setLayoutData( fdPassword ); // Use key? wlUseKey = new Label( wSettingsGroup, SWT.RIGHT ); wlUseKey.setText( BaseMessages.getString( PKG, "SSHDialog.UseKey.Label" ) ); props.setLook( wlUseKey ); fdlUseKey = new FormData(); fdlUseKey.left = new FormAttachment( 0, 0 ); fdlUseKey.top = new FormAttachment( wPassword, margin ); fdlUseKey.right = new FormAttachment( middle, -margin ); wlUseKey.setLayoutData( fdlUseKey ); wUseKey = new Button( wSettingsGroup, SWT.CHECK ); props.setLook( wUseKey ); wUseKey.setToolTipText( BaseMessages.getString( PKG, "SSHDialog.UseKey.Tooltip" ) ); fdUseKey = new FormData(); fdUseKey.left = new FormAttachment( middle, margin ); fdUseKey.top = new FormAttachment( wPassword, margin ); fdUseKey.right = new FormAttachment( 100, 0 ); wUseKey.setLayoutData( fdUseKey ); wUseKey.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { input.setChanged(); activateKey(); } } ); wbFilename = new Button( wSettingsGroup, SWT.PUSH | SWT.CENTER ); props.setLook( wbFilename ); wbFilename.setText( BaseMessages.getString( PKG, "System.Button.Browse" ) ); fdbFilename = new FormData(); fdbFilename.right = new FormAttachment( 100, -margin ); fdbFilename.top = new FormAttachment( wUseKey, margin ); wbFilename.setLayoutData( fdbFilename ); wbFilename.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { FileDialog dialog = new FileDialog( shell, SWT.SAVE ); dialog.setFilterExtensions( new String[] { "*.pem", "*" } ); if ( wPrivateKey.getText() != null ) { dialog.setFileName( transMeta.environmentSubstitute( wPrivateKey.getText() ) ); } dialog.setFilterNames( new String[] { BaseMessages.getString( PKG, "System.FileType.PEMFiles" ), BaseMessages.getString( PKG, "System.FileType.AllFiles" ) } ); if ( dialog.open() != null ) { wPrivateKey.setText( dialog.getFilterPath() + System.getProperty( "file.separator" ) + dialog.getFileName() ); } } } ); // Private key wPrivateKey = new LabelTextVar( transMeta, wSettingsGroup, BaseMessages.getString( PKG, "SSHDialog.PrivateKey.Label" ), BaseMessages .getString( PKG, "SSHDialog.PrivateKey.Tooltip" ) ); props.setLook( wPassword ); wPrivateKey.addModifyListener( lsMod ); fdPrivateKey = new FormData(); fdPrivateKey.left = new FormAttachment( 0, 5 * margin ); fdPrivateKey.top = new FormAttachment( wUseKey, margin ); fdPrivateKey.right = new FormAttachment( wbFilename, -margin ); wPrivateKey.setLayoutData( fdPrivateKey ); // Passphraseline wPassphrase = new LabelTextVar( transMeta, wSettingsGroup, BaseMessages.getString( PKG, "SSHDialog.Passphrase.Label" ), BaseMessages .getString( PKG, "SSHDialog.Passphrase.Tooltip" ), true ); props.setLook( wPassphrase ); wPassphrase.addModifyListener( lsMod ); fdPassphrase = new FormData(); fdPassphrase.left = new FormAttachment( 0, 0 ); fdPassphrase.top = new FormAttachment( wbFilename, margin ); fdPassphrase.right = new FormAttachment( 100, 0 ); wPassphrase.setLayoutData( fdPassphrase ); // ProxyHostline wProxyHost = new LabelTextVar( transMeta, wSettingsGroup, BaseMessages.getString( PKG, "SSHDialog.ProxyHost.Label" ), BaseMessages .getString( PKG, "SSHDialog.ProxyHost.Tooltip" ) ); props.setLook( wProxyHost ); wProxyHost.addModifyListener( lsMod ); fdProxyHost = new FormData(); fdProxyHost.left = new FormAttachment( 0, 0 ); fdProxyHost.top = new FormAttachment( wPassphrase, 2 * margin ); fdProxyHost.right = new FormAttachment( 100, 0 ); wProxyHost.setLayoutData( fdProxyHost ); // ProxyPortline wProxyPort = new LabelTextVar( transMeta, wSettingsGroup, BaseMessages.getString( PKG, "SSHDialog.ProxyPort.Label" ), BaseMessages .getString( PKG, "SSHDialog.ProxyPort.Tooltip" ) ); props.setLook( wProxyPort ); wProxyPort.addModifyListener( lsMod ); fdProxyPort = new FormData(); fdProxyPort.left = new FormAttachment( 0, 0 ); fdProxyPort.top = new FormAttachment( wProxyHost, margin ); fdProxyPort.right = new FormAttachment( 100, 0 ); wProxyPort.setLayoutData( fdProxyPort ); // ProxyUsernameline wProxyUsername = new LabelTextVar( transMeta, wSettingsGroup, BaseMessages.getString( PKG, "SSHDialog.ProxyUsername.Label" ), BaseMessages.getString( PKG, "SSHDialog.ProxyUsername.Tooltip" ) ); props.setLook( wProxyUsername ); wProxyUsername.addModifyListener( lsMod ); fdProxyUsername = new FormData(); fdProxyUsername.left = new FormAttachment( 0, 0 ); fdProxyUsername.top = new FormAttachment( wProxyPort, margin ); fdProxyUsername.right = new FormAttachment( 100, 0 ); wProxyUsername.setLayoutData( fdProxyUsername ); // ProxyUsernameline wProxyPassword = new LabelTextVar( transMeta, wSettingsGroup, BaseMessages.getString( PKG, "SSHDialog.ProxyPassword.Label" ), BaseMessages.getString( PKG, "SSHDialog.ProxyPassword.Tooltip" ), true ); props.setLook( wProxyUsername ); wProxyPassword.addModifyListener( lsMod ); fdProxyPassword = new FormData(); fdProxyPassword.left = new FormAttachment( 0, 0 ); fdProxyPassword.top = new FormAttachment( wProxyUsername, margin ); fdProxyPassword.right = new FormAttachment( 100, 0 ); wProxyPassword.setLayoutData( fdProxyPassword ); // Test connection button wTest = new Button( wSettingsGroup, SWT.PUSH ); wTest.setText( BaseMessages.getString( PKG, "SSHDialog.TestConnection.Label" ) ); props.setLook( wTest ); fdTest = new FormData(); wTest.setToolTipText( BaseMessages.getString( PKG, "SSHDialog.TestConnection.Tooltip" ) ); fdTest.top = new FormAttachment( wProxyPassword, 2 * margin ); fdTest.right = new FormAttachment( 100, 0 ); wTest.setLayoutData( fdTest ); fdSettingsGroup = new FormData(); fdSettingsGroup.left = new FormAttachment( 0, margin ); fdSettingsGroup.top = new FormAttachment( wStepname, margin ); fdSettingsGroup.right = new FormAttachment( 100, -margin ); wSettingsGroup.setLayoutData( fdSettingsGroup ); // /////////////////////////////// // END OF Settings Fields GROUP // fdGeneralComp = new FormData(); fdGeneralComp.left = new FormAttachment( 0, 0 ); fdGeneralComp.top = new FormAttachment( 0, 0 ); fdGeneralComp.right = new FormAttachment( 100, 0 ); fdGeneralComp.bottom = new FormAttachment( 100, 0 ); wGeneralComp.setLayoutData( fdGeneralComp ); wGeneralComp.layout(); wGeneralTab.setControl( wGeneralComp ); // /////////////////////////////////////////////////////////// // / END OF GENERAL TAB // /////////////////////////////////////////////////////////// // //////////////////////// // START OF Settings TAB/// // / wSettingsTab = new CTabItem( wTabFolder, SWT.NONE ); wSettingsTab.setText( BaseMessages.getString( PKG, "SSHDialog.Settings.Tab" ) ); FormLayout SettingsLayout = new FormLayout(); SettingsLayout.marginWidth = 3; SettingsLayout.marginHeight = 3; wSettingsComp = new Composite( wTabFolder, SWT.NONE ); props.setLook( wSettingsComp ); wSettingsComp.setLayout( SettingsLayout ); // /////////////////////////////// // START OF Output GROUP // // /////////////////////////////// wOutput = new Group( wSettingsComp, SWT.SHADOW_NONE ); props.setLook( wOutput ); wOutput.setText( BaseMessages.getString( PKG, "SSHDialog.wOutput.Label" ) ); FormLayout outputGroupLayout = new FormLayout(); outputGroupLayout.marginWidth = 10; outputGroupLayout.marginHeight = 10; wOutput.setLayout( outputGroupLayout ); // ResultOutFieldNameline wResultOutFieldName = new LabelTextVar( transMeta, wOutput, BaseMessages.getString( PKG, "SSHDialog.ResultOutFieldName.Label" ), BaseMessages .getString( PKG, "SSHDialog.ResultOutFieldName.Tooltip" ) ); props.setLook( wResultOutFieldName ); wResultOutFieldName.addModifyListener( lsMod ); fdResultOutFieldName = new FormData(); fdResultOutFieldName.left = new FormAttachment( 0, 0 ); fdResultOutFieldName.top = new FormAttachment( wStepname, margin ); fdResultOutFieldName.right = new FormAttachment( 100, 0 ); wResultOutFieldName.setLayoutData( fdResultOutFieldName ); // ResultErrFieldNameline wResultErrFieldName = new LabelTextVar( transMeta, wOutput, BaseMessages.getString( PKG, "SSHDialog.ResultErrFieldName.Label" ), BaseMessages .getString( PKG, "SSHDialog.ResultErrFieldName.Tooltip" ) ); props.setLook( wResultErrFieldName ); wResultErrFieldName.addModifyListener( lsMod ); fdResultErrFieldName = new FormData(); fdResultErrFieldName.left = new FormAttachment( 0, 0 ); fdResultErrFieldName.top = new FormAttachment( wResultOutFieldName, margin ); fdResultErrFieldName.right = new FormAttachment( 100, 0 ); wResultErrFieldName.setLayoutData( fdResultErrFieldName ); fdOutput = new FormData(); fdOutput.left = new FormAttachment( 0, margin ); fdOutput.top = new FormAttachment( wStepname, margin ); fdOutput.right = new FormAttachment( 100, -margin ); wOutput.setLayoutData( fdOutput ); // /////////////////////////////// // END OF Output Fields GROUP // // //////////////////////// // START OF Commands SETTINGS GROUP/// // / wCommands = new Group( wSettingsComp, SWT.SHADOW_NONE ); props.setLook( wCommands ); wCommands.setText( BaseMessages.getString( PKG, "SSHDialog.LogSettings.Group.Label" ) ); FormLayout LogSettingsgroupLayout = new FormLayout(); LogSettingsgroupLayout.marginWidth = 10; LogSettingsgroupLayout.marginHeight = 10; wCommands.setLayout( LogSettingsgroupLayout ); // Is command defined in a Field wldynamicCommand = new Label( wCommands, SWT.RIGHT ); wldynamicCommand.setText( BaseMessages.getString( PKG, "SSHDialog.dynamicCommand.Label" ) ); props.setLook( wldynamicCommand ); fdlynamicBase = new FormData(); fdlynamicBase.left = new FormAttachment( 0, margin ); fdlynamicBase.top = new FormAttachment( wOutput, margin ); fdlynamicBase.right = new FormAttachment( middle, -margin ); wldynamicCommand.setLayoutData( fdlynamicBase ); wdynamicCommand = new Button( wCommands, SWT.CHECK ); props.setLook( wdynamicCommand ); wdynamicCommand.setToolTipText( BaseMessages.getString( PKG, "SSHDialog.dynamicCommand.Tooltip" ) ); fdynamicCommand = new FormData(); fdynamicCommand.left = new FormAttachment( middle, margin ); fdynamicCommand.top = new FormAttachment( wOutput, margin ); wdynamicCommand.setLayoutData( fdynamicCommand ); SelectionAdapter ldynamicCommand = new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent arg0 ) { activateDynamicCommand(); input.setChanged(); } }; wdynamicCommand.addSelectionListener( ldynamicCommand ); // CommandField field wlCommandField = new Label( wCommands, SWT.RIGHT ); wlCommandField.setText( BaseMessages.getString( PKG, "SSHDialog.MessageNameField.Label" ) ); props.setLook( wlCommandField ); fdlCommandField = new FormData(); fdlCommandField.left = new FormAttachment( 0, margin ); fdlCommandField.right = new FormAttachment( middle, -margin ); fdlCommandField.top = new FormAttachment( wdynamicCommand, margin ); wlCommandField.setLayoutData( fdlCommandField ); wCommandField = new CCombo( wCommands, SWT.BORDER | SWT.READ_ONLY ); props.setLook( wCommandField ); wCommandField.setEditable( true ); wCommandField.addModifyListener( lsMod ); fdCommandField = new FormData(); fdCommandField.left = new FormAttachment( middle, margin ); fdCommandField.top = new FormAttachment( wdynamicCommand, margin ); fdCommandField.right = new FormAttachment( 100, 0 ); wCommandField.setLayoutData( fdCommandField ); wCommandField.addFocusListener( new FocusListener() { @Override public void focusLost( org.eclipse.swt.events.FocusEvent e ) { } @Override public void focusGained( org.eclipse.swt.events.FocusEvent e ) { get(); } } ); // Command String wlCommand = new Label( wCommands, SWT.RIGHT ); wlCommand.setText( BaseMessages.getString( PKG, "SSHDialog.Command.Label" ) ); props.setLook( wlCommand ); fdlCommand = new FormData(); fdlCommand.left = new FormAttachment( 0, margin ); fdlCommand.top = new FormAttachment( wCommandField, margin ); fdlCommand.right = new FormAttachment( middle, -2 * margin ); wlCommand.setLayoutData( fdlCommand ); wCommand = new StyledTextComp( transMeta, wCommands, SWT.MULTI | SWT.LEFT | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL, "" ); wCommand.setToolTipText( BaseMessages.getString( PKG, "SSHDialog.Command.Tooltip" ) ); props.setLook( wCommand ); wCommand.addModifyListener( lsMod ); fdCommand = new FormData(); fdCommand.left = new FormAttachment( middle, margin ); fdCommand.top = new FormAttachment( wCommandField, margin ); fdCommand.right = new FormAttachment( 100, -2 * margin ); fdCommand.bottom = new FormAttachment( 100, -margin ); wCommand.setLayoutData( fdCommand ); fdLogSettings = new FormData(); fdLogSettings.left = new FormAttachment( 0, margin ); fdLogSettings.top = new FormAttachment( wOutput, margin ); fdLogSettings.right = new FormAttachment( 100, -margin ); fdLogSettings.bottom = new FormAttachment( 100, -margin ); wCommands.setLayoutData( fdLogSettings ); // /////////////////////////////////////////////////////////// // / END OF Log SETTINGS GROUP // /////////////////////////////////////////////////////////// fdSettingsComp = new FormData(); fdSettingsComp.left = new FormAttachment( 0, 0 ); fdSettingsComp.top = new FormAttachment( 0, 0 ); fdSettingsComp.right = new FormAttachment( 100, 0 ); fdSettingsComp.bottom = new FormAttachment( 100, 0 ); wSettingsComp.setLayoutData( fdSettingsComp ); wSettingsComp.layout(); wSettingsTab.setControl( wSettingsComp ); // /////////////////////////////////////////////////////////// // / END OF Settings TAB // /////////////////////////////////////////////////////////// fdTabFolder = new FormData(); fdTabFolder.left = new FormAttachment( 0, 0 ); fdTabFolder.top = new FormAttachment( wStepname, margin ); fdTabFolder.right = new FormAttachment( 100, 0 ); fdTabFolder.bottom = new FormAttachment( 100, -50 ); wTabFolder.setLayoutData( fdTabFolder ); // THE BUTTONS wOK = new Button( shell, SWT.PUSH ); wOK.setText( BaseMessages.getString( PKG, "System.Button.OK" ) ); wPreview = new Button( shell, SWT.PUSH ); wPreview.setText( BaseMessages.getString( PKG, "SSHDialog.Button.PreviewRows" ) ); wCancel = new Button( shell, SWT.PUSH ); wCancel.setText( BaseMessages.getString( PKG, "System.Button.Cancel" ) ); setButtonPositions( new Button[] { wOK, wPreview, wCancel }, margin, wTabFolder ); // Add listeners lsOK = new Listener() { @Override public void handleEvent( Event e ) { ok(); } }; lsPreview = new Listener() { @Override public void handleEvent( Event e ) { preview(); } }; lsCancel = new Listener() { @Override public void handleEvent( Event e ) { cancel(); } }; lsTest = new Listener() { @Override public void handleEvent( Event e ) { test(); } }; wOK.addListener( SWT.Selection, lsOK ); wCancel.addListener( SWT.Selection, lsCancel ); wPreview.addListener( SWT.Selection, lsPreview ); wTest.addListener( SWT.Selection, lsTest ); lsDef = new SelectionAdapter() { @Override public void widgetDefaultSelected( SelectionEvent e ) { ok(); } }; wStepname.addSelectionListener( lsDef ); // Detect X or ALT-F4 or something that kills this window... shell.addShellListener( new ShellAdapter() { @Override public void shellClosed( ShellEvent e ) { cancel(); } } ); wTabFolder.setSelection( 0 ); // Set the shell size, based upon previous time... setSize(); getData(); activateKey(); activateDynamicCommand(); input.setChanged( changed ); shell.open(); while ( !shell.isDisposed() ) { if ( !display.readAndDispatch() ) { display.sleep(); } } return stepname; } /** * Copy information from the meta-data input to the dialog fields. */ public void getData() { wdynamicCommand.setSelection( input.isDynamicCommand() ); if ( input.getCommand() != null ) { wCommand.setText( input.getCommand() ); } if ( input.getcommandfieldname() != null ) { wCommandField.setText( input.getcommandfieldname() ); } if ( input.getServerName() != null ) { wServerName.setText( input.getServerName() ); } if ( input.getPort() != null ) { wPort.setText( input.getPort() ); } if ( input.getuserName() != null ) { wUserName.setText( input.getuserName() ); } if ( input.getpassword() != null ) { wPassword.setText( input.getpassword() ); } wUseKey.setSelection( input.isusePrivateKey() ); if ( input.getKeyFileName() != null ) { wPrivateKey.setText( input.getKeyFileName() ); } if ( input.getPassphrase() != null ) { wPassphrase.setText( input.getPassphrase() ); } if ( input.getStdOutFieldName() != null ) { wResultOutFieldName.setText( input.getStdOutFieldName() ); } if ( input.getStdErrFieldName() != null ) { wResultErrFieldName.setText( input.getStdErrFieldName() ); } wTimeOut.setText( Const.NVL( input.getTimeOut(), "0" ) ); if ( input.getProxyHost() != null ) { wProxyHost.setText( input.getProxyHost() ); } if ( input.getProxyPort() != null ) { wProxyPort.setText( input.getProxyPort() ); } if ( input.getProxyUsername() != null ) { wProxyUsername.setText( input.getProxyUsername() ); } if ( input.getProxyPassword() != null ) { wProxyPassword.setText( input.getProxyPassword() ); } wStepname.selectAll(); wStepname.setFocus(); } private void cancel() { stepname = null; input.setChanged( changed ); dispose(); } private void getInfo( SSHMeta in ) throws KettleException { stepname = wStepname.getText(); // return value in.setDynamicCommand( wdynamicCommand.getSelection() ); in.setCommand( wCommand.getText() ); in.setcommandfieldname( wCommandField.getText() ); in.setServerName( wServerName.getText() ); in.setPort( wPort.getText() ); in.setuserName( wUserName.getText() ); in.setpassword( wPassword.getText() ); in.usePrivateKey( wUseKey.getSelection() ); in.setKeyFileName( wPrivateKey.getText() ); in.setPassphrase( wPassphrase.getText() ); in.setstdOutFieldName( wResultOutFieldName.getText() ); in.setStdErrFieldName( wResultErrFieldName.getText() ); in.setTimeOut( wTimeOut.getText() ); in.setProxyHost( wProxyHost.getText() ); in.setProxyPort( wProxyPort.getText() ); in.setProxyUsername( wProxyUsername.getText() ); in.setProxyPassword( wProxyPassword.getText() ); } private void ok() { if ( Utils.isEmpty( wStepname.getText() ) ) { return; } try { getInfo( input ); } catch ( KettleException e ) { new ErrorDialog( shell, "Error", "Error while previewing data", e ); } dispose(); } private void activateKey() { wPrivateKey.setEnabled( wUseKey.getSelection() ); wPassphrase.setEnabled( wUseKey.getSelection() ); } private void activateDynamicCommand() { wlCommand.setEnabled( !wdynamicCommand.getSelection() ); wCommand.setEnabled( !wdynamicCommand.getSelection() ); wlCommandField.setEnabled( wdynamicCommand.getSelection() ); wCommandField.setEnabled( wdynamicCommand.getSelection() ); wPreview.setEnabled( !wdynamicCommand.getSelection() ); } private void get() { if ( !gotPreviousFields ) { gotPreviousFields = true; try { String source = wCommandField.getText(); wCommandField.removeAll(); RowMetaInterface r = transMeta.getPrevStepFields( stepname ); if ( r != null ) { wCommandField.setItems( r.getFieldNames() ); if ( source != null ) { wCommandField.setText( source ); } } } catch ( KettleException ke ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "SSHDialog.FailedToGetFields.DialogTitle" ), BaseMessages .getString( PKG, "SSHDialog.FailedToGetFields.DialogMessage" ), ke ); } } } private void test() { boolean testOK = false; String errMsg = null; String servername = transMeta.environmentSubstitute( wServerName.getText() ); int nrPort = Const.toInt( transMeta.environmentSubstitute( wPort.getText() ), 22 ); String username = transMeta.environmentSubstitute( wUserName.getText() ); String password = Utils.resolvePassword( transMeta, wPassword.getText() ); String keyFilename = transMeta.environmentSubstitute( wPrivateKey.getText() ); String passphrase = transMeta.environmentSubstitute( wPassphrase.getText() ); int timeOut = Const.toInt( transMeta.environmentSubstitute( wTimeOut.getText() ), 0 ); String proxyhost = transMeta.environmentSubstitute( wProxyHost.getText() ); int proxyport = Const.toInt( transMeta.environmentSubstitute( wProxyPort.getText() ), 0 ); String proxyusername = transMeta.environmentSubstitute( wProxyUsername.getText() ); String proxypassword = Utils.resolvePassword( transMeta, wProxyPassword.getText() ); Connection conn = null; try { conn = SSHData.OpenConnection( servername, nrPort, username, password, wUseKey.getSelection(), keyFilename, passphrase, timeOut, transMeta, proxyhost, proxyport, proxyusername, proxypassword ); testOK = true; } catch ( Exception e ) { errMsg = e.getMessage(); } finally { if ( conn != null ) { try { conn.close(); } catch ( Exception e ) { /* Ignore */ } } } if ( testOK ) { MessageBox mb = new MessageBox( shell, SWT.OK | SWT.ICON_INFORMATION ); mb.setMessage( BaseMessages.getString( PKG, "SSHDialog.Connected.OK", servername, username ) + Const.CR ); mb.setText( BaseMessages.getString( PKG, "SSHDialog.Connected.Title.Ok" ) ); mb.open(); } else { MessageBox mb = new MessageBox( shell, SWT.OK | SWT.ICON_ERROR ); mb.setMessage( BaseMessages.getString( PKG, "SSHDialog.Connected.NOK.ConnectionBad", servername, username ) + Const.CR + errMsg + Const.CR ); mb.setText( BaseMessages.getString( PKG, "SSHDialog.Connected.Title.Bad" ) ); mb.open(); } } /** * Preview the data generated by this step. This generates a transformation using this step & a dummy and previews it. * */ private void preview() { try { // Create the Access input step SSHMeta oneMeta = new SSHMeta(); getInfo( oneMeta ); TransMeta previewMeta = TransPreviewFactory.generatePreviewTransformation( transMeta, oneMeta, wStepname.getText() ); EnterNumberDialog numberDialog = new EnterNumberDialog( shell, 1, BaseMessages.getString( PKG, "SSHDialog.NumberRows.DialogTitle" ), BaseMessages.getString( PKG, "SSHDialog.NumberRows.DialogMessage" ) ); int previewSize = numberDialog.open(); if ( previewSize > 0 ) { TransPreviewProgressDialog progressDialog = new TransPreviewProgressDialog( shell, previewMeta, new String[] { wStepname.getText() }, new int[] { previewSize } ); progressDialog.open(); if ( !progressDialog.isCancelled() ) { Trans trans = progressDialog.getTrans(); String loggingText = progressDialog.getLoggingText(); if ( trans.getResult() != null && trans.getResult().getNrErrors() > 0 ) { EnterTextDialog etd = new EnterTextDialog( shell, BaseMessages.getString( PKG, "System.Dialog.PreviewError.Title" ), BaseMessages .getString( PKG, "System.Dialog.PreviewError.Message" ), loggingText, true ); etd.setReadOnly(); etd.open(); } PreviewRowsDialog prd = new PreviewRowsDialog( shell, transMeta, SWT.NONE, wStepname.getText(), progressDialog.getPreviewRowsMeta( wStepname .getText() ), progressDialog.getPreviewRows( wStepname.getText() ), loggingText ); prd.open(); } } } catch ( KettleException e ) { new ErrorDialog( shell, "Error", "Error while previewing data", e ); } } }