org.pentaho.di.ui.trans.steps.palo.cellinput.PaloCellInputDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.di.ui.trans.steps.palo.cellinput.PaloCellInputDialog.java

Source

/*
 *   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 - 2017 Hitachi Vantara
 */

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

}