/* * 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(); } } }