/*! ******************************************************************************
*
* 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.trans.steps.sapinput;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
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.Cursor;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.program.Program;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.MessageBox;
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.util.Utils;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.di.core.database.sap.SAPR3DatabaseMeta;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.row.RowMeta;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.row.ValueMeta;
import org.pentaho.di.core.row.ValueMetaInterface;
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.sapinput.sap.SAPConnection;
import org.pentaho.di.trans.steps.sapinput.sap.SAPConnectionFactory;
import org.pentaho.di.trans.steps.sapinput.sap.SAPField;
import org.pentaho.di.trans.steps.sapinput.sap.SAPFunction;
import org.pentaho.di.trans.steps.sapinput.sap.SAPFunctionSignature;
import org.pentaho.di.trans.steps.sapinput.sap.SAPLibraryTester;
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.ColumnInfo;
import org.pentaho.di.ui.core.widget.TableView;
import org.pentaho.di.ui.trans.dialog.TransPreviewProgressDialog;
import org.pentaho.di.ui.trans.step.BaseStepDialog;
import org.pentaho.di.ui.trans.step.TableItemInsertListener;
public class SapInputDialog extends BaseStepDialog implements StepDialogInterface {
private static Class<?> PKG = SapInputMeta.class; // for i18n purposes, needed by Translator2!!
private CCombo wConnection;
private Label wlFunction;
private Text wFunction;
private Button wbFunction;
private Label wlInput;
private TableView wInput;
private Label wlOutput;
private TableView wOutput;
private Button wGet;
private Listener lsGet;
private SAPFunction function;
private SapInputMeta input;
// asc info
private Button wAbout;
private Link wAscLink;
/**
* List of ColumnInfo that should have the field names of the selected database table
*/
private List<ColumnInfo> inputFieldColumns = new ArrayList<ColumnInfo>();
/**
* List of ColumnInfo that should have the previous fields combo box
*/
private List<ColumnInfo> outputFieldColumns = new ArrayList<ColumnInfo>();
/**
* all fields from the previous steps
*/
private RowMetaInterface prevFields = null;
public SapInputDialog( Shell parent, Object in, TransMeta transMeta, String sname ) {
super( parent, (BaseStepMeta) in, transMeta, sname );
input = (SapInputMeta) in;
}
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 );
if ( !SAPLibraryTester.isJCoLibAvailable() ) {
int style = SWT.ICON_ERROR;
MessageBox messageBox = new MessageBox( shell, style );
messageBox.setMessage( BaseMessages.getString( PKG, "SapInputDialog.JCoLibNotFound" ) );
messageBox.open();
// dispose();
// return stepname;
}
if ( !SAPLibraryTester.isJCoImplAvailable() ) {
int style = SWT.ICON_ERROR;
MessageBox messageBox = new MessageBox( shell, style );
messageBox.setMessage( BaseMessages.getString( PKG, "SapInputDialog.JCoImplNotFound" ) );
messageBox.open();
// dispose();
// return stepname;
}
ModifyListener lsMod = new ModifyListener() {
public void modifyText( ModifyEvent e ) {
input.setChanged();
}
};
ModifyListener lsConnectionMod = new ModifyListener() {
public void modifyText( ModifyEvent e ) {
input.setChanged();
}
};
backupChanged = input.hasChanged();
FormLayout formLayout = new FormLayout();
formLayout.marginWidth = Const.FORM_MARGIN;
formLayout.marginHeight = Const.FORM_MARGIN;
shell.setLayout( formLayout );
shell.setText( BaseMessages.getString( PKG, "SapInputDialog.shell.Title" ) );
int middle = props.getMiddlePct();
int margin = Const.MARGIN;
// Stepname line
wlStepname = new Label( shell, SWT.RIGHT );
wlStepname.setText( BaseMessages.getString( PKG, "SapInputDialog.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 );
Control lastControl = wStepname;
// Connection line
//
wConnection = addConnectionLine( shell, lastControl, middle, margin );
List<String> items = new ArrayList<String>();
for ( DatabaseMeta dbMeta : transMeta.getDatabases() ) {
if ( dbMeta.getDatabaseInterface() instanceof SAPR3DatabaseMeta ) {
items.add( dbMeta.getName() );
}
}
wConnection.setItems( items.toArray( new String[items.size()] ) );
if ( input.getDatabaseMeta() == null && transMeta.nrDatabases() == 1 ) {
wConnection.select( 0 );
}
wConnection.addModifyListener( lsConnectionMod );
lastControl = wConnection;
// Function
//
wlFunction = new Label( shell, SWT.RIGHT );
wlFunction.setText( BaseMessages.getString( PKG, "SapInputDialog.Function.Label" ) );
props.setLook( wlFunction );
FormData fdlFunction = new FormData();
fdlFunction.left = new FormAttachment( 0, 0 );
fdlFunction.right = new FormAttachment( middle, -margin );
fdlFunction.top = new FormAttachment( lastControl, margin );
wlFunction.setLayoutData( fdlFunction );
wbFunction = new Button( shell, SWT.PUSH );
props.setLook( wbFunction );
wbFunction.setText( BaseMessages.getString( PKG, "SapInputDialog.FindFunctionButton.Label" ) );
FormData fdbFunction = new FormData();
fdbFunction.right = new FormAttachment( 100, 0 );
fdbFunction.top = new FormAttachment( lastControl, margin );
wbFunction.setLayoutData( fdbFunction );
wbFunction.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( SelectionEvent e ) {
getFunction();
}
} );
wFunction = new Text( shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
props.setLook( wFunction );
wFunction.addModifyListener( new ModifyListener() {
public void modifyText( ModifyEvent e ) {
function = new SAPFunction( ( (Text) e.widget ).getText() );
input.setChanged();
}
} );
FormData fdFunction = new FormData();
fdFunction.left = new FormAttachment( middle, 0 );
fdFunction.right = new FormAttachment( wbFunction, -margin );
fdFunction.top = new FormAttachment( lastControl, margin );
wFunction.setLayoutData( fdFunction );
lastControl = wFunction;
// The parameter input fields...
//
wlInput = new Label( shell, SWT.NONE );
wlInput.setText( BaseMessages.getString( PKG, "SapInputDialog.Input.Label" ) );
props.setLook( wlInput );
FormData fdlInput = new FormData();
fdlInput.left = new FormAttachment( 0, 0 );
fdlInput.top = new FormAttachment( lastControl, margin );
wlInput.setLayoutData( fdlInput );
ColumnInfo[] ciKey =
new ColumnInfo[] {
new ColumnInfo(
BaseMessages.getString( PKG, "SapInputDialog.ColumnInfo.Field" ), ColumnInfo.COLUMN_TYPE_CCOMBO,
new String[] { "" }, false ),
new ColumnInfo(
BaseMessages.getString( PKG, "SapInputDialog.ColumnInfo.SAPType" ), ColumnInfo.COLUMN_TYPE_CCOMBO,
SapType.getDescriptions() ),
new ColumnInfo(
BaseMessages.getString( PKG, "SapInputDialog.ColumnInfo.TableOrStruct" ),
ColumnInfo.COLUMN_TYPE_TEXT, false, false ),
new ColumnInfo(
BaseMessages.getString( PKG, "SapInputDialog.ColumnInfo.SAPParameterName" ),
ColumnInfo.COLUMN_TYPE_TEXT, false, false ),
new ColumnInfo(
BaseMessages.getString( PKG, "SapInputDialog.ColumnInfo.TargetType" ),
ColumnInfo.COLUMN_TYPE_CCOMBO, ValueMeta.getTypes() ), };
inputFieldColumns.add( ciKey[0] );
wInput =
new TableView(
transMeta, shell, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL, ciKey,
input.getParameters().size(), lsMod, props );
FormData fdInput = new FormData();
fdInput.left = new FormAttachment( 0, 0 );
fdInput.top = new FormAttachment( wlInput, margin );
fdInput.right = new FormAttachment( 100, 0 );
fdInput.bottom = new FormAttachment( 40, 0 );
wInput.setLayoutData( fdInput );
lastControl = wInput;
// 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, "System.Button.Preview"));
wGet = new Button( shell, SWT.PUSH );
wGet.setText( BaseMessages.getString( PKG, "SapInputDialog.GetFields.Button" ) );
wCancel = new Button( shell, SWT.PUSH );
wCancel.setText( BaseMessages.getString( PKG, "System.Button.Cancel" ) );
wAbout = new Button( shell, SWT.PUSH );
wAbout.setText( BaseMessages.getString( PKG, "SapInputDialog.About.Button" ) );
// Preview not possible without inputRowSets in BaseStep.getRow()
// setButtonPositions(new Button[] { wOK, wPreview, wAbout , wGet, wCancel}, margin, null);
setButtonPositions( new Button[] { wOK, wAbout, wGet, wCancel }, margin, null );
// The output fields...
//
wlOutput = new Label( shell, SWT.NONE );
wlOutput.setText( BaseMessages.getString( PKG, "SapInputDialog.Output.Label" ) );
props.setLook( wlOutput );
FormData fdlOutput = new FormData();
fdlOutput.left = new FormAttachment( 0, 0 );
fdlOutput.top = new FormAttachment( wInput, margin );
wlOutput.setLayoutData( fdlOutput );
ColumnInfo[] ciReturn =
new ColumnInfo[] {
new ColumnInfo(
BaseMessages.getString( PKG, "SapInputDialog.ColumnInfo.SAPField" ),
ColumnInfo.COLUMN_TYPE_CCOMBO, new String[] {}, false ),
new ColumnInfo(
BaseMessages.getString( PKG, "SapInputDialog.ColumnInfo.SAPType" ), ColumnInfo.COLUMN_TYPE_CCOMBO,
SapType.getDescriptions(), false ),
new ColumnInfo(
BaseMessages.getString( PKG, "SapInputDialog.ColumnInfo.TableOrStruct" ),
ColumnInfo.COLUMN_TYPE_TEXT, false ),
new ColumnInfo(
BaseMessages.getString( PKG, "SapInputDialog.ColumnInfo.NewName" ), ColumnInfo.COLUMN_TYPE_TEXT,
false ),
new ColumnInfo(
BaseMessages.getString( PKG, "SapInputDialog.ColumnInfo.TargetType" ),
ColumnInfo.COLUMN_TYPE_CCOMBO, ValueMeta.getTypes() ), };
outputFieldColumns.add( ciReturn[0] );
wOutput =
new TableView(
transMeta, shell, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL, ciReturn,
input.getOutputFields().size(), lsMod, props );
FormData fdOutput = new FormData();
fdOutput.left = new FormAttachment( 0, 0 );
fdOutput.top = new FormAttachment( wlOutput, margin );
fdOutput.right = new FormAttachment( 100, 0 );
fdOutput.bottom = new FormAttachment( wOK, -8 * margin );
wOutput.setLayoutData( fdOutput );
lastControl = wOutput;
this.wAscLink = new Link( this.shell, SWT.NONE );
FormData fdAscLink = new FormData();
fdAscLink.left = new FormAttachment( 0, 0 );
fdAscLink.top = new FormAttachment( wOutput, margin );
wAscLink.setLayoutData( fdAscLink );
this.wAscLink.setText( BaseMessages.getString( PKG, "SapInputDialog.Provided.Info" ) );
lastControl = wAscLink;
// Add listeners
lsOK = new Listener() {
public void handleEvent( Event e ) {
ok();
}
};
lsPreview = new Listener() {
public void handleEvent( Event e ) {
preview();
}
};
lsGet = new Listener() {
public void handleEvent( Event e ) {
get();
}
};
lsCancel = new Listener() {
public void handleEvent( Event e ) {
cancel();
}
};
Listener lsAbout = new Listener() {
public void handleEvent( Event e ) {
about();
}
};
wOK.addListener( SWT.Selection, lsOK );
// wPreview.addListener(SWT.Selection, lsPreview);
wGet.addListener( SWT.Selection, lsGet );
wCancel.addListener( SWT.Selection, lsCancel );
this.wAbout.addListener( SWT.Selection, lsAbout );
this.wAscLink.addListener( SWT.Selection, new Listener() {
public void handleEvent( final Event event ) {
Program.launch( event.text );
}
} );
lsDef = new SelectionAdapter() {
public void widgetDefaultSelected( SelectionEvent e ) {
ok();
}
};
wStepname.addSelectionListener( lsDef );
wFunction.addSelectionListener( lsDef );
// Detect X or ALT-F4 or something that kills this window...
shell.addShellListener( new ShellAdapter() {
public void shellClosed( ShellEvent e ) {
cancel();
}
} );
getData();
// Set the shell size, based upon previous time...
setSize();
input.setChanged( backupChanged );
setComboValues();
shell.open();
while ( !shell.isDisposed() ) {
if ( !display.readAndDispatch() ) {
display.sleep();
}
}
return stepname;
}
protected void getFunction() {
DatabaseMeta databaseMeta = transMeta.findDatabase( wConnection.getText() );
if ( databaseMeta == null ) {
showDatabaseWarning( false );
return;
}
SapFunctionBrowser browser =
new SapFunctionBrowser( shell, transMeta, SWT.NONE, databaseMeta, wFunction.getText() );
function = browser.open();
if ( function != null ) {
get();
}
}
private void setComboValues() {
Runnable fieldLoader = new Runnable() {
public void run() {
try {
prevFields = transMeta.getPrevStepFields( stepname );
} catch ( KettleException e ) {
prevFields = new RowMeta();
String msg = BaseMessages.getString( PKG, "SapInputDialog.DoMapping.UnableToFindInput" );
logError( msg );
}
String[] prevStepFieldNames = prevFields.getFieldNames();
Arrays.sort( prevStepFieldNames );
for ( int i = 0; i < inputFieldColumns.size(); i++ ) {
ColumnInfo colInfo = outputFieldColumns.get( i );
colInfo.setComboValues( prevStepFieldNames );
}
}
};
new Thread( fieldLoader ).start();
}
/**
* Copy information from the meta-data input to the dialog fields.
*/
public void getData() {
logDebug( BaseMessages.getString( PKG, "SapInputDialog.Log.GettingKeyInfo" ) );
// The database connection name...
//
if ( input.getDatabaseMeta() != null ) {
wConnection.setText( input.getDatabaseMeta().getName() );
} else if ( transMeta.nrDatabases() == 1 ) {
wConnection.setText( transMeta.getDatabase( 0 ).getName() );
}
// The name of the function to use
//
function = input.getFunction();
if ( input.getFunction() != null ) {
wFunction.setText( Const.NVL( input.getFunction().getName(), "" ) );
}
// The parameters...
//
for ( int i = 0; i < input.getParameters().size(); i++ ) {
SapParameter parameter = input.getParameters().get( i );
TableItem item = wInput.table.getItem( i );
int colnr = 1;
item.setText( colnr++, Const.NVL( parameter.getFieldName(), "" ) );
item.setText( colnr++, parameter.getSapType().getDescription() );
item.setText( colnr++, Const.NVL( parameter.getTableName(), "" ) );
item.setText( colnr++, Const.NVL( parameter.getParameterName(), "" ) );
item.setText( colnr++, ValueMeta.getTypeDesc( parameter.getTargetType() ) );
}
wInput.setRowNums();
wInput.optWidth( true );
// The parameters...
//
for ( int i = 0; i < input.getOutputFields().size(); i++ ) {
SapOutputField outputField = input.getOutputFields().get( i );
TableItem item = wOutput.table.getItem( i );
int colnr = 1;
item.setText( colnr++, Const.NVL( outputField.getSapFieldName(), "" ) );
item.setText( colnr++, outputField.getSapType().getDescription() );
item.setText( colnr++, Const.NVL( outputField.getTableName(), "" ) );
item.setText( colnr++, Const.NVL( outputField.getNewName(), "" ) );
item.setText( colnr++, ValueMeta.getTypeDesc( outputField.getTargetType() ) );
}
wOutput.setRowNums();
wOutput.optWidth( true );
}
private void cancel() {
stepname = null;
input.setChanged( backupChanged );
dispose();
}
private void ok() {
if ( Utils.isEmpty( wStepname.getText() ) ) {
return;
}
stepname = wStepname.getText(); // return value
if ( transMeta.findDatabase( wConnection.getText() ) == null ) {
int answer = showDatabaseWarning( true );
if ( answer == SWT.CANCEL ) {
return;
}
}
// check tablecount
Set<String> tables = new HashSet<String>();
int nrParameters = wOutput.nrNonEmpty();
for ( int i = 0; i < nrParameters; i++ ) {
TableItem item = wOutput.getNonEmpty( i );
String tableName = item.getText( 3 );
tables.add( tableName );
}
if ( tables.size() > 1 ) {
int answer = showMultipleOutputTablesWarning( true );
if ( answer == SWT.CANCEL ) {
return;
}
}
getInfo( input );
dispose();
}
// Preview the data
// unused
// preserve for later
private void preview() {
// Create the XML input step
SapInputMeta oneMeta = new SapInputMeta();
getInfo( oneMeta );
TransMeta previewMeta =
TransPreviewFactory.generatePreviewTransformation( transMeta, oneMeta, wStepname.getText() );
transMeta.getVariable( "Internal.Transformation.Filename.Directory" );
previewMeta.getVariable( "Internal.Transformation.Filename.Directory" );
EnterNumberDialog numberDialog = new EnterNumberDialog( shell, props.getDefaultPreviewSize(),
BaseMessages.getString( PKG, "CsvInputDialog.PreviewSize.DialogTitle" ),
BaseMessages.getString( PKG, "CsvInputDialog.PreviewSize.DialogMessage" ) );
int previewSize = numberDialog.open();
if ( previewSize > 0 ) {
TransPreviewProgressDialog progressDialog =
new TransPreviewProgressDialog(
shell, previewMeta, new String[] { wStepname.getText() }, new int[] { previewSize } );
progressDialog.open();
Trans trans = progressDialog.getTrans();
String loggingText = progressDialog.getLoggingText();
if ( !progressDialog.isCancelled() ) {
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();
}
}
private void about() {
new SapInputAboutDialog( SapInputDialog.this.shell ).open();
}
private int showDatabaseWarning( boolean includeCancel ) {
MessageBox mb = new MessageBox( shell, SWT.OK | ( includeCancel ? SWT.CANCEL : SWT.NONE ) | SWT.ICON_ERROR );
mb.setMessage( BaseMessages.getString( PKG, "SapInputDialog.InvalidConnection.DialogMessage" ) );
mb.setText( BaseMessages.getString( PKG, "SapInputDialog.InvalidConnection.DialogTitle" ) );
return mb.open();
}
private int showMultipleOutputTablesWarning( boolean includeCancel ) {
MessageBox mb = new MessageBox( shell, SWT.OK | ( includeCancel ? SWT.CANCEL : SWT.NONE ) | SWT.ICON_ERROR );
mb.setMessage( BaseMessages.getString( PKG, "SapInputDialog.MultipleOutputTables.DialogMessage" ) );
mb.setText( BaseMessages.getString( PKG, "SapInputDialog.MultipleOutputTables.DialogTitle" ) );
return mb.open();
}
private void getInfo( SapInputMeta meta ) {
meta.setDatabaseMeta( transMeta.findDatabase( wConnection.getText() ) );
meta.setFunction( function );
// Grab the parameters...
//
meta.getParameters().clear();
int nrParameters = wInput.nrNonEmpty();
for ( int i = 0; i < nrParameters; i++ ) {
TableItem item = wInput.getNonEmpty( i );
int colnr = 1;
String fieldName = item.getText( colnr++ );
SapType sapType = SapType.findTypeForDescription( item.getText( colnr++ ) );
String tableName = item.getText( colnr++ );
String parameterName = item.getText( colnr++ );
int targetType = ValueMeta.getType( item.getText( colnr++ ) );
meta.getParameters().add( new SapParameter( fieldName, sapType, tableName, parameterName, targetType ) );
}
// and the output fields.
//
meta.getOutputFields().clear();
int nrFields = wOutput.nrNonEmpty();
for ( int i = 0; i < nrFields; i++ ) {
TableItem item = wOutput.getNonEmpty( i );
int colnr = 1;
String sapFieldName = item.getText( colnr++ );
SapType sapType = SapType.findTypeForDescription( item.getText( colnr++ ) );
String tableName = item.getText( colnr++ );
String newName = item.getText( colnr++ );
int targetType = ValueMeta.getType( item.getText( colnr++ ) );
meta.getOutputFields().add( new SapOutputField( sapFieldName, sapType, tableName, newName, targetType ) );
}
}
private void get() {
try {
RowMetaInterface r = transMeta.getPrevStepFields( stepname );
if ( r != null && !r.isEmpty() ) {
TableItemInsertListener listener = new TableItemInsertListener() {
public boolean tableItemInserted( TableItem tableItem, ValueMetaInterface v ) {
tableItem.setText( 2, "=" );
return true;
}
};
BaseStepDialog.getFieldsFromPrevious( r, wInput, 1, new int[] { 1, 3 }, new int[] {}, -1, -1, listener );
}
DatabaseMeta databaseMeta = transMeta.findDatabase( wConnection.getText() );
if ( databaseMeta == null ) {
showDatabaseWarning( false );
return;
}
// Fill in the parameters too
//
if ( function != null ) {
wFunction.setText( function.getName() );
if ( wInput.nrNonEmpty() != 0 || wOutput.nrNonEmpty() != 0 ) {
MessageBox mb = new MessageBox( shell, SWT.YES | SWT.NO | SWT.ICON_QUESTION );
mb.setMessage( BaseMessages.getString( PKG, "SapInputDialog.ClearInputOutput.DialogMessage" ) );
mb.setText( BaseMessages.getString( PKG, "SapInputDialog.ClearInputOutput.DialogTitle" ) );
int answer = mb.open();
if ( answer == SWT.NO ) {
return;
}
}
wInput.clearAll( false );
wOutput.clearAll( false );
Cursor hourGlass = new Cursor( shell.getDisplay(), SWT.CURSOR_WAIT );
SAPConnection sc = SAPConnectionFactory.create();
try {
shell.setCursor( hourGlass );
sc.open( databaseMeta );
SAPFunctionSignature signature = sc.getFunctionSignature( function );
// Populate the input view
// TODO: clean this up a bit, feels a bit messy
//
int rownr = 0;
for ( SAPField field : signature.getInput() ) {
TableItem item;
if ( rownr == 0 ) {
item = wInput.table.getItem( 0 );
} else {
item = new TableItem( wInput.table, SWT.NONE );
}
rownr++;
SapType type = getSapType( field );
int colnr = 1;
item.setText( colnr++, Const.NVL( field.getName(), "" ) );
item.setText( colnr++, type == null ? "" : type.getDescription() );
item.setText( colnr++, Const.NVL( field.getTable(), "" ) );
item.setText( colnr++, Const.NVL( field.getName(), "" ) );
item.setText( colnr++, field.getTypePentaho() );
}
wInput.setRowNums();
wInput.optWidth( true );
// Get the output rows
//
rownr = 0;
for ( SAPField field : signature.getOutput() ) {
TableItem item;
if ( rownr == 0 ) {
item = wOutput.table.getItem( 0 );
} else {
item = new TableItem( wOutput.table, SWT.NONE );
}
rownr++;
SapType type = getSapType( field );
int colnr = 1;
item.setText( colnr++, Const.NVL( field.getName(), "" ) );
item.setText( colnr++, type == null ? "" : type.getDescription() );
item.setText( colnr++, Const.NVL( field.getTable(), "" ) );
item.setText( colnr++, Const.NVL( field.getName(), "" ) );
item.setText( colnr++, field.getTypePentaho() );
}
wOutput.setRowNums();
wOutput.optWidth( true );
} catch ( Exception e ) {
throw new KettleException( e );
} finally {
sc.close();
shell.setCursor( null );
hourGlass.dispose();
}
}
} catch ( KettleException ke ) {
new ErrorDialog(
shell, BaseMessages.getString( PKG, "SapInputDialog.GetFieldsFailed.DialogTitle" ), BaseMessages
.getString( PKG, "SapInputDialog.GetFieldsFailed.DialogMessage" ), ke );
}
}
private SapType getSapType( SAPField field ) {
String type = field.getType();
if ( type != null && type.startsWith( "input_" ) ) {
type = type.substring( "input_".length() );
} else if ( type != null && type.startsWith( "output_" ) ) {
type = type.substring( "output_".length() );
}
return SapType.findTypeForCode( type );
}
public String toString() {
return stepname;
}
}