/*! ****************************************************************************** * * 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.trans.steps.transexecutor; import org.apache.commons.vfs2.FileObject; 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.custom.ScrolledComposite; 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.graphics.Image; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; 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.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import org.pentaho.di.core.Const; import org.pentaho.di.core.ObjectLocationSpecificationMethod; import org.pentaho.di.core.Props; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.row.value.ValueMetaFactory; import org.pentaho.di.core.util.Utils; import org.pentaho.di.core.vfs.KettleVFS; import org.pentaho.di.i18n.BaseMessages; import org.pentaho.di.repository.ObjectId; import org.pentaho.di.repository.RepositoryDirectoryInterface; import org.pentaho.di.repository.RepositoryObject; import org.pentaho.di.repository.RepositoryObjectType; import org.pentaho.di.trans.TransMeta; import org.pentaho.di.trans.step.BaseStepMeta; import org.pentaho.di.trans.step.StepDialogInterface; import org.pentaho.di.trans.steps.transexecutor.TransExecutorMeta; import org.pentaho.di.trans.steps.transexecutor.TransExecutorParameters; import org.pentaho.di.ui.core.ConstUI; import org.pentaho.di.ui.core.dialog.ErrorDialog; import org.pentaho.di.ui.core.widget.ColumnInfo; import org.pentaho.di.ui.core.widget.ColumnsResizer; import org.pentaho.di.ui.core.widget.TableView; import org.pentaho.di.ui.core.widget.TextVar; import org.pentaho.di.ui.repository.dialog.SelectObjectDialog; import org.pentaho.di.ui.spoon.Spoon; import org.pentaho.di.ui.trans.step.BaseStepDialog; import org.pentaho.di.ui.util.SwtSvgImageUtil; import org.pentaho.vfs.ui.VfsFileChooserDialog; import java.io.IOException; import java.util.Arrays; public class TransExecutorDialog extends BaseStepDialog implements StepDialogInterface { private static Class<?> PKG = TransExecutorMeta.class; // for i18n purposes, needed by Translator2!! private static int FIELD_DESCRIPTION = 1; private static int FIELD_NAME = 2; private TransExecutorMeta transExecutorMeta; private Label wlPath; private TextVar wPath; private Button wbBrowse; private CTabFolder wTabFolder; private TransMeta executorTransMeta = null; protected boolean jobModified; private ModifyListener lsMod; private Button wInheritAll; private TableView wTransExecutorParameters; private Label wlGroupSize; private TextVar wGroupSize; private Label wlGroupField; private CCombo wGroupField; private Label wlGroupTime; private TextVar wGroupTime; private Label wlExecutionResultTarget; private CCombo wExecutionResultTarget; private TableItem tiExecutionTimeField; private TableItem tiExecutionResultField; private TableItem tiExecutionNrErrorsField; private TableItem tiExecutionLinesReadField; private TableItem tiExecutionLinesWrittenField; private TableItem tiExecutionLinesInputField; private TableItem tiExecutionLinesOutputField; private TableItem tiExecutionLinesRejectedField; private TableItem tiExecutionLinesUpdatedField; private TableItem tiExecutionLinesDeletedField; private TableItem tiExecutionFilesRetrievedField; private TableItem tiExecutionExitStatusField; private TableItem tiExecutionLogTextField; private TableItem tiExecutionLogChannelIdField; private String executorOutputStep; private ObjectId referenceObjectId; private ObjectLocationSpecificationMethod specificationMethod; private ColumnInfo[] parameterColumns; private Label wlResultFilesTarget; private CCombo wResultFilesTarget; private Label wlResultFileNameField; private TextVar wResultFileNameField; private Label wlResultRowsTarget; private CCombo wOutputRowsSource; private Label wlOutputFields; private TableView wOutputFields; private Button wGetParameters; public TransExecutorDialog( Shell parent, Object in, TransMeta tr, String sname ) { super( parent, (BaseStepMeta) in, tr, sname ); transExecutorMeta = (TransExecutorMeta) in; jobModified = false; } public String open() { Shell parent = getParent(); Display display = parent.getDisplay(); shell = new Shell( parent, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MIN | SWT.MAX ); props.setLook( shell ); setShellImage( shell, transExecutorMeta ); lsMod = new ModifyListener() { public void modifyText( ModifyEvent e ) { transExecutorMeta.setChanged(); setFlags(); } }; changed = transExecutorMeta.hasChanged(); FormLayout formLayout = new FormLayout(); formLayout.marginWidth = 15; formLayout.marginHeight = 15; shell.setLayout( formLayout ); shell.setText( BaseMessages.getString( PKG, "TransExecutorDialog.Shell.Title" ) ); Label wicon = new Label( shell, SWT.RIGHT ); wicon.setImage( getImage() ); FormData fdlicon = new FormData(); fdlicon.top = new FormAttachment( 0, 0 ); fdlicon.right = new FormAttachment( 100, 0 ); wicon.setLayoutData( fdlicon ); props.setLook( wicon ); // Stepname line wlStepname = new Label( shell, SWT.RIGHT ); wlStepname.setText( BaseMessages.getString( PKG, "TransExecutorDialog.Stepname.Label" ) ); props.setLook( wlStepname ); fdlStepname = new FormData(); fdlStepname.left = new FormAttachment( 0, 0 ); fdlStepname.top = new FormAttachment( 0, 0 ); 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.width = 250; fdStepname.left = new FormAttachment( 0, 0 ); fdStepname.top = new FormAttachment( wlStepname, 5 ); wStepname.setLayoutData( fdStepname ); Label spacer = new Label( shell, SWT.HORIZONTAL | SWT.SEPARATOR ); FormData fdSpacer = new FormData(); fdSpacer.height = 1; fdSpacer.left = new FormAttachment( 0, 0 ); fdSpacer.top = new FormAttachment( wStepname, 15 ); fdSpacer.right = new FormAttachment( 100, 0 ); spacer.setLayoutData( fdSpacer ); wlPath = new Label( shell, SWT.LEFT ); props.setLook( wlPath ); wlPath.setText( BaseMessages.getString( PKG, "TransExecutorDialog.Transformation.Label" ) ); FormData fdlTransformation = new FormData(); fdlTransformation.left = new FormAttachment( 0, 0 ); fdlTransformation.top = new FormAttachment( spacer, 20 ); fdlTransformation.right = new FormAttachment( 50, 0 ); wlPath.setLayoutData( fdlTransformation ); wPath = new TextVar( transMeta, shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wPath ); FormData fdTransformation = new FormData(); fdTransformation.left = new FormAttachment( 0, 0 ); fdTransformation.top = new FormAttachment( wlPath, 5 ); fdTransformation.width = 350; wPath.setLayoutData( fdTransformation ); wbBrowse = new Button( shell, SWT.PUSH ); props.setLook( wbBrowse ); wbBrowse.setText( BaseMessages.getString( PKG, "TransExecutorDialog.Browse.Label" ) ); FormData fdBrowse = new FormData(); fdBrowse.left = new FormAttachment( wPath, 5 ); fdBrowse.top = new FormAttachment( wlPath, 5 ); wbBrowse.setLayoutData( fdBrowse ); wbBrowse.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { if ( repository != null ) { selectRepositoryTrans(); } else { selectFileTrans(); } } } ); // // Add a tab folder for the parameters and various input and output // streams // wTabFolder = new CTabFolder( shell, SWT.BORDER ); props.setLook( wTabFolder, Props.WIDGET_STYLE_TAB ); wTabFolder.setSimple( false ); wTabFolder.setUnselectedCloseVisible( true ); wCancel = new Button( shell, SWT.PUSH ); wCancel.setText( BaseMessages.getString( PKG, "System.Button.Cancel" ) ); FormData fdCancel = new FormData(); fdCancel.right = new FormAttachment( 100, 0 ); fdCancel.bottom = new FormAttachment( 100, 0 ); wCancel.setLayoutData( fdCancel ); // Some buttons wOK = new Button( shell, SWT.PUSH ); wOK.setText( BaseMessages.getString( PKG, "System.Button.OK" ) ); FormData fdOk = new FormData(); fdOk.right = new FormAttachment( wCancel, -5 ); fdOk.bottom = new FormAttachment( 100, 0 ); wOK.setLayoutData( fdOk ); Label hSpacer = new Label( shell, SWT.HORIZONTAL | SWT.SEPARATOR ); FormData fdhSpacer = new FormData(); fdhSpacer.height = 1; fdhSpacer.left = new FormAttachment( 0, 0 ); fdhSpacer.bottom = new FormAttachment( wCancel, -15 ); fdhSpacer.right = new FormAttachment( 100, 0 ); hSpacer.setLayoutData( fdhSpacer ); FormData fdTabFolder = new FormData(); fdTabFolder.left = new FormAttachment( 0, 0 ); fdTabFolder.top = new FormAttachment( wPath, 20 ); fdTabFolder.right = new FormAttachment( 100, 0 ); fdTabFolder.bottom = new FormAttachment( hSpacer, -15 ); wTabFolder.setLayoutData( fdTabFolder ); // Add the tabs... // addParametersTab(); addExecutionResultTab(); addRowGroupTab(); addResultRowsTab(); addResultFilesTab(); // Add listeners lsCancel = new Listener() { public void handleEvent( Event e ) { cancel(); } }; lsOK = new Listener() { public void handleEvent( Event e ) { ok(); } }; wCancel.addListener( SWT.Selection, lsCancel ); wOK.addListener( SWT.Selection, lsOK ); lsDef = new SelectionAdapter() { public void widgetDefaultSelected( SelectionEvent e ) { ok(); } }; wStepname.addSelectionListener( lsDef ); wPath.addSelectionListener( lsDef ); wResultFileNameField.addSelectionListener( lsDef ); // Detect X or ALT-F4 or something that kills this window... shell.addShellListener( new ShellAdapter() { public void shellClosed( ShellEvent e ) { cancel(); } } ); // Set the shell size, based upon previous time... setSize( shell, 620, 675 ); getData(); transExecutorMeta.setChanged( changed ); wTabFolder.setSelection( 0 ); shell.open(); while ( !shell.isDisposed() ) { if ( !display.readAndDispatch() ) { display.sleep(); } } return stepname; } protected Image getImage() { return SwtSvgImageUtil .getImage( shell.getDisplay(), getClass().getClassLoader(), "TRNEx.svg", ConstUI.ICON_SIZE, ConstUI.ICON_SIZE ); } private void selectRepositoryTrans() { try { SelectObjectDialog sod = new SelectObjectDialog( shell, repository ); String transName = sod.open(); RepositoryDirectoryInterface repdir = sod.getDirectory(); if ( transName != null && repdir != null ) { loadRepositoryTrans( transName, repdir ); String path = getPath( executorTransMeta.getRepositoryDirectory().getPath() ); String fullPath = path + "/" + executorTransMeta.getName(); wPath.setText( fullPath ); specificationMethod = ObjectLocationSpecificationMethod.REPOSITORY_BY_NAME; } } catch ( KettleException ke ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "TransExecutorDialog.ErrorSelectingObject.DialogTitle" ), BaseMessages.getString( PKG, "TransExecutorDialog.ErrorSelectingObject.DialogMessage" ), ke ); } } protected String getPath( String path ) { String parentPath = this.transMeta.getRepositoryDirectory().getPath(); if ( path.startsWith( parentPath ) ) { path = path.replace( parentPath, "${" + Const.INTERNAL_VARIABLE_ENTRY_CURRENT_DIRECTORY + "}" ); } return path; } private void loadRepositoryTrans( String transName, RepositoryDirectoryInterface repdir ) throws KettleException { // Read the transformation... // executorTransMeta = repository.loadTransformation( transMeta.environmentSubstitute( transName ), repdir, null, false, null ); executorTransMeta.clearChanged(); } private void selectFileTrans() { String curFile = transMeta.environmentSubstitute( wPath.getText() ); FileObject root = null; String parentFolder = null; try { parentFolder = KettleVFS.getFileObject( transMeta.environmentSubstitute( transMeta.getFilename() ) ).getParent().toString(); } catch ( Exception e ) { // Take no action } try { root = KettleVFS.getFileObject( curFile != null ? curFile : Const.getUserHomeDirectory() ); VfsFileChooserDialog vfsFileChooser = Spoon.getInstance().getVfsFileChooserDialog( root.getParent(), root ); FileObject file = vfsFileChooser.open( shell, null, Const.STRING_TRANS_FILTER_EXT, Const.getTransformationFilterNames(), VfsFileChooserDialog.VFS_DIALOG_OPEN_FILE ); if ( file == null ) { return; } String fileName = file.getName().toString(); if ( fileName != null ) { loadFileTrans( fileName ); if ( parentFolder != null && fileName.startsWith( parentFolder ) ) { fileName = fileName.replace( parentFolder, "${" + Const.INTERNAL_VARIABLE_ENTRY_CURRENT_DIRECTORY + "}" ); } wPath.setText( fileName ); specificationMethod = ObjectLocationSpecificationMethod.FILENAME; } } catch ( IOException | KettleException e ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "TransExecutorDialog.ErrorLoadingTransformation.DialogTitle" ), BaseMessages.getString( PKG, "TransExecutorDialog.ErrorLoadingTransformation.DialogMessage" ), e ); } } private void loadFileTrans( String fname ) throws KettleException { executorTransMeta = new TransMeta( transMeta.environmentSubstitute( fname ), repository ); executorTransMeta.clearChanged(); } // Method is defined as package-protected in order to be accessible by unit tests void loadTransformation() throws KettleException { String filename = wPath.getText(); if ( repository != null ) { specificationMethod = ObjectLocationSpecificationMethod.REPOSITORY_BY_NAME; } else { specificationMethod = ObjectLocationSpecificationMethod.FILENAME; } switch ( specificationMethod ) { case FILENAME: if ( Utils.isEmpty( filename ) ) { return; } if ( !filename.endsWith( ".ktr" ) ) { filename = filename + ".ktr"; wPath.setText( filename ); } loadFileTrans( filename ); break; case REPOSITORY_BY_NAME: if ( Utils.isEmpty( filename ) ) { return; } if ( filename.endsWith( ".ktr" ) ) { filename = filename.replace( ".ktr", "" ); wPath.setText( filename ); } String transPath = transMeta.environmentSubstitute( filename ); String realTransname = transPath; String realDirectory = ""; int index = transPath.lastIndexOf( "/" ); if ( index != -1 ) { realTransname = transPath.substring( index + 1 ); realDirectory = transPath.substring( 0, index ); } if ( Utils.isEmpty( realDirectory ) || Utils.isEmpty( realTransname ) ) { throw new KettleException( BaseMessages.getString( PKG, "TransExecutorDialog.Exception.NoValidMappingDetailsFound" ) ); } RepositoryDirectoryInterface repdir = repository.findDirectory( realDirectory ); if ( repdir == null ) { throw new KettleException( BaseMessages.getString( PKG, "TransExecutorDialog.Exception.UnableToFindRepositoryDirectory" ) ); } loadRepositoryTrans( realTransname, repdir ); break; default: break; } } /** * Copy information from the meta-data input to the dialog fields. */ public void getData() { specificationMethod = transExecutorMeta.getSpecificationMethod(); switch ( specificationMethod ) { case FILENAME: wPath.setText( Const.NVL( transExecutorMeta.getFileName(), "" ) ); break; case REPOSITORY_BY_NAME: String fullPath = Const.NVL( transExecutorMeta.getDirectoryPath(), "" ) + "/" + Const .NVL( transExecutorMeta.getTransName(), "" ); wPath.setText( fullPath ); break; case REPOSITORY_BY_REFERENCE: referenceObjectId = transExecutorMeta.getTransObjectId(); getByReferenceData( referenceObjectId ); break; default: break; } // TODO: throw in a separate thread. // try { String[] prevSteps = transMeta.getStepNames(); Arrays.sort( prevSteps ); wExecutionResultTarget.setItems( prevSteps ); wResultFilesTarget.setItems( prevSteps ); wOutputRowsSource.setItems( prevSteps ); String[] inputFields = transMeta.getPrevStepFields( stepMeta ).getFieldNames(); parameterColumns[ 1 ].setComboValues( inputFields ); wGroupField.setItems( inputFields ); } catch ( Exception e ) { log.logError( "couldn't get previous step list", e ); } wGroupSize.setText( Const.NVL( transExecutorMeta.getGroupSize(), "" ) ); wGroupTime.setText( Const.NVL( transExecutorMeta.getGroupTime(), "" ) ); wGroupField.setText( Const.NVL( transExecutorMeta.getGroupField(), "" ) ); wExecutionResultTarget.setText( transExecutorMeta.getExecutionResultTargetStepMeta() == null ? "" : transExecutorMeta.getExecutionResultTargetStepMeta().getName() ); tiExecutionTimeField.setText( FIELD_NAME, Const.NVL( transExecutorMeta.getExecutionTimeField(), "" ) ); tiExecutionResultField.setText( FIELD_NAME, Const.NVL( transExecutorMeta.getExecutionResultField(), "" ) ); tiExecutionNrErrorsField.setText( FIELD_NAME, Const.NVL( transExecutorMeta.getExecutionNrErrorsField(), "" ) ); tiExecutionLinesReadField.setText( FIELD_NAME, Const.NVL( transExecutorMeta.getExecutionLinesReadField(), "" ) ); tiExecutionLinesWrittenField .setText( FIELD_NAME, Const.NVL( transExecutorMeta.getExecutionLinesWrittenField(), "" ) ); tiExecutionLinesInputField.setText( FIELD_NAME, Const.NVL( transExecutorMeta.getExecutionLinesInputField(), "" ) ); tiExecutionLinesOutputField .setText( FIELD_NAME, Const.NVL( transExecutorMeta.getExecutionLinesOutputField(), "" ) ); tiExecutionLinesRejectedField .setText( FIELD_NAME, Const.NVL( transExecutorMeta.getExecutionLinesRejectedField(), "" ) ); tiExecutionLinesUpdatedField .setText( FIELD_NAME, Const.NVL( transExecutorMeta.getExecutionLinesUpdatedField(), "" ) ); tiExecutionLinesDeletedField .setText( FIELD_NAME, Const.NVL( transExecutorMeta.getExecutionLinesDeletedField(), "" ) ); tiExecutionFilesRetrievedField .setText( FIELD_NAME, Const.NVL( transExecutorMeta.getExecutionFilesRetrievedField(), "" ) ); tiExecutionExitStatusField.setText( FIELD_NAME, Const.NVL( transExecutorMeta.getExecutionExitStatusField(), "" ) ); tiExecutionLogTextField.setText( FIELD_NAME, Const.NVL( transExecutorMeta.getExecutionLogTextField(), "" ) ); tiExecutionLogChannelIdField .setText( FIELD_NAME, Const.NVL( transExecutorMeta.getExecutionLogChannelIdField(), "" ) ); executorOutputStep = transExecutorMeta.getExecutorsOutputStep(); // result files // wResultFilesTarget.setText( transExecutorMeta.getResultFilesTargetStepMeta() == null ? "" : transExecutorMeta .getResultFilesTargetStepMeta().getName() ); wResultFileNameField.setText( Const.NVL( transExecutorMeta.getResultFilesFileNameField(), "" ) ); // Result rows // wOutputRowsSource.setText( transExecutorMeta.getOutputRowsSourceStepMeta() == null ? "" : transExecutorMeta .getOutputRowsSourceStepMeta().getName() ); for ( int i = 0; i < transExecutorMeta.getOutputRowsField().length; i++ ) { TableItem item = new TableItem( wOutputFields.table, SWT.NONE ); item.setText( 1, Const.NVL( transExecutorMeta.getOutputRowsField()[ i ], "" ) ); item.setText( 2, ValueMetaFactory.getValueMetaName( transExecutorMeta.getOutputRowsType()[ i ] ) ); int length = transExecutorMeta.getOutputRowsLength()[ i ]; item.setText( 3, length < 0 ? "" : Integer.toString( length ) ); int precision = transExecutorMeta.getOutputRowsPrecision()[ i ]; item.setText( 4, precision < 0 ? "" : Integer.toString( precision ) ); } wOutputFields.removeEmptyRows(); wOutputFields.setRowNums(); wOutputFields.optWidth( true ); wTabFolder.setSelection( 0 ); try { loadTransformation(); } catch ( Throwable t ) { // Ignore errors } setFlags(); wStepname.selectAll(); wStepname.setFocus(); } private void addParametersTab() { CTabItem wParametersTab = new CTabItem( wTabFolder, SWT.NONE ); wParametersTab.setText( BaseMessages.getString( PKG, "TransExecutorDialog.Parameters.Title" ) ); wParametersTab.setToolTipText( BaseMessages.getString( PKG, "TransExecutorDialog.Parameters.Tooltip" ) ); Composite wParametersComposite = new Composite( wTabFolder, SWT.NONE ); props.setLook( wParametersComposite ); FormLayout parameterTabLayout = new FormLayout(); parameterTabLayout.marginWidth = 15; parameterTabLayout.marginHeight = 15; wParametersComposite.setLayout( parameterTabLayout ); // Add a button: get parameters // wGetParameters = new Button( wParametersComposite, SWT.PUSH ); wGetParameters.setText( BaseMessages.getString( PKG, "TransExecutorDialog.Parameters.GetParameters" ) ); props.setLook( wGetParameters ); FormData fdGetParameters = new FormData(); fdGetParameters.bottom = new FormAttachment( 100, 0 ); fdGetParameters.right = new FormAttachment( 100, 0 ); wGetParameters.setLayoutData( fdGetParameters ); wGetParameters.setSelection( transExecutorMeta.getParameters().isInheritingAllVariables() ); wGetParameters.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { getParametersFromTrans( null ); // null = force reload of data on disk } } ); // Now add a table view with the 3 columns to specify: variable name, input field & optional static input // parameterColumns = new ColumnInfo[] { new ColumnInfo( BaseMessages.getString( PKG, "TransExecutorDialog.Parameters.column.Variable" ), ColumnInfo.COLUMN_TYPE_TEXT, false, false ), new ColumnInfo( BaseMessages.getString( PKG, "TransExecutorDialog.Parameters.column.Field" ), ColumnInfo.COLUMN_TYPE_CCOMBO, new String[] {}, false ), new ColumnInfo( BaseMessages.getString( PKG, "TransExecutorDialog.Parameters.column.Input" ), ColumnInfo.COLUMN_TYPE_TEXT, false, false ), }; parameterColumns[ 1 ].setUsingVariables( true ); TransExecutorParameters parameters = transExecutorMeta.getParameters(); wTransExecutorParameters = new TableView( transMeta, wParametersComposite, SWT.FULL_SELECTION | SWT.SINGLE | SWT.BORDER, parameterColumns, parameters.getVariable().length, false, lsMod, props, false ); props.setLook( wTransExecutorParameters ); FormData fdTransExecutors = new FormData(); fdTransExecutors.left = new FormAttachment( 0, 0 ); fdTransExecutors.right = new FormAttachment( 100, 0 ); fdTransExecutors.top = new FormAttachment( 0, 0 ); fdTransExecutors.bottom = new FormAttachment( wGetParameters, -10 ); wTransExecutorParameters.setLayoutData( fdTransExecutors ); wTransExecutorParameters.getTable().addListener( SWT.Resize, new ColumnsResizer( 0, 33, 33, 33 ) ); for ( int i = 0; i < parameters.getVariable().length; i++ ) { TableItem tableItem = wTransExecutorParameters.table.getItem( i ); tableItem.setText( 1, Const.NVL( parameters.getVariable()[ i ], "" ) ); tableItem.setText( 2, Const.NVL( parameters.getField()[ i ], "" ) ); tableItem.setText( 3, Const.NVL( parameters.getInput()[ i ], "" ) ); } wTransExecutorParameters.setRowNums(); wTransExecutorParameters.optWidth( true ); // Add a checkbox: inherit all variables... // wInheritAll = new Button( wParametersComposite, SWT.CHECK ); wInheritAll.setText( BaseMessages.getString( PKG, "TransExecutorDialog.Parameters.InheritAll" ) ); props.setLook( wInheritAll ); FormData fdInheritAll = new FormData(); fdInheritAll.top = new FormAttachment( wTransExecutorParameters, 15 ); fdInheritAll.left = new FormAttachment( 0, 0 ); wInheritAll.setLayoutData( fdInheritAll ); wInheritAll.setSelection( transExecutorMeta.getParameters().isInheritingAllVariables() ); FormData fdParametersComposite = new FormData(); fdParametersComposite.left = new FormAttachment( 0, 0 ); fdParametersComposite.top = new FormAttachment( 0, 0 ); fdParametersComposite.right = new FormAttachment( 100, 0 ); fdParametersComposite.bottom = new FormAttachment( 100, 0 ); wParametersComposite.setLayoutData( fdParametersComposite ); wParametersComposite.layout(); wParametersTab.setControl( wParametersComposite ); } protected void getParametersFromTrans( TransMeta inputTransMeta ) { try { // Load the job in executorTransMeta // if ( inputTransMeta == null ) { loadTransformation(); inputTransMeta = executorTransMeta; } String[] parameters = inputTransMeta.listParameters(); for ( int i = 0; i < parameters.length; i++ ) { String name = parameters[ i ]; String desc = inputTransMeta.getParameterDescription( name ); TableItem item = new TableItem( wTransExecutorParameters.table, SWT.NONE ); item.setText( 1, Const.NVL( name, "" ) ); item.setText( 3, Const.NVL( desc, "" ) ); } wTransExecutorParameters.removeEmptyRows(); wTransExecutorParameters.setRowNums(); wTransExecutorParameters.optWidth( true ); } catch ( Exception e ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "TransExecutorDialog.ErrorLoadingSpecifiedTrans.Title" ), BaseMessages.getString( PKG, "TransExecutorDialog.ErrorLoadingSpecifiedTrans.Message" ), e ); } } private void addRowGroupTab() { final CTabItem wTab = new CTabItem( wTabFolder, SWT.NONE ); wTab.setText( BaseMessages.getString( PKG, "TransExecutorDialog.RowGroup.Title" ) ); wTab.setToolTipText( BaseMessages.getString( PKG, "TransExecutorDialog.RowGroup.Tooltip" ) ); Composite wInputComposite = new Composite( wTabFolder, SWT.NONE ); props.setLook( wInputComposite ); FormLayout tabLayout = new FormLayout(); tabLayout.marginWidth = 15; tabLayout.marginHeight = 15; wInputComposite.setLayout( tabLayout ); // Group size // wlGroupSize = new Label( wInputComposite, SWT.RIGHT ); props.setLook( wlGroupSize ); wlGroupSize.setText( BaseMessages.getString( PKG, "TransExecutorDialog.GroupSize.Label" ) ); FormData fdlGroupSize = new FormData(); fdlGroupSize.top = new FormAttachment( 0, 0 ); fdlGroupSize.left = new FormAttachment( 0, 0 ); wlGroupSize.setLayoutData( fdlGroupSize ); wGroupSize = new TextVar( transMeta, wInputComposite, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wGroupSize ); wGroupSize.addModifyListener( lsMod ); FormData fdGroupSize = new FormData(); fdGroupSize.width = 250; fdGroupSize.top = new FormAttachment( wlGroupSize, 5 ); fdGroupSize.left = new FormAttachment( 0, 0 ); wGroupSize.setLayoutData( fdGroupSize ); // Group field // wlGroupField = new Label( wInputComposite, SWT.RIGHT ); props.setLook( wlGroupField ); wlGroupField.setText( BaseMessages.getString( PKG, "TransExecutorDialog.GroupField.Label" ) ); FormData fdlGroupField = new FormData(); fdlGroupField.top = new FormAttachment( wGroupSize, 10 ); fdlGroupField.left = new FormAttachment( 0, 0 ); wlGroupField.setLayoutData( fdlGroupField ); wGroupField = new CCombo( wInputComposite, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wGroupField ); wGroupField.addModifyListener( lsMod ); FormData fdGroupField = new FormData(); fdGroupField.width = 250; fdGroupField.top = new FormAttachment( wlGroupField, 5 ); fdGroupField.left = new FormAttachment( 0, 0 ); wGroupField.setLayoutData( fdGroupField ); // Group time // wlGroupTime = new Label( wInputComposite, SWT.RIGHT ); props.setLook( wlGroupTime ); wlGroupTime.setText( BaseMessages.getString( PKG, "TransExecutorDialog.GroupTime.Label" ) ); FormData fdlGroupTime = new FormData(); fdlGroupTime.top = new FormAttachment( wGroupField, 10 ); fdlGroupTime.left = new FormAttachment( 0, 0 ); // First one in the left wlGroupTime.setLayoutData( fdlGroupTime ); wGroupTime = new TextVar( transMeta, wInputComposite, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wGroupTime ); wGroupTime.addModifyListener( lsMod ); FormData fdGroupTime = new FormData(); fdGroupTime.width = 250; fdGroupTime.top = new FormAttachment( wlGroupTime, 5 ); fdGroupTime.left = new FormAttachment( 0, 0 ); wGroupTime.setLayoutData( fdGroupTime ); wTab.setControl( wInputComposite ); wTabFolder.setSelection( wTab ); } private void addExecutionResultTab() { final CTabItem wTab = new CTabItem( wTabFolder, SWT.NONE ); wTab.setText( BaseMessages.getString( PKG, "TransExecutorDialog.ExecutionResults.Title" ) ); wTab.setToolTipText( BaseMessages.getString( PKG, "TransExecutorDialog.ExecutionResults.Tooltip" ) ); ScrolledComposite scrolledComposite = new ScrolledComposite( wTabFolder, SWT.V_SCROLL | SWT.H_SCROLL ); scrolledComposite.setLayout( new FillLayout() ); Composite wInputComposite = new Composite( scrolledComposite, SWT.NONE ); props.setLook( wInputComposite ); FormLayout tabLayout = new FormLayout(); tabLayout.marginWidth = 15; tabLayout.marginHeight = 15; wInputComposite.setLayout( tabLayout ); wlExecutionResultTarget = new Label( wInputComposite, SWT.RIGHT ); props.setLook( wlExecutionResultTarget ); wlExecutionResultTarget.setText( BaseMessages.getString( PKG, "TransExecutorDialog.ExecutionResultTarget.Label" ) ); FormData fdlExecutionResultTarget = new FormData(); fdlExecutionResultTarget.top = new FormAttachment( 0, 0 ); fdlExecutionResultTarget.left = new FormAttachment( 0, 0 ); // First one in the left wlExecutionResultTarget.setLayoutData( fdlExecutionResultTarget ); wExecutionResultTarget = new CCombo( wInputComposite, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wExecutionResultTarget ); wExecutionResultTarget.addModifyListener( lsMod ); FormData fdExecutionResultTarget = new FormData(); fdExecutionResultTarget.width = 250; fdExecutionResultTarget.top = new FormAttachment( wlExecutionResultTarget, 5 ); fdExecutionResultTarget.left = new FormAttachment( 0, 0 ); // To the right wExecutionResultTarget.setLayoutData( fdExecutionResultTarget ); ColumnInfo[] executionResultColumns = new ColumnInfo[] { new ColumnInfo( BaseMessages.getString( PKG, "TransExecutorMeta.ExecutionResults.FieldDescription.Label" ), ColumnInfo.COLUMN_TYPE_TEXT, false, true ), new ColumnInfo( BaseMessages.getString( PKG, "TransExecutorMeta.ExecutionResults.FieldName.Label" ), ColumnInfo.COLUMN_TYPE_TEXT, false, false ) }; executionResultColumns[ 1 ].setUsingVariables( true ); TableView wExectionResults = new TableView( transMeta, wInputComposite, SWT.FULL_SELECTION | SWT.SINGLE | SWT.BORDER, executionResultColumns, 14, false, lsMod, props, false ); props.setLook( wExectionResults ); FormData fdExecutionResults = new FormData(); fdExecutionResults.left = new FormAttachment( 0 ); fdExecutionResults.right = new FormAttachment( 100 ); fdExecutionResults.top = new FormAttachment( wExecutionResultTarget, 10 ); fdExecutionResults.bottom = new FormAttachment( 100 ); wExectionResults.setLayoutData( fdExecutionResults ); wExectionResults.getTable().addListener( SWT.Resize, new ColumnsResizer( 0, 50, 50 ) ); int index = 0; tiExecutionTimeField = wExectionResults.table.getItem( index++ ); tiExecutionResultField = wExectionResults.table.getItem( index++ ); tiExecutionNrErrorsField = wExectionResults.table.getItem( index++ ); tiExecutionLinesReadField = wExectionResults.table.getItem( index++ ); tiExecutionLinesWrittenField = wExectionResults.table.getItem( index++ ); tiExecutionLinesInputField = wExectionResults.table.getItem( index++ ); tiExecutionLinesOutputField = wExectionResults.table.getItem( index++ ); tiExecutionLinesRejectedField = wExectionResults.table.getItem( index++ ); tiExecutionLinesUpdatedField = wExectionResults.table.getItem( index++ ); tiExecutionLinesDeletedField = wExectionResults.table.getItem( index++ ); tiExecutionFilesRetrievedField = wExectionResults.table.getItem( index++ ); tiExecutionExitStatusField = wExectionResults.table.getItem( index++ ); tiExecutionLogTextField = wExectionResults.table.getItem( index++ ); tiExecutionLogChannelIdField = wExectionResults.table.getItem( index++ ); tiExecutionTimeField .setText( FIELD_DESCRIPTION, BaseMessages.getString( PKG, "TransExecutorDialog.ExecutionTimeField.Label" ) ); tiExecutionResultField .setText( FIELD_DESCRIPTION, BaseMessages.getString( PKG, "TransExecutorDialog.ExecutionResultField.Label" ) ); tiExecutionNrErrorsField .setText( FIELD_DESCRIPTION, BaseMessages.getString( PKG, "TransExecutorDialog.ExecutionNrErrorsField.Label" ) ); tiExecutionLinesReadField .setText( FIELD_DESCRIPTION, BaseMessages.getString( PKG, "TransExecutorDialog.ExecutionLinesReadField.Label" ) ); tiExecutionLinesWrittenField.setText( FIELD_DESCRIPTION, BaseMessages.getString( PKG, "TransExecutorDialog.ExecutionLinesWrittenField.Label" ) ); tiExecutionLinesInputField.setText( FIELD_DESCRIPTION, BaseMessages.getString( PKG, "TransExecutorDialog.ExecutionLinesInputField.Label" ) ); tiExecutionLinesOutputField.setText( FIELD_DESCRIPTION, BaseMessages.getString( PKG, "TransExecutorDialog.ExecutionLinesOutputField.Label" ) ); tiExecutionLinesRejectedField.setText( FIELD_DESCRIPTION, BaseMessages.getString( PKG, "TransExecutorDialog.ExecutionLinesRejectedField.Label" ) ); tiExecutionLinesUpdatedField.setText( FIELD_DESCRIPTION, BaseMessages.getString( PKG, "TransExecutorDialog.ExecutionLinesUpdatedField.Label" ) ); tiExecutionLinesDeletedField.setText( FIELD_DESCRIPTION, BaseMessages.getString( PKG, "TransExecutorDialog.ExecutionLinesDeletedField.Label" ) ); tiExecutionFilesRetrievedField.setText( FIELD_DESCRIPTION, BaseMessages.getString( PKG, "TransExecutorDialog.ExecutionFilesRetrievedField.Label" ) ); tiExecutionExitStatusField.setText( FIELD_DESCRIPTION, BaseMessages.getString( PKG, "TransExecutorDialog.ExecutionExitStatusField.Label" ) ); tiExecutionLogTextField .setText( FIELD_DESCRIPTION, BaseMessages.getString( PKG, "TransExecutorDialog.ExecutionLogTextField.Label" ) ); tiExecutionLogChannelIdField.setText( FIELD_DESCRIPTION, BaseMessages.getString( PKG, "TransExecutorDialog.ExecutionLogChannelIdField.Label" ) ); wTransExecutorParameters.setRowNums(); wTransExecutorParameters.optWidth( true ); wInputComposite.pack(); Rectangle bounds = wInputComposite.getBounds(); scrolledComposite.setContent( wInputComposite ); scrolledComposite.setExpandHorizontal( true ); scrolledComposite.setExpandVertical( true ); scrolledComposite.setMinWidth( bounds.width ); scrolledComposite.setMinHeight( bounds.height ); wTab.setControl( scrolledComposite ); wTabFolder.setSelection( wTab ); } private void addResultFilesTab() { final CTabItem wTab = new CTabItem( wTabFolder, SWT.NONE ); wTab.setText( BaseMessages.getString( PKG, "TransExecutorDialog.ResultFiles.Title" ) ); wTab.setToolTipText( BaseMessages.getString( PKG, "TransExecutorDialog.ResultFiles.Tooltip" ) ); ScrolledComposite scrolledComposite = new ScrolledComposite( wTabFolder, SWT.V_SCROLL | SWT.H_SCROLL ); scrolledComposite.setLayout( new FillLayout() ); Composite wInputComposite = new Composite( scrolledComposite, SWT.NONE ); props.setLook( wInputComposite ); FormLayout tabLayout = new FormLayout(); tabLayout.marginWidth = 15; tabLayout.marginHeight = 15; wInputComposite.setLayout( tabLayout ); wlResultFilesTarget = new Label( wInputComposite, SWT.RIGHT ); props.setLook( wlResultFilesTarget ); wlResultFilesTarget.setText( BaseMessages.getString( PKG, "TransExecutorDialog.ResultFilesTarget.Label" ) ); FormData fdlResultFilesTarget = new FormData(); fdlResultFilesTarget.top = new FormAttachment( 0, 0 ); fdlResultFilesTarget.left = new FormAttachment( 0, 0 ); // First one in the left wlResultFilesTarget.setLayoutData( fdlResultFilesTarget ); wResultFilesTarget = new CCombo( wInputComposite, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wResultFilesTarget ); wResultFilesTarget.addModifyListener( lsMod ); FormData fdResultFilesTarget = new FormData(); fdResultFilesTarget.width = 250; fdResultFilesTarget.top = new FormAttachment( wlResultFilesTarget, 5 ); fdResultFilesTarget.left = new FormAttachment( 0, 0 ); // To the right wResultFilesTarget.setLayoutData( fdResultFilesTarget ); // ResultFileNameField // wlResultFileNameField = new Label( wInputComposite, SWT.RIGHT ); props.setLook( wlResultFileNameField ); wlResultFileNameField.setText( BaseMessages.getString( PKG, "TransExecutorDialog.ResultFileNameField.Label" ) ); FormData fdlResultFileNameField = new FormData(); fdlResultFileNameField.top = new FormAttachment( wResultFilesTarget, 10 ); fdlResultFileNameField.left = new FormAttachment( 0, 0 ); // First one in the left wlResultFileNameField.setLayoutData( fdlResultFileNameField ); wResultFileNameField = new TextVar( transMeta, wInputComposite, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wResultFileNameField ); wResultFileNameField.addModifyListener( lsMod ); FormData fdResultFileNameField = new FormData(); fdResultFileNameField.width = 250; fdResultFileNameField.top = new FormAttachment( wlResultFileNameField, 5 ); fdResultFileNameField.left = new FormAttachment( 0, 0 ); // To the right wResultFileNameField.setLayoutData( fdResultFileNameField ); wInputComposite.pack(); Rectangle bounds = wInputComposite.getBounds(); scrolledComposite.setContent( wInputComposite ); scrolledComposite.setExpandHorizontal( true ); scrolledComposite.setExpandVertical( true ); scrolledComposite.setMinWidth( bounds.width ); scrolledComposite.setMinHeight( bounds.height ); wTab.setControl( scrolledComposite ); wTabFolder.setSelection( wTab ); } private void addResultRowsTab() { final CTabItem wTab = new CTabItem( wTabFolder, SWT.NONE ); wTab.setText( BaseMessages.getString( PKG, "TransExecutorDialog.ResultRows.Title" ) ); wTab.setToolTipText( BaseMessages.getString( PKG, "TransExecutorDialog.ResultRows.Tooltip" ) ); ScrolledComposite scrolledComposite = new ScrolledComposite( wTabFolder, SWT.V_SCROLL | SWT.H_SCROLL ); scrolledComposite.setLayout( new FillLayout() ); Composite wInputComposite = new Composite( scrolledComposite, SWT.NONE ); props.setLook( wInputComposite ); FormLayout tabLayout = new FormLayout(); tabLayout.marginWidth = 15; tabLayout.marginHeight = 15; wInputComposite.setLayout( tabLayout ); wlResultRowsTarget = new Label( wInputComposite, SWT.RIGHT ); props.setLook( wlResultRowsTarget ); wlResultRowsTarget.setText( BaseMessages.getString( PKG, "TransExecutorDialog.OutputRowsSource.Label" ) ); FormData fdlResultRowsTarget = new FormData(); fdlResultRowsTarget.top = new FormAttachment( 0, 0 ); fdlResultRowsTarget.left = new FormAttachment( 0, 0 ); // First one in the left wlResultRowsTarget.setLayoutData( fdlResultRowsTarget ); wOutputRowsSource = new CCombo( wInputComposite, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wOutputRowsSource ); wOutputRowsSource.addModifyListener( lsMod ); FormData fdResultRowsTarget = new FormData(); fdResultRowsTarget.width = 250; fdResultRowsTarget.top = new FormAttachment( wlResultRowsTarget, 5 ); fdResultRowsTarget.left = new FormAttachment( 0, 0 ); // To the right wOutputRowsSource.setLayoutData( fdResultRowsTarget ); wlOutputFields = new Label( wInputComposite, SWT.NONE ); wlOutputFields.setText( BaseMessages.getString( PKG, "TransExecutorDialog.ResultFields.Label" ) ); props.setLook( wlOutputFields ); FormData fdlResultFields = new FormData(); fdlResultFields.left = new FormAttachment( 0, 0 ); fdlResultFields.top = new FormAttachment( wOutputRowsSource, 10 ); wlOutputFields.setLayoutData( fdlResultFields ); int nrRows = ( transExecutorMeta.getOutputRowsField() != null ? transExecutorMeta.getOutputRowsField().length : 1 ); ColumnInfo[] ciResultFields = new ColumnInfo[] { new ColumnInfo( BaseMessages.getString( PKG, "TransExecutorDialog.ColumnInfo.Field" ), ColumnInfo.COLUMN_TYPE_TEXT, false, false ), new ColumnInfo( BaseMessages.getString( PKG, "TransExecutorDialog.ColumnInfo.Type" ), ColumnInfo.COLUMN_TYPE_CCOMBO, ValueMetaFactory.getValueMetaNames() ), new ColumnInfo( BaseMessages.getString( PKG, "TransExecutorDialog.ColumnInfo.Length" ), ColumnInfo.COLUMN_TYPE_TEXT, false ), new ColumnInfo( BaseMessages.getString( PKG, "TransExecutorDialog.ColumnInfo.Precision" ), ColumnInfo.COLUMN_TYPE_TEXT, false ), }; wOutputFields = new TableView( transMeta, wInputComposite, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL, ciResultFields, nrRows, false, lsMod, props, false ); FormData fdResultFields = new FormData(); fdResultFields.left = new FormAttachment( 0, 0 ); fdResultFields.top = new FormAttachment( wlOutputFields, 5 ); fdResultFields.right = new FormAttachment( 100, 0 ); fdResultFields.bottom = new FormAttachment( 100, 0 ); wOutputFields.setLayoutData( fdResultFields ); wOutputFields.getTable().addListener( SWT.Resize, new ColumnsResizer( 0, 25, 25, 25, 25 ) ); wInputComposite.pack(); Rectangle bounds = wInputComposite.getBounds(); scrolledComposite.setContent( wInputComposite ); scrolledComposite.setExpandHorizontal( true ); scrolledComposite.setExpandVertical( true ); scrolledComposite.setMinWidth( bounds.width ); scrolledComposite.setMinHeight( bounds.height ); wTab.setControl( scrolledComposite ); wTabFolder.setSelection( wTab ); } private void setFlags() { // Enable/disable fields... // if ( wlGroupSize == null || wlGroupSize == null || wlGroupField == null || wGroupField == null || wlGroupTime == null || wGroupTime == null ) { return; } boolean enableSize = Const.toInt( transMeta.environmentSubstitute( wGroupSize.getText() ), -1 ) >= 0; boolean enableField = !Utils.isEmpty( wGroupField.getText() ); // boolean enableTime = Const.toInt(transMeta.environmentSubstitute(wGroupTime.getText()), -1)>0; wlGroupSize.setEnabled( true ); wGroupSize.setEnabled( true ); wlGroupField.setEnabled( !enableSize ); wGroupField.setEnabled( !enableSize ); wlGroupTime.setEnabled( !enableSize && !enableField ); wGroupTime.setEnabled( !enableSize && !enableField ); } private void cancel() { stepname = null; transExecutorMeta.setChanged( changed ); dispose(); } private void ok() { if ( Utils.isEmpty( wStepname.getText() ) ) { return; } stepname = wStepname.getText(); // return value try { loadTransformation(); } catch ( KettleException e ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "TransExecutorDialog.ErrorLoadingSpecifiedTrans.Title" ), BaseMessages.getString( PKG, "TransExecutorDialog.ErrorLoadingSpecifiedTrans.Message" ), e ); } transExecutorMeta.setSpecificationMethod( specificationMethod ); switch ( specificationMethod ) { case FILENAME: transExecutorMeta.setFileName( wPath.getText() ); transExecutorMeta.setDirectoryPath( null ); transExecutorMeta.setTransName( null ); transExecutorMeta.setTransObjectId( null ); break; case REPOSITORY_BY_NAME: String transPath = wPath.getText(); String transName = transPath; String directory = ""; int index = transPath.lastIndexOf( "/" ); if ( index != -1 ) { transName = transPath.substring( index + 1 ); directory = transPath.substring( 0, index ); } transExecutorMeta.setDirectoryPath( directory ); transExecutorMeta.setTransName( transName ); transExecutorMeta.setFileName( null ); transExecutorMeta.setTransObjectId( null ); break; default: break; } // Load the information on the tabs, optionally do some // verifications... // collectInformation(); // Set the input steps for input mappings transExecutorMeta.searchInfoAndTargetSteps( transMeta.getSteps() ); transExecutorMeta.setChanged( true ); dispose(); } private void collectInformation() { // The parameters... // TransExecutorParameters parameters = transExecutorMeta.getParameters(); int nrLines = wTransExecutorParameters.nrNonEmpty(); String[] variables = new String[ nrLines ]; String[] fields = new String[ nrLines ]; String[] input = new String[ nrLines ]; parameters.setVariable( variables ); parameters.setField( fields ); parameters.setInput( input ); for ( int i = 0; i < nrLines; i++ ) { TableItem item = wTransExecutorParameters.getNonEmpty( i ); variables[ i ] = item.getText( 1 ); fields[ i ] = item.getText( 2 ); input[ i ] = item.getText( 3 ); } parameters.setInheritingAllVariables( wInheritAll.getSelection() ); // The group definition // transExecutorMeta.setGroupSize( wGroupSize.getText() ); transExecutorMeta.setGroupField( wGroupField.getText() ); transExecutorMeta.setGroupTime( wGroupTime.getText() ); transExecutorMeta.setExecutionResultTargetStep( wExecutionResultTarget.getText() ); transExecutorMeta.setExecutionResultTargetStepMeta( transMeta.findStep( wExecutionResultTarget.getText() ) ); transExecutorMeta.setExecutionTimeField( tiExecutionTimeField.getText( FIELD_NAME ) ); transExecutorMeta.setExecutionResultField( tiExecutionResultField.getText( FIELD_NAME ) ); transExecutorMeta.setExecutionNrErrorsField( tiExecutionNrErrorsField.getText( FIELD_NAME ) ); transExecutorMeta.setExecutionLinesReadField( tiExecutionLinesReadField.getText( FIELD_NAME ) ); transExecutorMeta.setExecutionLinesWrittenField( tiExecutionLinesWrittenField.getText( FIELD_NAME ) ); transExecutorMeta.setExecutionLinesInputField( tiExecutionLinesInputField.getText( FIELD_NAME ) ); transExecutorMeta.setExecutionLinesOutputField( tiExecutionLinesOutputField.getText( FIELD_NAME ) ); transExecutorMeta.setExecutionLinesRejectedField( tiExecutionLinesRejectedField.getText( FIELD_NAME ) ); transExecutorMeta.setExecutionLinesUpdatedField( tiExecutionLinesUpdatedField.getText( FIELD_NAME ) ); transExecutorMeta.setExecutionLinesDeletedField( tiExecutionLinesDeletedField.getText( FIELD_NAME ) ); transExecutorMeta.setExecutionFilesRetrievedField( tiExecutionFilesRetrievedField.getText( FIELD_NAME ) ); transExecutorMeta.setExecutionExitStatusField( tiExecutionExitStatusField.getText( FIELD_NAME ) ); transExecutorMeta.setExecutionLogTextField( tiExecutionLogTextField.getText( FIELD_NAME ) ); transExecutorMeta.setExecutionLogChannelIdField( tiExecutionLogChannelIdField.getText( FIELD_NAME ) ); transExecutorMeta.setResultFilesTargetStep( wResultFilesTarget.getText() ); transExecutorMeta.setResultFilesTargetStepMeta( transMeta.findStep( wResultFilesTarget.getText() ) ); transExecutorMeta.setResultFilesFileNameField( wResultFileNameField.getText() ); if ( !Utils.isEmpty( executorOutputStep ) ) { transExecutorMeta.setExecutorsOutputStep( executorOutputStep ); transExecutorMeta.setExecutorsOutputStepMeta( transMeta.findStep( executorOutputStep ) ); } // Result row info // transExecutorMeta.setOutputRowsSourceStep( wOutputRowsSource.getText() ); transExecutorMeta.setOutputRowsSourceStepMeta( transMeta.findStep( wOutputRowsSource.getText() ) ); int nrFields = wOutputFields.nrNonEmpty(); transExecutorMeta.setOutputRowsField( new String[ nrFields ] ); transExecutorMeta.setOutputRowsType( new int[ nrFields ] ); transExecutorMeta.setOutputRowsLength( new int[ nrFields ] ); transExecutorMeta.setOutputRowsPrecision( new int[ nrFields ] ); // CHECKSTYLE:Indentation:OFF for ( int i = 0; i < nrFields; i++ ) { TableItem item = wOutputFields.getNonEmpty( i ); transExecutorMeta.getOutputRowsField()[ i ] = item.getText( 1 ); transExecutorMeta.getOutputRowsType()[ i ] = ValueMetaFactory.getIdForValueMeta( item.getText( 2 ) ); transExecutorMeta.getOutputRowsLength()[ i ] = Const.toInt( item.getText( 3 ), -1 ); transExecutorMeta.getOutputRowsPrecision()[ i ] = Const.toInt( item.getText( 4 ), -1 ); } } private void getByReferenceData( ObjectId transObjectId ) { try { RepositoryObject transInf = repository.getObjectInformation( transObjectId, RepositoryObjectType.TRANSFORMATION ); String path = getPath( transInf.getRepositoryDirectory().getPath() ); String fullPath = Const.NVL( path, "" ) + "/" + Const.NVL( transInf.getName(), "" ); wPath.setText( fullPath ); } catch ( KettleException e ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "JobEntryTransDialog.Exception.UnableToReferenceObjectId.Title" ), BaseMessages.getString( PKG, "JobEntryTransDialog.Exception.UnableToReferenceObjectId.Message" ), e ); } } }