/*! ****************************************************************************** * * 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.singlethreader; import org.apache.commons.vfs2.FileObject; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; 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.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.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.step.StepMeta; import org.pentaho.di.trans.steps.singlethreader.SingleThreaderMeta; import org.pentaho.di.ui.core.ConstUI; import org.pentaho.di.ui.core.dialog.EnterSelectionDialog; 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; public class SingleThreaderDialog extends BaseStepDialog implements StepDialogInterface { private static Class<?> PKG = SingleThreaderMeta.class; // for i18n purposes, needed by Translator2!! private SingleThreaderMeta singleThreaderMeta; private Label wlPath; private TextVar wPath; private Button wbBrowse; private TextVar wBatchSize; private TextVar wInjectStep; private Button wGetInjectStep; private TextVar wRetrieveStep; private Button wGetRetrieveStep; private TableView wParameters; private TransMeta mappingTransMeta = null; protected boolean transModified; private ModifyListener lsMod; private ObjectId referenceObjectId; private ObjectLocationSpecificationMethod specificationMethod; private Button wPassParams; private Button wbGetParams; private TextVar wBatchTime; public SingleThreaderDialog( Shell parent, Object in, TransMeta tr, String sname ) { super( parent, (BaseStepMeta) in, tr, sname ); singleThreaderMeta = (SingleThreaderMeta) in; transModified = 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, singleThreaderMeta ); lsMod = new ModifyListener() { public void modifyText( ModifyEvent e ) { singleThreaderMeta.setChanged(); } }; changed = singleThreaderMeta.hasChanged(); FormLayout formLayout = new FormLayout(); formLayout.marginWidth = 15; formLayout.marginHeight = 15; shell.setLayout( formLayout ); shell.setText( BaseMessages.getString( PKG, "SingleThreaderDialog.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, "SingleThreaderDialog.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, "SingleThreaderDialog.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, "SingleThreaderDialog.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( true ); } } } ); CTabFolder wTabFolder = new CTabFolder( shell, SWT.BORDER ); props.setLook( wTabFolder, Props.WIDGET_STYLE_TAB ); // Options Tab Start CTabItem wOptionsTab = new CTabItem( wTabFolder, SWT.NONE ); wOptionsTab.setText( BaseMessages.getString( PKG, "SingleThreaderDialog.Options.Group.Label" ) ); Composite wOptions = new Composite( wTabFolder, SWT.SHADOW_NONE ); props.setLook( wOptions ); FormLayout specLayout = new FormLayout(); specLayout.marginWidth = 15; specLayout.marginHeight = 15; wOptions.setLayout( specLayout ); // Inject step // Label wlInjectStep = new Label( wOptions, SWT.LEFT ); wlInjectStep.setText( BaseMessages.getString( PKG, "SingleThreaderDialog.InjectStep.Label" ) ); props.setLook( wlInjectStep ); FormData fdlInjectStep = new FormData(); fdlInjectStep.top = new FormAttachment( 0, 0 ); fdlInjectStep.left = new FormAttachment( 0, 0 ); wlInjectStep.setLayoutData( fdlInjectStep ); wInjectStep = new TextVar( transMeta, wOptions, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wInjectStep ); wInjectStep.addModifyListener( lsMod ); FormData fdInjectStep = new FormData(); fdInjectStep.width = 250; fdInjectStep.left = new FormAttachment( 0, 0 ); fdInjectStep.top = new FormAttachment( wlInjectStep, 5 ); wInjectStep.setLayoutData( fdInjectStep ); wGetInjectStep = new Button( wOptions, SWT.PUSH ); wGetInjectStep.setText( BaseMessages.getString( PKG, "SingleThreaderDialog.Button.Get" ) ); FormData fdGetInjectStep = new FormData(); fdGetInjectStep.top = new FormAttachment( wlInjectStep, 5 ); fdGetInjectStep.left = new FormAttachment( wInjectStep, 5 ); wGetInjectStep.setLayoutData( fdGetInjectStep ); wGetInjectStep.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent arg0 ) { try { loadTransformation(); String stepname = mappingTransMeta == null ? "" : Const.NVL( getInjectorStep( mappingTransMeta ), "" ); wInjectStep.setText( stepname ); } catch ( Exception e ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "SingleThreaderDialog.ErrorLoadingTransformation.DialogTitle" ), BaseMessages.getString( PKG, "SingleThreaderDialog.ErrorLoadingTransformation.DialogMessage" ), e ); } } } ); // Retrieve step... // Label wlRetrieveStep = new Label( wOptions, SWT.LEFT ); wlRetrieveStep.setText( BaseMessages.getString( PKG, "SingleThreaderDialog.RetrieveStep.Label" ) ); props.setLook( wlRetrieveStep ); FormData fdlRetrieveStep = new FormData(); fdlRetrieveStep.top = new FormAttachment( wInjectStep, 10 ); fdlRetrieveStep.left = new FormAttachment( 0, 0 ); wlRetrieveStep.setLayoutData( fdlRetrieveStep ); wRetrieveStep = new TextVar( transMeta, wOptions, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wRetrieveStep ); wRetrieveStep.addModifyListener( lsMod ); FormData fdRetrieveStep = new FormData(); fdRetrieveStep.width = 250; fdRetrieveStep.left = new FormAttachment( 0, 0 ); fdRetrieveStep.top = new FormAttachment( wlRetrieveStep, 5 ); wRetrieveStep.setLayoutData( fdRetrieveStep ); wGetRetrieveStep = new Button( wOptions, SWT.PUSH ); wGetRetrieveStep.setText( BaseMessages.getString( PKG, "SingleThreaderDialog.Button.Get" ) ); FormData fdGetRetrieveStep = new FormData(); fdGetRetrieveStep.top = new FormAttachment( wlRetrieveStep, 5 ); fdGetRetrieveStep.left = new FormAttachment( wRetrieveStep, 5 ); wGetRetrieveStep.setLayoutData( fdGetRetrieveStep ); wGetRetrieveStep.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent arg0 ) { try { loadTransformation(); if ( mappingTransMeta != null ) { String[] stepNames = mappingTransMeta.getStepNames(); EnterSelectionDialog d = new EnterSelectionDialog( shell, stepNames, BaseMessages.getString( PKG, "SingleThreaderDialog.SelectStep.Title" ), BaseMessages.getString( PKG, "SingleThreaderDialog.SelectStep.Message" ) ); String step = d.open(); if ( step != null ) { wRetrieveStep.setText( step ); } } } catch ( Exception e ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "SingleThreaderDialog.ErrorLoadingTransformation.DialogTitle" ), BaseMessages.getString( PKG, "SingleThreaderDialog.ErrorLoadingTransformation.DialogMessage" ), e ); } } } ); // Here come the batch size, inject and retrieve fields... // Label wlBatchSize = new Label( wOptions, SWT.LEFT ); wlBatchSize.setText( BaseMessages.getString( PKG, "SingleThreaderDialog.BatchSize.Label" ) ); props.setLook( wlBatchSize ); FormData fdlBatchSize = new FormData(); fdlBatchSize.top = new FormAttachment( wRetrieveStep, 10 ); fdlBatchSize.left = new FormAttachment( 0, 0 ); wlBatchSize.setLayoutData( fdlBatchSize ); wBatchSize = new TextVar( transMeta, wOptions, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); FormData fdBatchSize = new FormData(); fdBatchSize.left = new FormAttachment( 0, 0 ); fdBatchSize.top = new FormAttachment( wlBatchSize, 5 ); wBatchSize.setLayoutData( fdBatchSize ); Label wlBatchTime = new Label( wOptions, SWT.LEFT ); wlBatchTime.setText( BaseMessages.getString( PKG, "SingleThreaderDialog.BatchTime.Label" ) ); props.setLook( wlBatchTime ); FormData fdlBatchTime = new FormData(); fdlBatchTime.top = new FormAttachment( wBatchSize, 10 ); fdlBatchTime.left = new FormAttachment( 0, 0 ); wlBatchTime.setLayoutData( fdlBatchTime ); wBatchTime = new TextVar( transMeta, wOptions, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); wBatchTime.addModifyListener( lsMod ); FormData fdBatchTime = new FormData(); fdBatchTime.left = new FormAttachment( 0, 0 ); fdBatchTime.top = new FormAttachment( wlBatchTime, 5 ); wBatchTime.setLayoutData( fdBatchTime ); wOptionsTab.setControl( wOptions ); FormData fdOptions = new FormData(); fdOptions.left = new FormAttachment( 0, 0 ); fdOptions.top = new FormAttachment( 0, 0 ); fdOptions.right = new FormAttachment( 100, 0 ); fdOptions.bottom = new FormAttachment( 100, 0 ); wOptions.setLayoutData( fdOptions ); // Options Tab End // Parameters Tab Start CTabItem wParametersTab = new CTabItem( wTabFolder, SWT.NONE ); wParametersTab.setText( BaseMessages.getString( PKG, "SingleThreaderDialog.Fields.Parameters.Label" ) ); FormLayout fieldLayout = new FormLayout(); fieldLayout.marginWidth = 15; fieldLayout.marginHeight = 15; Composite wParameterComp = new Composite( wTabFolder, SWT.NONE ); props.setLook( wParameterComp ); wParameterComp.setLayout( fieldLayout ); // Pass all parameters down // wPassParams = new Button( wParameterComp, SWT.CHECK ); props.setLook( wPassParams ); wPassParams.setText( BaseMessages.getString( PKG, "SingleThreaderDialog.PassAllParameters.Label" ) ); FormData fdPassParams = new FormData(); fdPassParams.left = new FormAttachment( 0, 0 ); fdPassParams.top = new FormAttachment( 0, 0 ); wPassParams.setLayoutData( fdPassParams ); wPassParams.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent arg0 ) { changed = true; } } ); wbGetParams = new Button( wParameterComp, SWT.PUSH ); wbGetParams.setText( BaseMessages.getString( PKG, "SingleThreaderDialog.GetParameters.Button.Label" ) ); FormData fdGetParams = new FormData(); fdGetParams.bottom = new FormAttachment( 100, 0 ); fdGetParams.right = new FormAttachment( 100, 0 ); wbGetParams.setLayoutData( fdGetParams ); wbGetParams.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent arg0 ) { getParameters( null ); // null: force reload of file from specification } } ); final int parameterRows = singleThreaderMeta.getParameters() != null ? singleThreaderMeta.getParameters().length : 0; ColumnInfo[] colinf = new ColumnInfo[] { new ColumnInfo( BaseMessages.getString( PKG, "SingleThreaderDialog.Parameters.Parameter.Label" ), ColumnInfo.COLUMN_TYPE_TEXT, false ), new ColumnInfo( BaseMessages.getString( PKG, "SingleThreaderDialog.Parameters.Value.Label" ), ColumnInfo.COLUMN_TYPE_TEXT, false ), }; colinf[1].setUsingVariables( true ); wParameters = new TableView( transMeta, wParameterComp, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI, colinf, parameterRows, false, lsMod, props, false ); FormData fdParameters = new FormData(); fdParameters.left = new FormAttachment( 0, 0 ); fdParameters.top = new FormAttachment( wPassParams, 10 ); fdParameters.right = new FormAttachment( 100 ); fdParameters.bottom = new FormAttachment( wbGetParams, -10 ); wParameters.setLayoutData( fdParameters ); wParameters.getTable().addListener( SWT.Resize, new ColumnsResizer( 0, 50, 50 ) ); FormData fdParametersComp = new FormData(); fdParametersComp.left = new FormAttachment( 0, 0 ); fdParametersComp.top = new FormAttachment( 0, 0 ); fdParametersComp.right = new FormAttachment( 100, 0 ); fdParametersComp.bottom = new FormAttachment( 100, 0 ); wParameterComp.setLayoutData( fdParametersComp ); wParameterComp.layout(); wParametersTab.setControl( wParameterComp ); wTabFolder.setSelection( 0 ); 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 ); 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 listeners lsCancel = new Listener() { public void handleEvent( Event e ) { cancel(); } }; lsOK = new Listener() { public void handleEvent( Event e ) { ok(); } }; wOK.addListener( SWT.Selection, lsOK ); wCancel.addListener( SWT.Selection, lsCancel ); lsDef = new SelectionAdapter() { public void widgetDefaultSelected( SelectionEvent e ) { ok(); } }; wPath.addSelectionListener( lsDef ); wStepname.addSelectionListener( lsDef ); wBatchSize.addSelectionListener( lsDef ); wBatchTime.addSelectionListener( lsDef ); wInjectStep.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(); getData(); singleThreaderMeta.setChanged( changed ); shell.open(); while ( !shell.isDisposed() ) { if ( !display.readAndDispatch() ) { display.sleep(); } } return stepname; } protected Image getImage() { return SwtSvgImageUtil .getImage( shell.getDisplay(), getClass().getClassLoader(), "MAP.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( mappingTransMeta.getRepositoryDirectory().getPath() ); String fullPath = path + "/" + mappingTransMeta.getName(); wPath.setText( fullPath ); specificationMethod = ObjectLocationSpecificationMethod.REPOSITORY_BY_NAME; } } catch ( KettleException ke ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "SingleThreaderDialog.ErrorSelectingObject.DialogTitle" ), BaseMessages.getString( PKG, "SingleThreaderDialog.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... // mappingTransMeta = repository.loadTransformation( transMeta.environmentSubstitute( transName ), repdir, null, true, null ); mappingTransMeta.clearChanged(); } private void selectFileTrans( boolean useVfs ) { String curFile = transMeta.environmentSubstitute( wPath.getText() ); if ( useVfs ) { 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, "SingleThreaderDialog.ErrorLoadingTransformation.DialogTitle" ), BaseMessages.getString( PKG, "SingleThreaderDialog.ErrorLoadingTransformation.DialogMessage" ), e ); } } } private void loadFileTrans( String fname ) throws KettleException { mappingTransMeta = new TransMeta( transMeta.environmentSubstitute( fname ) ); mappingTransMeta.clearChanged(); } private 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, "SingleThreaderDialog.Exception.NoValidMappingDetailsFound" ) ); } RepositoryDirectoryInterface repdir = repository.findDirectory( realDirectory ); if ( repdir == null ) { throw new KettleException( BaseMessages.getString( PKG, "SingleThreaderDialog.Exception.UnableToFindRepositoryDirectory)" ) ); } loadRepositoryTrans( realTransname, repdir ); break; case REPOSITORY_BY_REFERENCE: mappingTransMeta = repository.loadTransformation( referenceObjectId, null ); // load the last version mappingTransMeta.clearChanged(); break; default: break; } wInjectStep.setText( getInjectorStep( mappingTransMeta ) ); } /** * Copy information from the meta-data input to the dialog fields. */ public void getData() { specificationMethod = singleThreaderMeta.getSpecificationMethod(); switch ( specificationMethod ) { case FILENAME: wPath.setText( Const.NVL( singleThreaderMeta.getFileName(), "" ) ); break; case REPOSITORY_BY_NAME: String fullPath = Const.NVL( singleThreaderMeta.getDirectoryPath(), "" ) + "/" + Const .NVL( singleThreaderMeta.getTransName(), "" ); wPath.setText( fullPath ); break; case REPOSITORY_BY_REFERENCE: referenceObjectId = singleThreaderMeta.getTransObjectId(); getByReferenceData( referenceObjectId ); break; default: break; } wBatchSize.setText( Const.NVL( singleThreaderMeta.getBatchSize(), "" ) ); wBatchTime.setText( Const.NVL( singleThreaderMeta.getBatchTime(), "" ) ); wInjectStep.setText( Const.NVL( singleThreaderMeta.getInjectStep(), "" ) ); wRetrieveStep.setText( Const.NVL( singleThreaderMeta.getRetrieveStep(), "" ) ); // Parameters // if ( singleThreaderMeta.getParameters() != null ) { for ( int i = 0; i < singleThreaderMeta.getParameters().length; i++ ) { TableItem ti = wParameters.table.getItem( i ); if ( !Utils.isEmpty( singleThreaderMeta.getParameters()[i] ) ) { ti.setText( 1, Const.NVL( singleThreaderMeta.getParameters()[i], "" ) ); ti.setText( 2, Const.NVL( singleThreaderMeta.getParameterValues()[i], "" ) ); } } wParameters.removeEmptyRows(); wParameters.setRowNums(); wParameters.optWidth( true ); } wPassParams.setSelection( singleThreaderMeta.isPassingAllParameters() ); try { loadTransformation(); } catch ( Throwable t ) { // Skip the error, it becomes annoying otherwise } wStepname.selectAll(); wStepname.setFocus(); } 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 ); } } public static String getInjectorStep( TransMeta mappingTransMeta ) { for ( StepMeta stepMeta : mappingTransMeta.getSteps() ) { if ( stepMeta.getStepID().equals( "Injector" ) || stepMeta.getStepID().equals( "MappingInput" ) ) { return stepMeta.getName(); } } return ""; } private void cancel() { stepname = null; singleThreaderMeta.setChanged( changed ); dispose(); } private void getInfo( SingleThreaderMeta meta ) throws KettleException { loadTransformation(); if ( repository != null ) { specificationMethod = ObjectLocationSpecificationMethod.REPOSITORY_BY_NAME; } else { specificationMethod = ObjectLocationSpecificationMethod.FILENAME; } meta.setSpecificationMethod( specificationMethod ); switch ( specificationMethod ) { case FILENAME: meta.setFileName( wPath.getText() ); meta.setDirectoryPath( null ); meta.setTransName( null ); meta.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 ); } meta.setDirectoryPath( directory ); meta.setTransName( transName ); meta.setFileName( null ); meta.setTransObjectId( null ); break; default: break; } meta.setBatchSize( wBatchSize.getText() ); meta.setBatchTime( wBatchTime.getText() ); meta.setInjectStep( wInjectStep.getText() ); meta.setRetrieveStep( wRetrieveStep.getText() ); // The parameters... // int nritems = wParameters.nrNonEmpty(); int nr = 0; for ( int i = 0; i < nritems; i++ ) { String param = wParameters.getNonEmpty( i ).getText( 1 ); if ( !Utils.isEmpty( param ) ) { nr++; } } meta.setParameters( new String[nr] ); meta.setParameterValues( new String[nr] ); nr = 0; //CHECKSTYLE:Indentation:OFF for ( int i = 0; i < nritems; i++ ) { String param = wParameters.getNonEmpty( i ).getText( 1 ); String value = wParameters.getNonEmpty( i ).getText( 2 ); meta.getParameters()[nr] = param; meta.getParameterValues()[nr] = Const.NVL( value, "" ); nr++; } meta.setPassingAllParameters( wPassParams.getSelection() ); } private void ok() { if ( Utils.isEmpty( wStepname.getText() ) ) { return; } stepname = wStepname.getText(); // return value try { getInfo( singleThreaderMeta ); loadTransformation(); } catch ( KettleException e ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "SingleThreaderDialog.ErrorLoadingSpecifiedTransformation.Title" ), BaseMessages.getString( PKG, "SingleThreaderDialog.ErrorLoadingSpecifiedTransformation.Message" ), e ); } dispose(); } protected void getParameters( TransMeta mappingTransMeta ) { try { if ( mappingTransMeta == null ) { SingleThreaderMeta jet = new SingleThreaderMeta(); getInfo( jet ); mappingTransMeta = SingleThreaderMeta.loadSingleThreadedTransMeta( jet, repository, transMeta ); } String[] parameters = mappingTransMeta.listParameters(); String[] existing = wParameters.getItems( 1 ); for ( int i = 0; i < parameters.length; i++ ) { if ( Const.indexOfString( parameters[i], existing ) < 0 ) { TableItem item = new TableItem( wParameters.table, SWT.NONE ); item.setText( 1, parameters[i] ); } } wParameters.removeEmptyRows(); wParameters.setRowNums(); wParameters.optWidth( true ); } catch ( Exception e ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "SingleThreaderDialog.Exception.UnableToLoadTransformation.Title" ), BaseMessages.getString( PKG, "SingleThreaderDialog.Exception.UnableToLoadTransformation.Message" ), e ); } } }