/*
* This file is part of PaloKettlePlugin.
*
* PaloKettlePlugin is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PaloKettlePlugin is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with PaloKettlePlugin. If not, see <http://www.gnu.org/licenses/>.
*
* Portions Copyright 2008 Stratebi Business Solutions, S.L.
* Portions Copyright 2011 De Bortoli Wines Pty Limited (Australia)
* Portions Copyright 2011 - 2016 Pentaho Corporation
*/
package org.pentaho.di.ui.trans.steps.palo.cellinput;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
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.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.Combo;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
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.exception.KettleException;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.palo.core.DimensionField;
import org.pentaho.di.palo.core.PaloNameComparator;
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.palo.cellinput.PaloCellInputData;
import org.pentaho.di.trans.steps.palo.cellinput.PaloCellInputMeta;
import org.pentaho.di.ui.core.PropsUI;
import org.pentaho.di.ui.core.dialog.EnterNumberDialog;
import org.pentaho.di.ui.core.dialog.EnterTextDialog;
import org.pentaho.di.ui.core.dialog.ErrorDialog;
import org.pentaho.di.ui.core.dialog.PreviewRowsDialog;
import org.pentaho.di.ui.core.gui.GUIResource;
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;
public class PaloCellInputDialog extends BaseStepDialog implements StepDialogInterface {
public static final String STRING_PALO_LIB_WARNING_PARAMETER = "PaloLibWarning";
private static Class<?> PKG = PaloCellInputMeta.class; // for
// i18n
// purposes,
// needed
// by
// Translator2!!
private final PaloCellInputMeta meta;
private TableView tableViewFields;
private Combo comboCube;
private Text textStepName;
private Text textMeasureName;
private Label labelStepName;
private Label labelMeasureName;
private Button buttonGetDimensions;
private Button buttonClearDimensions;
private Label labelCube;
private Button buttonOk;
private Button buttonCancel;
private Button buttonPreview;
private CCombo addConnectionLine;
private Label labelMeasureType;
private Combo comboMeasureType;
private ColumnInfo[] colinf;
public PaloCellInputDialog( Shell parent, Object in, TransMeta transMeta, String sname ) {
super( parent, (BaseStepMeta) in, transMeta, sname );
this.meta = (PaloCellInputMeta) in;
}
public String open() {
final Display display = getParent().getDisplay();
shell = new Shell( getParent(), SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.MIN );
props.setLook( shell );
setShellImage( shell, meta );
FormLayout formLayout = new FormLayout();
formLayout.marginWidth = Const.FORM_MARGIN;
formLayout.marginHeight = Const.FORM_MARGIN;
shell.setLayout( formLayout );
int middle = props.getMiddlePct();
int margin = Const.MARGIN;
FormData fd;
labelStepName = new Label( shell, SWT.RIGHT );
fd = new FormData();
fd.left = new FormAttachment( 0, 0 );
fd.right = new FormAttachment( middle, -margin );
fd.top = new FormAttachment( 0, margin );
labelStepName.setLayoutData( fd );
textStepName = new Text( shell, SWT.BORDER | SWT.FILL );
fd = new FormData();
fd.left = new FormAttachment( middle, 0 );
fd.right = new FormAttachment( 100, 0 );
fd.top = new FormAttachment( 0, margin );
textStepName.setLayoutData( fd );
addConnectionLine = addConnectionLine( shell, textStepName, Const.MIDDLE_PCT, margin );
labelCube = new Label( shell, SWT.RIGHT );
fd = new FormData();
fd.left = new FormAttachment( 0, 0 );
fd.right = new FormAttachment( middle, -margin );
fd.top = new FormAttachment( addConnectionLine, margin );
labelCube.setLayoutData( fd );
comboCube = new Combo( shell, SWT.READ_ONLY | SWT.FILL );
fd = new FormData();
fd.left = new FormAttachment( middle, 0 );
fd.right = new FormAttachment( 100, 0 );
fd.top = new FormAttachment( addConnectionLine, margin );
comboCube.setLayoutData( fd );
labelMeasureName = new Label( shell, SWT.RIGHT );
fd = new FormData();
fd.left = new FormAttachment( 0, 0 );
fd.right = new FormAttachment( middle, -margin );
fd.top = new FormAttachment( comboCube, margin );
labelMeasureName.setLayoutData( fd );
textMeasureName = new Text( shell, SWT.BORDER | SWT.FILL );
fd = new FormData();
fd.left = new FormAttachment( middle, 0 );
fd.right = new FormAttachment( 100, 0 );
fd.top = new FormAttachment( comboCube, margin );
textMeasureName.setLayoutData( fd );
labelMeasureType = new Label( shell, SWT.RIGHT );
fd = new FormData();
fd.left = new FormAttachment( 0, 0 );
fd.right = new FormAttachment( middle, -margin );
fd.top = new FormAttachment( textMeasureName, margin );
labelMeasureType.setLayoutData( fd );
comboMeasureType = new Combo( shell, SWT.READ_ONLY | SWT.FILL );
fd = new FormData();
fd.left = new FormAttachment( middle, 0 );
fd.right = new FormAttachment( 100, 0 );
fd.top = new FormAttachment( textMeasureName, margin );
comboMeasureType.setLayoutData( fd );
ModifyListener lsMod = new ModifyListener() {
public void modifyText( ModifyEvent e ) {
meta.setChanged();
}
};
colinf =
new ColumnInfo[]{
new ColumnInfo( getLocalizedColumn( 0 ), ColumnInfo.COLUMN_TYPE_TEXT, false, true ),
new ColumnInfo( getLocalizedColumn( 1 ), ColumnInfo.COLUMN_TYPE_TEXT, false ),
new ColumnInfo( getLocalizedColumn( 2 ), ColumnInfo.COLUMN_TYPE_CCOMBO, new String[]{ "String", "Number" },
true ) };
tableViewFields = new TableView( null, shell, SWT.FILL | SWT.BORDER, colinf, 10, true, lsMod, props );
tableViewFields.setSize( 477, 280 );
tableViewFields.setBounds( 5, 150, 477, 280 );
tableViewFields.setReadonly( true );
tableViewFields.setSortable( false );
fd = new FormData();
fd.left = new FormAttachment( 0, margin );
fd.top = new FormAttachment( comboMeasureType, 3 * margin );
fd.right = new FormAttachment( 100, -150 );
fd.bottom = new FormAttachment( 100, -50 );
tableViewFields.setLayoutData( fd );
buttonGetDimensions = new Button( shell, SWT.NONE );
fd = new FormData();
fd.left = new FormAttachment( tableViewFields, margin );
fd.top = new FormAttachment( comboMeasureType, 3 * margin );
fd.right = new FormAttachment( 100, 0 );
buttonGetDimensions.setLayoutData( fd );
buttonClearDimensions = new Button( shell, SWT.NONE );
fd = new FormData();
fd.left = new FormAttachment( tableViewFields, margin );
fd.top = new FormAttachment( buttonGetDimensions, margin );
fd.right = new FormAttachment( 100, 0 );
buttonClearDimensions.setLayoutData( fd );
buttonOk = new Button( shell, SWT.CENTER );
buttonCancel = new Button( shell, SWT.CENTER );
buttonPreview = new Button( shell, SWT.CENTER );
buttonOk.setText( BaseMessages.getString( "System.Button.OK" ) );
buttonPreview.setText( BaseMessages.getString( "System.Button.Preview" ) );
buttonCancel.setText( BaseMessages.getString( "System.Button.Cancel" ) );
setButtonPositions( new Button[]{ buttonOk, buttonPreview, buttonCancel }, margin, null );
buttonGetDimensions.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( SelectionEvent e ) {
doGetDimensions();
}
} );
buttonClearDimensions.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( SelectionEvent e ) {
doClearDimensions();
}
} );
comboCube.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( SelectionEvent e ) {
doSelectCube();
}
} );
buttonCancel.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( SelectionEvent e ) {
cancel();
}
} );
buttonOk.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( SelectionEvent e ) {
ok();
}
} );
buttonPreview.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( SelectionEvent e ) {
preview();
}
} );
addConnectionLine.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( SelectionEvent e ) {
doSelectConnection( false );
}
} );
this.fillLocalizedData();
this.fillStoredData();
this.doSelectConnection( false );
props.setLook( tableViewFields );
props.setLook( comboCube );
props.setLook( textStepName );
props.setLook( textMeasureName );
props.setLook( labelStepName );
props.setLook( labelMeasureName );
props.setLook( buttonGetDimensions );
props.setLook( buttonClearDimensions );
props.setLook( labelCube );
props.setLook( buttonOk );
props.setLook( buttonCancel );
props.setLook( buttonPreview );
props.setLook( addConnectionLine );
props.setLook( labelMeasureType );
props.setLook( comboMeasureType );
shell.addShellListener( new ShellAdapter() {
public void shellClosed( ShellEvent e ) {
cancel();
}
} );
meta.setChanged( changed );
setSize();
shell.open();
showPaloLibWarningDialog( shell );
while ( !shell.isDisposed() ) {
if ( !display.readAndDispatch() ) {
display.sleep();
}
}
return stepname;
}
private void fillStoredData() {
if ( stepname != null ) {
textStepName.setText( stepname );
}
int index = addConnectionLine.indexOf( meta.getDatabaseMeta() != null ? meta.getDatabaseMeta().getName() : "" );
if ( index >= 0 ) {
addConnectionLine.select( index );
}
tableViewFields.table.removeAll();
if ( meta.getFields().size() > 0 ) {
for ( DimensionField level : meta.getFields() ) {
tableViewFields.add( level.getDimensionName(), level.getFieldName(), level.getFieldType() );
}
tableViewFields.setRowNums();
tableViewFields.optWidth( true );
}
if ( meta.getCube() != null ) {
comboCube.add( meta.getCube() );
comboCube.select( 0 );
}
comboMeasureType.setItems( new String[]{ "String", "Number" } );
if ( meta.getCubeMeasure() != null ) {
if ( meta.getCubeMeasure().getFieldType() != null ) {
int indexType = comboMeasureType.indexOf( meta.getCubeMeasure().getFieldType() );
if ( indexType >= 0 ) {
comboMeasureType.select( indexType );
}
}
}
if ( meta.getCubeMeasure() != null ) {
if ( meta.getCubeMeasure().getFieldName() != null ) {
textMeasureName.setText( meta.getCubeMeasure().getFieldName() );
}
}
}
private String getLocalizedColumn( int columnIndex ) {
switch ( columnIndex ) {
case 0:
return BaseMessages.getString( PKG, "PaloCellInputDialog.ColumnDimension" );
case 1:
return BaseMessages.getString( PKG, "PaloCellInputDialog.ColumnField" );
case 2:
return BaseMessages.getString( PKG, "PaloCellInputDialog.ColumnType" );
default:
return "";
}
}
private void fillLocalizedData() {
buttonGetDimensions.setText( BaseMessages.getString( PKG, "PaloCellInputDialog.GetDimensions" ) );
buttonClearDimensions.setText( BaseMessages.getString( PKG, "PaloCellInputDialog.ClearDimensions" ) );
labelCube.setText( BaseMessages.getString( PKG, "PaloCellInputDialog.SelectCube" ) );
labelStepName.setText( BaseMessages.getString( PKG, "PaloCellInputDialog.StepName" ) );
shell.setText( BaseMessages.getString( PKG, "PaloCellInputDialog.PaloCellInput" ) );
labelMeasureName.setText( BaseMessages.getString( PKG, "PaloCellInputDialog.MeasureName" ) );
labelMeasureType.setText( BaseMessages.getString( PKG, "PaloCellInputDialog.MeasureType" ) );
}
private void doClearDimensions() {
tableViewFields.table.removeAll();
}
private void doGetDimensions() {
try {
if ( comboCube.getText() != null && comboCube.getText() != "" ) {
if ( addConnectionLine.getText() != null ) {
DatabaseMeta dbMeta = transMeta.findDatabase( addConnectionLine.getText() );
if ( dbMeta != null ) {
PaloCellInputData data = new PaloCellInputData( dbMeta );
data.helper.connect();
List<String> cubeDimensions = data.helper.getCubeDimensions( comboCube.getText() );
tableViewFields.table.removeAll();
for ( int i = 0; i < cubeDimensions.size(); i++ ) {
final TableItem item = new TableItem( tableViewFields.table, SWT.NONE );
item.setText( 1, cubeDimensions.get( i ) );
item.setText( 2, cubeDimensions.get( i ) );
item.setText( 3, "String" );
}
tableViewFields.removeEmptyRows();
tableViewFields.setRowNums();
tableViewFields.optWidth( true );
tableViewFields.setReadonly( true );
data.helper.disconnect();
}
}
} else {
new ErrorDialog(
shell,
BaseMessages.getString( PKG, "System.Dialog.GetFieldsFailed.Title" ),
BaseMessages.getString( PKG, "System.Dialog.GetFieldsFailed.Message" ),
new Exception( BaseMessages.getString( PKG, "PaloCellInputDialog.SelectCubeFirstError" ) ) );
}
} catch ( KettleException ke ) {
new ErrorDialog(
shell,
BaseMessages.getString( PKG, "System.Dialog.GetFieldsFailed.Title" ),
BaseMessages.getString( PKG, "System.Dialog.GetFieldsFailed.Message" ), ke );
}
}
private void doSelectCube() {
// tableViewFields.table.removeAll();
}
private void doSelectConnection( boolean clearCurrentData ) {
try {
if ( clearCurrentData ) {
tableViewFields.table.removeAll();
comboCube.removeAll();
}
if ( addConnectionLine.getText() != null ) {
DatabaseMeta dbMeta = transMeta.findDatabase( addConnectionLine.getText() );
if ( dbMeta != null ) {
PaloCellInputData data = new PaloCellInputData( dbMeta );
data.helper.connect();
List<String> cubes = data.helper.getCubesNames();
Collections.sort( cubes, new PaloNameComparator() );
for ( String cubeName : cubes ) {
if ( comboCube.indexOf( cubeName ) == -1 ) {
comboCube.add( cubeName );
}
}
data.helper.disconnect();
}
}
} catch ( Exception ex ) {
new ErrorDialog( shell, BaseMessages.getString( PKG, "PaloCellInputDialog.RetreiveCubesErrorTitle" ),
BaseMessages.getString( PKG, "PaloCellInputDialog.RetreiveCubesError" ), ex );
}
}
private void cancel() {
stepname = null;
meta.setChanged( changed );
dispose();
}
private void ok() {
try {
getInfo( this.meta );
dispose();
} catch ( KettleException e ) {
new ErrorDialog( shell, BaseMessages.getString( PKG, "PaloCellInputDialog.FailedToSaveDataErrorTitle" ),
BaseMessages.getString( PKG, "PaloCellInputDialog.FailedToSaveDataError" ), e );
}
}
public static void showPaloLibWarningDialog( Shell shell ) {
PropsUI props = PropsUI.getInstance();
if ( "Y".equalsIgnoreCase( props.getCustomParameter( STRING_PALO_LIB_WARNING_PARAMETER, "Y" ) ) ) {
MessageDialogWithToggle md =
new MessageDialogWithToggle(
shell,
BaseMessages.getString( PKG, "PaloCellInputDialog.PaloLibWarningDialog.DialogTitle" ),
null,
BaseMessages.getString( PKG, "PaloCellInputDialog.PaloLibWarningDialog.DialogMessage", Const.CR )
+ Const.CR,
MessageDialog.WARNING,
new String[]{ BaseMessages.getString( PKG, "PaloCellInputDialog.PaloLibWarningDialog.Option1" ) },
0,
BaseMessages.getString( PKG, "PaloCellInputDialog.PaloLibWarningDialog.Option2" ),
"N".equalsIgnoreCase( props.getCustomParameter( STRING_PALO_LIB_WARNING_PARAMETER, "Y" )
)
);
MessageDialogWithToggle.setDefaultImage( GUIResource.getInstance().getImageSpoon() );
md.open();
props.setCustomParameter( STRING_PALO_LIB_WARNING_PARAMETER, md.getToggleState() ? "N" : "Y" );
props.saveProps();
}
}
private void getInfo( PaloCellInputMeta myMeta ) throws KettleException {
stepname = textStepName.getText();
List<DimensionField> fields = new ArrayList<DimensionField>();
for ( int i = 0; i < tableViewFields.table.getItemCount(); i++ ) {
DimensionField field =
new DimensionField( tableViewFields.table.getItem( i ).getText( 1 ), tableViewFields.table.getItem( i )
.getText( 2 ), tableViewFields.table.getItem( i ).getText( 3 ) );
fields.add( field );
}
myMeta.setDatabaseMeta( transMeta.findDatabase( addConnectionLine.getText() ) );
myMeta.setCubeMeasureName( new DimensionField( "Measure", textMeasureName.getText(), comboMeasureType.getText() ) );
myMeta.setLevels( fields );
myMeta.setCube( comboCube.getText() );
myMeta.setChanged( true );
}
private void preview() {
PaloCellInputMeta oneMeta = new PaloCellInputMeta();
try {
getInfo( oneMeta );
if ( oneMeta.getFields() == null || oneMeta.getFields().size() == 0 ) {
throw new KettleException( "Fields must be defined to do a preview" );
} else {
for ( DimensionField field : oneMeta.getFields() ) {
if ( Utils.isEmpty( field.getFieldType() ) ) {
throw new KettleException( "All fields must have an output type to do the preview" );
}
}
}
} catch ( KettleException e ) {
new ErrorDialog( shell, BaseMessages.getString( PKG, "RowGeneratorDialog.Illegal.Dialog.Settings.Title" ),
BaseMessages.getString( PKG, "RowGeneratorDialog.Illegal.Dialog.Settings.Message" ), e );
return;
}
TransMeta previewMeta =
TransPreviewFactory.generatePreviewTransformation( transMeta, oneMeta, textStepName.getText() );
EnterNumberDialog numberDialog =
new EnterNumberDialog( shell, 500, BaseMessages.getString( PKG, "System.Dialog.EnterPreviewSize.Title" ),
BaseMessages.getString( PKG, "System.Dialog.EnterPreviewSize.Message" ) );
int previewSize = numberDialog.open();
if ( previewSize > 0 ) {
TransPreviewProgressDialog progressDialog =
new TransPreviewProgressDialog( shell, previewMeta, new String[]{ textStepName.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, textStepName.getText(), progressDialog
.getPreviewRowsMeta( textStepName.getText() ), progressDialog.getPreviewRows( textStepName.getText() ),
loggingText );
prd.open();
}
}
}