org.pentaho.di.trans.steps.hbaseinput.HBaseInputDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.di.trans.steps.hbaseinput.HBaseInputDialog.java

Source

/*******************************************************************************
 *
 * Pentaho Big Data
 *
 * Copyright (C) 2002-2013 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.hbaseinput;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
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.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.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
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.Props;
import org.pentaho.di.core.namedcluster.model.NamedCluster;
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.TransMeta;
import org.pentaho.di.trans.step.BaseStepMeta;
import org.pentaho.di.trans.step.StepDialogInterface;
import org.pentaho.di.ui.core.dialog.ErrorDialog;
import org.pentaho.di.ui.core.gui.GUIResource;
import org.pentaho.di.ui.core.namedcluster.NamedClusterWidget;
import org.pentaho.di.ui.core.widget.ColumnInfo;
import org.pentaho.di.ui.core.widget.ComboValuesSelectionListener;
import org.pentaho.di.ui.core.widget.TableView;
import org.pentaho.di.ui.core.widget.TextVar;
import org.pentaho.di.ui.trans.step.BaseStepDialog;
import org.pentaho.hbase.mapping.ConfigurationProducer;
import org.pentaho.hbase.mapping.MappingAdmin;
import org.pentaho.hbase.mapping.MappingEditor;
import org.pentaho.hbase.shim.api.ColumnFilter;
import org.pentaho.hbase.shim.api.HBaseValueMeta;
import org.pentaho.hbase.shim.api.Mapping;
import org.pentaho.hbase.shim.spi.HBaseConnection;

/**
 * Dialog class for HBaseInput
 * 
 * @author Mark Hall (mhall{[at]}pentaho{[dot]}com)
 */
public class HBaseInputDialog extends BaseStepDialog implements StepDialogInterface, ConfigurationProducer {

    /** various UI bits and pieces for the dialog */
    private Label m_stepnameLabel;
    private Text m_stepnameText;

    // The tabs of the dialog
    private CTabFolder m_wTabFolder;
    private CTabItem m_wConfigTab;

    private CTabItem m_wFilterTab;

    private CTabItem m_editorTab;

    NamedClusterWidget namedClusterWidget;

    // Core config line
    private Button m_coreConfigBut;
    private TextVar m_coreConfigText;

    // Default config line
    private Button m_defaultConfigBut;
    private TextVar m_defaultConfigText;

    private final HBaseInputMeta m_currentMeta;
    private final HBaseInputMeta m_originalMeta;
    private final HBaseInputMeta m_configurationMeta;

    // Table name line
    private Button m_mappedTableNamesBut;
    private CCombo m_mappedTableNamesCombo;

    // Mapping name line
    private Button m_mappingNamesBut;
    private CCombo m_mappingNamesCombo;

    /** Store the mapping information in the step's meta data */
    private Button m_storeMappingInStepMetaData;

    // Key start line
    private TextVar m_keyStartText;

    // Key stop line
    private TextVar m_keyStopText;

    // Rows to be cached by Scanner
    private TextVar m_scanCacheText;

    // Key as a column
    // private Button m_includeKey;

    // Key information
    private Label m_keyInfo;
    private Button m_getKeyInfoBut;

    // Fields table widget
    private TableView m_fieldsView;

    // filters fields widget
    private TableView m_filtersView;
    private ColumnInfo m_filterAliasCI;
    private Button m_matchAllBut;
    private Button m_matchAnyBut;

    // mapping editor composite
    private MappingEditor m_mappingEditor;

    // cached copy of the mapped columns
    private Map<String, HBaseValueMeta> m_mappedColumns;

    // lookup map for indexed columns
    private Map<String, String> m_indexedLookup = new HashMap<String, String>();

    public HBaseInputDialog(Shell parent, Object in, TransMeta tr, String name) {

        super(parent, (BaseStepMeta) in, tr, name);

        m_currentMeta = (HBaseInputMeta) in;
        m_originalMeta = (HBaseInputMeta) m_currentMeta.clone();
        m_configurationMeta = (HBaseInputMeta) m_currentMeta.clone();
    }

    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, m_currentMeta);

        // used to listen to a text field (m_wStepname)
        ModifyListener lsMod = new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                m_currentMeta.setChanged();
            }
        };

        changed = m_currentMeta.hasChanged();

        FormLayout formLayout = new FormLayout();
        formLayout.marginWidth = Const.FORM_MARGIN;
        formLayout.marginHeight = Const.FORM_MARGIN;

        shell.setLayout(formLayout);
        shell.setText(Messages.getString("HBaseInputDialog.Shell.Title"));

        int middle = props.getMiddlePct();
        int margin = Const.MARGIN;

        // Stepname line
        m_stepnameLabel = new Label(shell, SWT.RIGHT);
        m_stepnameLabel.setText(Messages.getString("HBaseInputDialog.StepName.Label"));
        props.setLook(m_stepnameLabel);

        FormData fd = new FormData();
        fd.left = new FormAttachment(0, 0);
        fd.right = new FormAttachment(middle, -margin);
        fd.top = new FormAttachment(0, margin);
        m_stepnameLabel.setLayoutData(fd);
        m_stepnameText = new Text(shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
        m_stepnameText.setText(stepname);
        props.setLook(m_stepnameText);
        m_stepnameText.addModifyListener(lsMod);

        // format the text field
        fd = new FormData();
        fd.left = new FormAttachment(middle, 0);
        fd.top = new FormAttachment(0, margin);
        fd.right = new FormAttachment(100, 0);
        m_stepnameText.setLayoutData(fd);

        m_wTabFolder = new CTabFolder(shell, SWT.BORDER);
        props.setLook(m_wTabFolder, Props.WIDGET_STYLE_TAB);
        m_wTabFolder.setSimple(false);

        // Start of the config tab
        m_wConfigTab = new CTabItem(m_wTabFolder, SWT.NONE);
        m_wConfigTab.setText(Messages.getString("HBaseInputDialog.ConfigTab.TabTitle"));

        Composite wConfigComp = new Composite(m_wTabFolder, SWT.NONE);
        props.setLook(wConfigComp);

        FormLayout configLayout = new FormLayout();
        configLayout.marginWidth = 3;
        configLayout.marginHeight = 3;
        wConfigComp.setLayout(configLayout);

        Label namedClusterLab = new Label(wConfigComp, SWT.RIGHT);
        namedClusterLab.setText(Messages.getString("HBaseInputDialog.NamedCluster.Label"));
        namedClusterLab.setToolTipText(Messages.getString("HBaseInputDialog.NamedCluster.TipText"));
        props.setLook(namedClusterLab);
        fd = new FormData();
        fd.left = new FormAttachment(0, 0);
        fd.top = new FormAttachment(0, 10);
        fd.right = new FormAttachment(middle, -margin);
        namedClusterLab.setLayoutData(fd);

        namedClusterWidget = new NamedClusterWidget(wConfigComp, false);
        namedClusterWidget.initiate();
        props.setLook(namedClusterWidget);
        fd = new FormData();
        fd.right = new FormAttachment(100, 0);
        fd.top = new FormAttachment(0, 0);
        fd.left = new FormAttachment(middle, 0);
        namedClusterWidget.setLayoutData(fd);

        // core config line
        Label coreConfigLab = new Label(wConfigComp, SWT.RIGHT);
        coreConfigLab.setText(Messages.getString("HBaseInputDialog.CoreConfig.Label"));
        coreConfigLab.setToolTipText(Messages.getString("HBaseInputDialog.CoreConfig.TipText"));
        props.setLook(coreConfigLab);
        fd = new FormData();
        fd.left = new FormAttachment(0, 0);
        fd.top = new FormAttachment(namedClusterWidget, margin);
        fd.right = new FormAttachment(middle, -margin);
        coreConfigLab.setLayoutData(fd);

        m_coreConfigBut = new Button(wConfigComp, SWT.PUSH | SWT.CENTER);
        props.setLook(m_coreConfigBut);
        m_coreConfigBut.setText(Messages.getString("System.Button.Browse"));
        fd = new FormData();
        fd.right = new FormAttachment(100, 0);
        fd.top = new FormAttachment(namedClusterWidget, 0);
        m_coreConfigBut.setLayoutData(fd);

        m_coreConfigBut.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                FileDialog dialog = new FileDialog(shell, SWT.OPEN);
                String[] extensions = null;
                String[] filterNames = null;

                extensions = new String[2];
                filterNames = new String[2];
                extensions[0] = "*.xml";
                filterNames[0] = Messages.getString("HBaseInputDialog.FileType.XML");
                extensions[1] = "*";
                filterNames[1] = Messages.getString("System.FileType.AllFiles");

                dialog.setFilterExtensions(extensions);

                if (dialog.open() != null) {
                    m_coreConfigText.setText(
                            dialog.getFilterPath() + System.getProperty("file.separator") + dialog.getFileName());
                }

            }
        });

        m_coreConfigText = new TextVar(transMeta, wConfigComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
        props.setLook(m_coreConfigText);
        m_coreConfigText.addModifyListener(lsMod);

        // set the tool tip to the contents with any env variables expanded
        m_coreConfigText.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                m_coreConfigText.setToolTipText(transMeta.environmentSubstitute(m_coreConfigText.getText()));
            }
        });
        fd = new FormData();
        fd.left = new FormAttachment(middle, 0);
        fd.top = new FormAttachment(namedClusterWidget, margin);
        fd.right = new FormAttachment(m_coreConfigBut, -margin);
        m_coreConfigText.setLayoutData(fd);

        // default config line
        Label defaultConfigLab = new Label(wConfigComp, SWT.RIGHT);
        defaultConfigLab.setText(Messages.getString("HBaseInputDialog.DefaultConfig.Label"));
        defaultConfigLab.setToolTipText(Messages.getString("HBaseInputDialog.DefaultConfig.TipText"));
        props.setLook(defaultConfigLab);
        fd = new FormData();
        fd.left = new FormAttachment(0, 0);
        fd.top = new FormAttachment(m_coreConfigText, margin);
        fd.right = new FormAttachment(middle, -margin);
        defaultConfigLab.setLayoutData(fd);

        m_defaultConfigBut = new Button(wConfigComp, SWT.PUSH | SWT.CENTER);
        props.setLook(m_defaultConfigBut);
        m_defaultConfigBut.setText(Messages.getString("System.Button.Browse"));
        fd = new FormData();
        fd.right = new FormAttachment(100, 0);
        fd.top = new FormAttachment(m_coreConfigText, 0);
        m_defaultConfigBut.setLayoutData(fd);

        m_defaultConfigBut.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                FileDialog dialog = new FileDialog(shell, SWT.OPEN);
                String[] extensions = null;
                String[] filterNames = null;

                extensions = new String[2];
                filterNames = new String[2];
                extensions[0] = "*.xml";
                filterNames[0] = Messages.getString("HBaseInputDialog.FileType.XML");
                extensions[1] = "*";
                filterNames[1] = Messages.getString("System.FileType.AllFiles");

                dialog.setFilterExtensions(extensions);

                if (dialog.open() != null) {
                    m_defaultConfigText.setText(
                            dialog.getFilterPath() + System.getProperty("file.separator") + dialog.getFileName());
                }

            }
        });

        m_defaultConfigText = new TextVar(transMeta, wConfigComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
        props.setLook(m_defaultConfigText);
        m_defaultConfigText.addModifyListener(lsMod);

        // set the tool tip to the contents with any env variables expanded
        m_defaultConfigText.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                m_defaultConfigText.setToolTipText(transMeta.environmentSubstitute(m_defaultConfigText.getText()));
            }
        });
        fd = new FormData();
        fd.left = new FormAttachment(middle, 0);
        fd.top = new FormAttachment(m_coreConfigText, margin);
        fd.right = new FormAttachment(m_defaultConfigBut, -margin);
        m_defaultConfigText.setLayoutData(fd);

        // table name
        Label tableNameLab = new Label(wConfigComp, SWT.RIGHT);
        tableNameLab.setText(Messages.getString("HBaseInputDialog.TableName.Label"));
        tableNameLab.setToolTipText(Messages.getString("HBaseInputDialog.TableName.TipText"));
        props.setLook(tableNameLab);
        fd = new FormData();
        fd.left = new FormAttachment(0, 0);
        fd.top = new FormAttachment(m_defaultConfigText, margin);
        fd.right = new FormAttachment(middle, -margin);
        tableNameLab.setLayoutData(fd);

        m_mappedTableNamesBut = new Button(wConfigComp, SWT.PUSH | SWT.CENTER);
        props.setLook(m_mappedTableNamesBut);
        m_mappedTableNamesBut.setText(Messages.getString("HBaseInputDialog.TableName.Button"));
        fd = new FormData();
        fd.right = new FormAttachment(100, 0);
        fd.top = new FormAttachment(m_defaultConfigText, 0);
        m_mappedTableNamesBut.setLayoutData(fd);

        m_mappedTableNamesCombo = new CCombo(wConfigComp, SWT.BORDER);
        props.setLook(m_mappedTableNamesCombo);

        m_mappedTableNamesCombo.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                m_currentMeta.setChanged();
                m_mappedTableNamesCombo
                        .setToolTipText(transMeta.environmentSubstitute(m_mappedTableNamesCombo.getText()));
            }
        });

        fd = new FormData();
        fd.left = new FormAttachment(middle, 0);
        fd.top = new FormAttachment(m_defaultConfigText, margin);
        fd.right = new FormAttachment(m_mappedTableNamesBut, -margin);
        m_mappedTableNamesCombo.setLayoutData(fd);

        m_mappedTableNamesBut.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                setupMappedTableNames();
            }
        });

        // mapping name
        Label mappingNameLab = new Label(wConfigComp, SWT.RIGHT);
        mappingNameLab.setText(Messages.getString("HBaseInputDialog.MappingName.Label"));
        mappingNameLab.setToolTipText(Messages.getString("HBaseInputDialog.MappingName.TipText"));
        props.setLook(mappingNameLab);
        fd = new FormData();
        fd.left = new FormAttachment(0, 0);
        fd.top = new FormAttachment(m_mappedTableNamesCombo, margin);
        fd.right = new FormAttachment(middle, -margin);
        mappingNameLab.setLayoutData(fd);

        m_mappingNamesBut = new Button(wConfigComp, SWT.PUSH | SWT.CENTER);
        props.setLook(m_mappingNamesBut);
        m_mappingNamesBut.setText(Messages.getString("HBaseInputDialog.MappingName.Button"));
        fd = new FormData();
        fd.right = new FormAttachment(100, 0);
        fd.top = new FormAttachment(m_mappedTableNamesCombo, 0);
        m_mappingNamesBut.setLayoutData(fd);

        m_mappingNamesBut.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                setupMappingNamesForTable(false);
            }
        });

        m_mappingNamesCombo = new CCombo(wConfigComp, SWT.BORDER);
        props.setLook(m_mappingNamesCombo);

        m_mappingNamesCombo.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                m_currentMeta.setChanged();
                // checkKeyInformation(true);

                m_mappingNamesCombo.setToolTipText(transMeta.environmentSubstitute(m_mappingNamesCombo.getText()));
                m_storeMappingInStepMetaData.setSelection(false);
            }
        });
        fd = new FormData();
        fd.left = new FormAttachment(middle, 0);
        fd.top = new FormAttachment(m_mappedTableNamesCombo, margin);
        fd.right = new FormAttachment(m_mappingNamesBut, -margin);
        m_mappingNamesCombo.setLayoutData(fd);

        // store mapping in meta data
        Label storeMapping = new Label(wConfigComp, SWT.RIGHT);
        storeMapping.setText(BaseMessages.getString(HBaseInputMeta.PKG, "HBaseInputDialog.StoreMapping.Label"));
        storeMapping.setToolTipText(
                BaseMessages.getString(HBaseInputMeta.PKG, "HBaseInputDialog.StoreMapping.TipText"));
        props.setLook(storeMapping);
        fd = new FormData();
        fd.left = new FormAttachment(0, 0);
        fd.top = new FormAttachment(m_mappingNamesCombo, margin);
        fd.right = new FormAttachment(middle, -margin);
        storeMapping.setLayoutData(fd);

        m_storeMappingInStepMetaData = new Button(wConfigComp, SWT.CHECK);
        props.setLook(m_storeMappingInStepMetaData);
        fd = new FormData();
        fd.right = new FormAttachment(100, 0);
        fd.left = new FormAttachment(middle, 0);
        fd.top = new FormAttachment(m_mappingNamesCombo, margin);
        m_storeMappingInStepMetaData.setLayoutData(fd);

        // keystart
        Label keyStartLab = new Label(wConfigComp, SWT.RIGHT);
        keyStartLab.setText(Messages.getString("HBaseInputDialog.KeyStart.Label"));
        keyStartLab.setToolTipText(Messages.getString("HBaseInputDialog.KeyStart.TipText"));
        props.setLook(keyStartLab);
        fd = new FormData();
        fd.left = new FormAttachment(0, 0);
        fd.top = new FormAttachment(m_storeMappingInStepMetaData, margin);
        fd.right = new FormAttachment(middle, -margin);
        keyStartLab.setLayoutData(fd);

        m_keyStartText = new TextVar(transMeta, wConfigComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
        m_keyStartText.setToolTipText(Messages.getString("HBaseInputDialog.KeyStart.TipText"));
        m_keyStartText.addModifyListener(lsMod);
        props.setLook(m_keyStartText);
        fd = new FormData();
        fd.right = new FormAttachment(100, 0);
        fd.left = new FormAttachment(middle, 0);
        fd.top = new FormAttachment(m_storeMappingInStepMetaData, margin);
        m_keyStartText.setLayoutData(fd);

        // keystop
        Label keyStopLab = new Label(wConfigComp, SWT.RIGHT);
        keyStopLab.setText(Messages.getString("HBaseInputDialog.KeyStop.Label"));
        keyStopLab.setToolTipText(Messages.getString("HBaseInputDialog.KeyStop.TipText"));
        props.setLook(keyStopLab);
        fd = new FormData();
        fd.left = new FormAttachment(0, 0);
        fd.top = new FormAttachment(m_keyStartText, margin);
        fd.right = new FormAttachment(middle, -margin);
        keyStopLab.setLayoutData(fd);

        m_keyStopText = new TextVar(transMeta, wConfigComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
        m_keyStopText.setToolTipText(Messages.getString("HBaseInputDialog.KeyStop.TipText"));
        m_keyStopText.addModifyListener(lsMod);
        props.setLook(m_keyStopText);
        fd = new FormData();
        fd.right = new FormAttachment(100, 0);
        fd.left = new FormAttachment(middle, 0);
        fd.top = new FormAttachment(m_keyStartText, margin);
        m_keyStopText.setLayoutData(fd);

        // Scanner caching
        Label scannerCacheLab = new Label(wConfigComp, SWT.RIGHT);
        scannerCacheLab.setText(Messages.getString("HBaseInputDialog.ScannerCache.Label"));
        scannerCacheLab.setToolTipText(Messages.getString("HBaseInputDialog.ScannerCache.TipText"));
        props.setLook(scannerCacheLab);
        fd = new FormData();
        fd.left = new FormAttachment(0, 0);
        fd.top = new FormAttachment(m_keyStopText, margin);
        fd.right = new FormAttachment(middle, -margin);
        scannerCacheLab.setLayoutData(fd);

        m_scanCacheText = new TextVar(transMeta, wConfigComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
        m_scanCacheText.setToolTipText(Messages.getString("HBaseInputDialog.ScannerCache.TipText"));
        props.setLook(m_scanCacheText);
        fd = new FormData();
        fd.right = new FormAttachment(100, 0);
        fd.left = new FormAttachment(middle, 0);
        fd.top = new FormAttachment(m_keyStopText, margin);
        m_scanCacheText.setLayoutData(fd);

        m_getKeyInfoBut = new Button(wConfigComp, SWT.PUSH);
        m_getKeyInfoBut.setText("Get Key/Fields Info");
        props.setLook(m_getKeyInfoBut);
        fd = new FormData();
        fd.right = new FormAttachment(100, 0);
        fd.bottom = new FormAttachment(100, -margin * 2);
        m_getKeyInfoBut.setLayoutData(fd);
        m_getKeyInfoBut.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                checkKeyInformation(false, true);
            }
        });

        Group keyGroup = new Group(wConfigComp, SWT.SHADOW_ETCHED_IN);
        FormLayout keyLayout = new FormLayout();
        keyGroup.setLayout(keyLayout);
        props.setLook(keyGroup);

        m_keyInfo = new Label(keyGroup, SWT.RIGHT);
        m_keyInfo.setText("-- Key details --");
        props.setLook(m_keyInfo);
        fd = new FormData();
        fd.top = new FormAttachment(0, margin);
        fd.left = new FormAttachment(0, 0);
        fd.right = new FormAttachment(100, -margin);
        m_keyInfo.setLayoutData(fd);

        fd = new FormData();
        fd.right = new FormAttachment(m_getKeyInfoBut, -margin);
        fd.left = new FormAttachment(middle, 0);
        fd.bottom = new FormAttachment(100, -margin * 2);
        keyGroup.setLayoutData(fd);

        // fields stuff
        ColumnInfo[] colinf = new ColumnInfo[] {
                new ColumnInfo(Messages.getString("HBaseInputDialog.Fields.FIELD_ALIAS"),
                        ColumnInfo.COLUMN_TYPE_TEXT, false),
                new ColumnInfo(Messages.getString("HBaseInputDialog.Fields.FIELD_KEY"), ColumnInfo.COLUMN_TYPE_TEXT,
                        false),
                new ColumnInfo(Messages.getString("HBaseInputDialog.Fields.FIELD_FAMILY"),
                        ColumnInfo.COLUMN_TYPE_TEXT, false),
                new ColumnInfo(Messages.getString("HBaseInputDialog.Fields.FIELD_NAME"),
                        ColumnInfo.COLUMN_TYPE_TEXT, false),
                new ColumnInfo(Messages.getString("HBaseInputDialog.Fields.FIELD_TYPE"),
                        ColumnInfo.COLUMN_TYPE_TEXT, false),
                new ColumnInfo(Messages.getString("HBaseInputDialog.Fields.FIELD_FORMAT"),
                        ColumnInfo.COLUMN_TYPE_FORMAT, 3),
                new ColumnInfo(Messages.getString("HBaseInputDialog.Fields.FIELD_INDEXED"),
                        ColumnInfo.COLUMN_TYPE_TEXT, false), };

        colinf[0].setReadOnly(true);
        colinf[1].setReadOnly(true);
        colinf[2].setReadOnly(true);
        colinf[3].setReadOnly(true);
        colinf[4].setReadOnly(true);
        colinf[5].setReadOnly(true);

        colinf[5].setComboValuesSelectionListener(new ComboValuesSelectionListener() {

            public String[] getComboValues(TableItem tableItem, int rowNr, int colNr) {
                String[] comboValues = new String[] {};
                int type = ValueMeta.getType(tableItem.getText(colNr - 1));
                switch (type) {
                case ValueMetaInterface.TYPE_DATE:
                    comboValues = Const.getDateFormats();
                    break;
                case ValueMetaInterface.TYPE_INTEGER:
                case ValueMetaInterface.TYPE_BIGNUMBER:
                case ValueMetaInterface.TYPE_NUMBER:
                    comboValues = Const.getNumberFormats();
                    break;
                default:
                    break;
                }
                return comboValues;
            }
        });

        m_fieldsView = new TableView(transMeta, wConfigComp, SWT.FULL_SELECTION | SWT.MULTI, colinf, 1, lsMod,
                props);

        fd = new FormData();
        fd.top = new FormAttachment(m_scanCacheText, margin * 2);
        fd.bottom = new FormAttachment(m_getKeyInfoBut, -margin * 2);
        fd.left = new FormAttachment(0, 0);
        fd.right = new FormAttachment(100, 0);
        m_fieldsView.setLayoutData(fd);

        fd = new FormData();
        fd.left = new FormAttachment(0, 0);
        fd.top = new FormAttachment(0, 0);
        fd.right = new FormAttachment(100, 0);
        fd.bottom = new FormAttachment(100, 0);
        wConfigComp.setLayoutData(fd);

        wConfigComp.layout();
        m_wConfigTab.setControl(wConfigComp);

        // --- mapping editor tab
        m_editorTab = new CTabItem(m_wTabFolder, SWT.NONE);
        m_editorTab.setText(Messages.getString("HBaseInputDialog.MappingEditorTab.TabTitle"));

        m_mappingEditor = new MappingEditor(shell, m_wTabFolder, this, null, SWT.FULL_SELECTION | SWT.MULTI, false,
                props, transMeta);

        fd = new FormData();
        fd.top = new FormAttachment(0, 0);
        fd.left = new FormAttachment(0, 0);
        m_mappingEditor.setLayoutData(fd);

        fd = new FormData();
        fd.left = new FormAttachment(0, 0);
        fd.top = new FormAttachment(0, 0);
        fd.bottom = new FormAttachment(100, -margin * 2);
        fd.right = new FormAttachment(100, 0);
        m_mappingEditor.setLayoutData(fd);

        m_mappingEditor.layout();
        m_editorTab.setControl(m_mappingEditor);

        // ----- Start of the filter tab --------
        m_wFilterTab = new CTabItem(m_wTabFolder, SWT.NONE);
        m_wFilterTab.setText(Messages.getString("HBaseInputDialog.FilterTab.TabTitle"));

        Composite wFilterComp = new Composite(m_wTabFolder, SWT.NONE);
        props.setLook(wFilterComp);

        FormLayout filterLayout = new FormLayout();
        filterLayout.marginWidth = 3;
        filterLayout.marginHeight = 3;
        wFilterComp.setLayout(filterLayout);

        m_matchAllBut = new Button(wFilterComp, SWT.RADIO);
        m_matchAllBut.setText(Messages.getString("HBaseInputDialog.Filters.RADIO_ALL"));
        props.setLook(m_matchAllBut);
        fd = new FormData();
        fd.top = new FormAttachment(0, 0);
        fd.left = new FormAttachment(0, 0);
        m_matchAllBut.setLayoutData(fd);
        m_matchAllBut.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                m_currentMeta.setChanged();
            }
        });

        m_matchAnyBut = new Button(wFilterComp, SWT.RADIO);
        m_matchAnyBut.setText(Messages.getString("HBaseInputDialog.Filters.RADIO_ANY"));
        props.setLook(m_matchAnyBut);
        fd = new FormData();
        fd.top = new FormAttachment(0, 0);
        fd.left = new FormAttachment(m_matchAllBut, 0);
        fd.right = new FormAttachment(100, -margin);
        m_matchAnyBut.setLayoutData(fd);
        m_matchAnyBut.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                m_currentMeta.setChanged();
            }
        });

        m_matchAllBut.setSelection(true);

        final ColumnInfo[] colinf2 = new ColumnInfo[] {
                new ColumnInfo(Messages.getString("HBaseInputDialog.Filters.FIELD_ALIAS") + "     ",
                        ColumnInfo.COLUMN_TYPE_CCOMBO, false),
                new ColumnInfo(Messages.getString("HBaseInputDialog.Filters.FIELD_TYPE"),
                        ColumnInfo.COLUMN_TYPE_TEXT, false),
                new ColumnInfo(Messages.getString("HBaseInputDialog.Filters.FIELD_OPERATOR"),
                        ColumnInfo.COLUMN_TYPE_CCOMBO, false),
                new ColumnInfo(Messages.getString("HBaseInputDialog.Filters.FIELD_COMPARISON"),
                        ColumnInfo.COLUMN_TYPE_TEXT, false),
                new ColumnInfo(Messages.getString("HBaseInputDialog.Filters.FIELD_FORMAT"),
                        ColumnInfo.COLUMN_TYPE_CCOMBO, false),
                new ColumnInfo(Messages.getString("HBaseInputDialog.Filters.FIELD_SIGNED"),
                        ColumnInfo.COLUMN_TYPE_CCOMBO, false), };

        colinf2[0].setReadOnly(false);
        colinf2[1].setReadOnly(false);
        colinf2[2].setReadOnly(true);
        colinf2[3].setReadOnly(false);
        colinf2[4].setReadOnly(false);
        colinf2[5].setReadOnly(true);

        m_filterAliasCI = colinf2[0];
        m_filterAliasCI.setComboValues(new String[] { "" });
        colinf2[2].setComboValues(ColumnFilter.getAllOperators());
        colinf2[5].setComboValues(new String[] { "Y", "N" });

        colinf2[2].setComboValuesSelectionListener(new ComboValuesSelectionListener() {

            public String[] getComboValues(TableItem tableItem, int rowNr, int colNr) {
                String[] comboValues = colinf2[2].getComboValues();

                // try to fill in the type
                String alias = tableItem.getText(1);
                HBaseValueMeta vm = null;
                if (!Const.isEmpty(alias)) {
                    vm = setFilterTableTypeColumn(tableItem);
                }

                if (vm != null) {
                    if (vm.isNumeric() || vm.isDate() || vm.isBoolean()) {
                        comboValues = ColumnFilter.getNumericOperators();
                    } else if (vm.isString()) {
                        comboValues = ColumnFilter.getStringOperators();
                    } else {
                        comboValues = new String[1];
                        comboValues[0] = "";
                    }
                } else {
                    // if we've not got a connection, or there is no user-specified
                    // columns saved in the meta class, then just get all the
                    // operators
                    comboValues = ColumnFilter.getAllOperators();
                }

                return comboValues;
            }
        });

        colinf2[4].setComboValuesSelectionListener(new ComboValuesSelectionListener() {
            public String[] getComboValues(TableItem tableItem, int rowNr, int colNr) {
                String[] comboValues = new String[] {};

                // try to fill in the type
                String alias = tableItem.getText(1);
                if (!Const.isEmpty(alias)) {
                    setFilterTableTypeColumn(tableItem);
                }
                int type = ValueMeta.getType(tableItem.getText(2));
                switch (type) {
                case ValueMetaInterface.TYPE_DATE:
                    comboValues = Const.getDateFormats();
                    break;
                case ValueMetaInterface.TYPE_INTEGER:
                case ValueMetaInterface.TYPE_BIGNUMBER:
                case ValueMetaInterface.TYPE_NUMBER:
                    comboValues = Const.getNumberFormats();
                    break;
                default:
                    break;
                // if there is not type information available (no connection and no
                // user-specified
                // columns in the meta class) then the user will just have to type
                // in their own
                // formatting string (if necessary)
                }
                return comboValues;
            }
        });

        m_filtersView = new TableView(transMeta, wFilterComp, SWT.FULL_SELECTION | SWT.MULTI, colinf2, 1, lsMod,
                props);

        fd = new FormData();
        fd.top = new FormAttachment(m_matchAllBut, margin * 2);
        fd.bottom = new FormAttachment(100, -margin * 2);
        fd.left = new FormAttachment(0, 0);
        fd.right = new FormAttachment(100, 0);
        m_filtersView.setLayoutData(fd);

        fd = new FormData();
        fd.left = new FormAttachment(0, 0);
        fd.top = new FormAttachment(0, 0);
        fd.right = new FormAttachment(100, 0);
        fd.bottom = new FormAttachment(100, 0);
        wFilterComp.setLayoutData(fd);

        wFilterComp.layout();
        m_wFilterTab.setControl(wFilterComp);

        fd = new FormData();
        fd.left = new FormAttachment(0, 0);
        fd.top = new FormAttachment(m_stepnameText, margin);
        fd.right = new FormAttachment(100, 0);
        fd.bottom = new FormAttachment(100, -50);
        m_wTabFolder.setLayoutData(fd);

        // Buttons inherited from BaseStepDialog
        wOK = new Button(shell, SWT.PUSH);
        wOK.setText(Messages.getString("System.Button.OK"));

        wCancel = new Button(shell, SWT.PUSH);
        wCancel.setText(Messages.getString("System.Button.Cancel"));

        setButtonPositions(new Button[] { wOK, wCancel }, margin, m_wTabFolder);

        // Add listeners
        lsCancel = new Listener() {
            public void handleEvent(Event e) {
                cancel();
            }
        };

        lsOK = new Listener() {
            public void handleEvent(Event e) {
                ok();
            }
        };

        wCancel.addListener(SWT.Selection, lsCancel);
        wOK.addListener(SWT.Selection, lsOK);

        lsDef = new SelectionAdapter() {
            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
                ok();
            }
        };

        m_stepnameText.addSelectionListener(lsDef);

        // Detect X or ALT-F4 or something that kills this window...
        shell.addShellListener(new ShellAdapter() {
            @Override
            public void shellClosed(ShellEvent e) {
                cancel();
            }
        });

        m_wTabFolder.setSelection(0);
        setSize();

        getData();

        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }

        return stepname;
    }

    protected HBaseValueMeta setFilterTableTypeColumn(TableItem tableItem) {
        // try to fill in the type
        String alias = tableItem.getText(1).trim();
        if (!Const.isEmpty(alias)) {
            // try using the mapping information first since it is complete
            if (m_mappedColumns != null) {
                HBaseValueMeta vm = m_mappedColumns.get(transMeta.environmentSubstitute(alias));
                if (vm != null) {
                    String type = ValueMeta.getTypeDesc(vm.getType());
                    if (vm.getType() == ValueMetaInterface.TYPE_INTEGER) {
                        if (vm.getIsLongOrDouble()) {
                            type = "Long";
                        } else {
                            type = "Integer";
                        }
                    }
                    if (vm.getType() == ValueMetaInterface.TYPE_NUMBER) {
                        if (vm.getIsLongOrDouble()) {
                            type = "Double";
                        } else {
                            type = "Float";
                        }
                    }

                    tableItem.setText(2, type);
                    return vm;
                }
            } else if (m_currentMeta.getOutputFields() != null && m_currentMeta.getOutputFields().size() > 0) {

                // use the user-selected fields information
                for (HBaseValueMeta vm : m_currentMeta.getOutputFields()) {
                    String aliasF = vm.getAlias();
                    if (alias.equals(aliasF)) {
                        String type = ValueMeta.getTypeDesc(vm.getType());
                        tableItem.setText(2, type);
                        return vm;
                    }
                }
            }
        }

        return null;
    }

    protected void updateMetaConnectionDetails(HBaseInputMeta meta) {

        NamedCluster nc = namedClusterWidget.getSelectedNamedCluster();
        if (nc != null) {
            meta.setClusterName(nc.getName());
            meta.setZookeeperHosts(nc.getZooKeeperHost());
            meta.setZookeeperPort(nc.getZooKeeperPort());
        }

        meta.setCoreConfigURL(m_coreConfigText.getText());
        meta.setDefaulConfigURL(m_defaultConfigText.getText());
        meta.setSourceTableName(m_mappedTableNamesCombo.getText());
        meta.setSourceMappingName(m_mappingNamesCombo.getText());
    }

    protected void ok() {
        if (Const.isEmpty(m_stepnameText.getText())) {
            MessageBox mb = new MessageBox(shell, SWT.OK | SWT.ICON_ERROR);
            mb.setText(Messages.getString("System.StepJobEntryNameMissing.Title"));
            mb.setMessage(Messages.getString("System.JobEntryNameMissing.Msg"));
            mb.open();
            return;
        }
        if (namedClusterWidget.getSelectedNamedCluster() == null) {
            MessageBox mb = new MessageBox(shell, SWT.OK | SWT.ICON_ERROR);
            mb.setText(Messages.getString("Dialog.Error"));
            mb.setMessage(Messages.getString("HBaseInputDialog.NamedClusterNotSelected.Msg"));
            mb.open();
            return;
        } else {
            NamedCluster nc = namedClusterWidget.getSelectedNamedCluster();
            if (StringUtils.isEmpty(nc.getZooKeeperHost())) {
                MessageBox mb = new MessageBox(shell, SWT.OK | SWT.ICON_ERROR);
                mb.setText(Messages.getString("Dialog.Error"));
                mb.setMessage(Messages.getString("HBaseInputDialog.NamedClusterMissingValues.Msg"));
                mb.open();
                return;
            }
        }

        stepname = m_stepnameText.getText();

        updateMetaConnectionDetails(m_currentMeta);

        m_currentMeta.setKeyStartValue(m_keyStartText.getText());
        m_currentMeta.setKeyStopValue(m_keyStopText.getText());
        m_currentMeta.setScannerCacheSize(m_scanCacheText.getText());
        m_currentMeta.setMatchAnyFilter(m_matchAnyBut.getSelection());

        int numNonEmpty = m_fieldsView.nrNonEmpty();
        if (numNonEmpty > 0) {
            List<HBaseValueMeta> outputFields = new ArrayList<HBaseValueMeta>();

            for (int i = 0; i < numNonEmpty; i++) {
                TableItem item = m_fieldsView.getNonEmpty(i);
                String alias = item.getText(1).trim();
                String isKey = item.getText(2).trim();
                String family = item.getText(3).trim();
                String column = item.getText(4).trim();
                String type = item.getText(5).trim();
                String format = item.getText(6).trim();

                HBaseValueMeta vm = new HBaseValueMeta(
                        family + HBaseValueMeta.SEPARATOR + column + HBaseValueMeta.SEPARATOR + alias,
                        ValueMeta.getType(type), -1, -1);

                vm.setTableName(m_mappedTableNamesCombo.getText());
                vm.setMappingName(m_mappingNamesCombo.getText());
                vm.setKey(isKey.equalsIgnoreCase("Y"));
                String indexItems = m_indexedLookup.get(alias);
                if (indexItems != null) {
                    Object[] values = HBaseValueMeta.stringIndexListToObjects(indexItems);
                    vm.setIndex(values);
                    vm.setStorageType(ValueMetaInterface.STORAGE_TYPE_INDEXED);
                }
                vm.setConversionMask(format);

                outputFields.add(vm);
            }
            m_currentMeta.setOutputFields(outputFields);
        } else {
            m_currentMeta.setOutputFields(null); // output everything
        }

        numNonEmpty = m_filtersView.nrNonEmpty();
        if (numNonEmpty > 0) {
            List<ColumnFilter> filters = new ArrayList<ColumnFilter>();

            for (int i = 0; i < m_filtersView.nrNonEmpty(); i++) {
                TableItem item = m_filtersView.getNonEmpty(i);
                String alias = item.getText(1).trim();
                String type = item.getText(2).trim();
                String operator = item.getText(3).trim();
                String comparison = item.getText(4).trim();
                String signed = item.getText(6).trim();
                String format = item.getText(5).trim();
                ColumnFilter f = new ColumnFilter(alias);
                f.setFieldType(type);
                f.setComparisonOperator(ColumnFilter.stringToOpp(operator));
                f.setConstant(comparison);
                f.setSignedComparison(signed.equalsIgnoreCase("Y"));
                f.setFormat(format);
                filters.add(f);
            }

            m_currentMeta.setColumnFilters(filters);
        } else {
            m_currentMeta.setColumnFilters(null);
        }

        if (m_storeMappingInStepMetaData.getSelection()) {
            if (Const.isEmpty(m_mappingNamesCombo.getText())) {
                List<String> problems = new ArrayList<String>();

                Mapping toSet = m_mappingEditor.getMapping(false, problems);
                if (problems.size() > 0) {
                    StringBuffer p = new StringBuffer();
                    for (String s : problems) {
                        p.append(s).append("\n");
                    }
                    MessageDialog md = new MessageDialog(shell,
                            BaseMessages
                                    .getString(
                                            HBaseInputMeta.PKG, "HBaseInputDialog.Error.IssuesWithMapping.Title"),
                            null,
                            BaseMessages.getString(HBaseInputMeta.PKG,
                                    "HBaseInputDialog.Error.IssuesWithMapping") + ":\n\n" + p.toString(),
                            MessageDialog.WARNING,
                            new String[] {
                                    BaseMessages.getString(HBaseInputMeta.PKG,
                                            "HBaseInputDialog.Error.IssuesWithMapping.ButtonOK"),
                                    BaseMessages.getString(HBaseInputMeta.PKG,
                                            "HBaseInputDialog.Error.IssuesWithMapping.ButtonCancel") },
                            0);
                    MessageDialog.setDefaultImage(GUIResource.getInstance().getImageSpoon());
                    int idx = md.open() & 0xFF;
                    if (idx == 1 || idx == 255 /* 255 = escape pressed */ ) {
                        return; // Cancel
                    }
                }
                m_currentMeta.setMapping(toSet);
            } else {
                MappingAdmin admin = new MappingAdmin();
                try {
                    HBaseConnection connection = getHBaseConnection();
                    admin.setConnection(connection);
                    Mapping current = null;

                    current = admin.getMapping(transMeta.environmentSubstitute(m_mappedTableNamesCombo.getText()),
                            transMeta.environmentSubstitute(m_mappingNamesCombo.getText()));

                    m_currentMeta.setMapping(current);
                    m_currentMeta.setSourceMappingName("");
                } catch (Exception e) {
                    logError(Messages.getString("HBaseInputDialog.ErrorMessage.UnableToGetMapping") + " \""
                            + transMeta.environmentSubstitute(m_mappedTableNamesCombo.getText() + ","
                                    + transMeta.environmentSubstitute(m_mappingNamesCombo.getText()) + "\""),
                            e);
                    new ErrorDialog(shell, Messages.getString("HBaseInputDialog.ErrorMessage.UnableToGetMapping"),
                            Messages.getString("HBaseInputDialog.ErrorMessage.UnableToGetMapping") + " \""
                                    + transMeta.environmentSubstitute(m_mappedTableNamesCombo.getText() + ","
                                            + transMeta.environmentSubstitute(m_mappingNamesCombo.getText())
                                            + "\""),
                            e);
                }
            }
        } else {
            // we're going to use a mapping stored in HBase - null out any stored
            // mapping
            m_currentMeta.setMapping(null);
        }

        if (!m_originalMeta.equals(m_currentMeta)) {
            m_currentMeta.setChanged();
            changed = m_currentMeta.hasChanged();
        }

        dispose();
    }

    protected void cancel() {
        stepname = null;
        m_currentMeta.setChanged(changed);

        dispose();
    }

    private void getData() {

        namedClusterWidget.setSelectedNamedCluster(m_currentMeta.getClusterName());

        if (!Const.isEmpty(m_currentMeta.getCoreConfigURL())) {
            m_coreConfigText.setText(m_currentMeta.getCoreConfigURL());
        }

        if (!Const.isEmpty(m_currentMeta.getDefaultConfigURL())) {
            m_defaultConfigText.setText(m_currentMeta.getDefaultConfigURL());
        }

        if (!Const.isEmpty(m_currentMeta.getSourceTableName())) {
            m_mappedTableNamesCombo.setText(m_currentMeta.getSourceTableName());
        }

        if (!Const.isEmpty(m_currentMeta.getSourceMappingName())) {
            m_mappingNamesCombo.setText(m_currentMeta.getSourceMappingName());
        }

        if (!Const.isEmpty(m_currentMeta.getKeyStartValue())) {
            m_keyStartText.setText(m_currentMeta.getKeyStartValue());
        }

        if (!Const.isEmpty(m_currentMeta.getKeyStopValue())) {
            m_keyStopText.setText(m_currentMeta.getKeyStopValue());
        }

        if (!Const.isEmpty(m_currentMeta.getScannerCacheSize())) {
            m_scanCacheText.setText(m_currentMeta.getScannerCacheSize());
        }

        m_matchAnyBut.setSelection(m_currentMeta.getMatchAnyFilter());
        m_matchAllBut.setSelection(!m_currentMeta.getMatchAnyFilter());

        // filters
        if (m_currentMeta.getColumnFilters() != null && m_currentMeta.getColumnFilters().size() > 0) {
            for (ColumnFilter f : m_currentMeta.getColumnFilters()) {
                TableItem item = new TableItem(m_filtersView.table, SWT.NONE);

                if (!Const.isEmpty(f.getFieldAlias())) {
                    item.setText(1, f.getFieldAlias());
                }
                if (!Const.isEmpty(f.getFieldType())) {
                    item.setText(2, f.getFieldType());
                }
                if (f.getComparisonOperator() != null) {
                    item.setText(3, f.getComparisonOperator().toString());
                }
                if (!Const.isEmpty(f.getConstant())) {
                    item.setText(4, f.getConstant());
                }
                item.setText(6, (f.getSignedComparison()) ? "Y" : "N");
                if (!Const.isEmpty(f.getFormat())) {
                    item.setText(5, f.getFormat());
                }
            }

            m_filtersView.removeEmptyRows();
            m_filtersView.setRowNums();
            m_filtersView.optWidth(true);
        }

        if (Const.isEmpty(m_currentMeta.getSourceMappingName()) && m_currentMeta.getMapping() != null) {
            m_mappingEditor.setMapping(m_currentMeta.getMapping());
            m_storeMappingInStepMetaData.setSelection(true);
        }

        // do the key and columns
        checkKeyInformation(true, false);
    }

    public HBaseConnection getHBaseConnection() throws Exception {
        HBaseConnection conf = null;

        String coreConf = "";
        String defaultConf = "";
        String zookeeperHosts = "";
        String zookeeperPort = "";

        NamedCluster nc = namedClusterWidget.getSelectedNamedCluster();
        if (nc != null) {
            zookeeperHosts = transMeta.environmentSubstitute(nc.getZooKeeperHost());
            zookeeperPort = transMeta.environmentSubstitute(nc.getZooKeeperPort());
        }

        if (!Const.isEmpty(m_coreConfigText.getText())) {
            coreConf = transMeta.environmentSubstitute(m_coreConfigText.getText());
        }

        if (!Const.isEmpty(m_defaultConfigText.getText())) {
            defaultConf = transMeta.environmentSubstitute(m_defaultConfigText.getText());
        }

        if (Const.isEmpty(zookeeperHosts) && Const.isEmpty(coreConf) && Const.isEmpty(defaultConf)) {
            throw new Exception(BaseMessages.getString(HBaseInputMeta.PKG,
                    "MappingDialog.Error.Message.CantConnectNoConnectionDetailsProvided"));
        }

        conf = HBaseInputData.getHBaseConnection(zookeeperHosts, zookeeperPort, coreConf, defaultConf, null);

        return conf;
    }

    private void checkKeyInformation(boolean quiet, boolean readFieldsFromMapping) {

        String zookeeperQuorumText = null;

        NamedCluster nc = namedClusterWidget.getSelectedNamedCluster();
        if (nc != null) {
            zookeeperQuorumText = nc.getZooKeeperHost();
        }

        boolean displayFieldsEmbeddedMapping = ((m_mappingEditor.getMapping(false, null) != null
                && Const.isEmpty(m_mappingNamesCombo.getText())));
        boolean displayFieldsMappingFromHBase = (!Const.isEmpty(m_coreConfigText.getText())
                || !Const.isEmpty(zookeeperQuorumText)) && !Const.isEmpty(m_mappedTableNamesCombo.getText())
                && !Const.isEmpty(m_mappingNamesCombo.getText());

        if (displayFieldsEmbeddedMapping || displayFieldsMappingFromHBase) {
            try {
                m_indexedLookup = new HashMap<String, String>();

                MappingAdmin admin = null;
                if (displayFieldsMappingFromHBase) {
                    admin = new MappingAdmin();
                }

                Mapping current = null;
                Map<String, HBaseValueMeta> mappedColumns = null;
                String keyName = null;
                String keyType = null;
                boolean filterAliasesDone = false;
                try {
                    if (displayFieldsMappingFromHBase && readFieldsFromMapping) {
                        HBaseConnection connection = getHBaseConnection();
                        admin.setConnection(connection);
                        current = admin.getMapping(
                                transMeta.environmentSubstitute(m_mappedTableNamesCombo.getText()),
                                transMeta.environmentSubstitute(m_mappingNamesCombo.getText()));
                    } else {
                        current = m_mappingEditor.getMapping(false, null);
                    }

                    if (current != null) {
                        // Key information
                        keyName = current.getKeyName();
                        keyType = current.getKeyType().toString();
                        m_keyInfo.setText("HBase Key: " + keyName + " (" + keyType + ")");

                        mappedColumns = current.getMappedColumns();
                        m_mappedColumns = mappedColumns; // cached copy

                        // Set up the alias combo box in the filters tab
                        List<String> filterAliasNames = new ArrayList<String>();
                        for (String alias : mappedColumns.keySet()) {
                            HBaseValueMeta column = mappedColumns.get(alias);
                            String aliasS = column.getAlias();
                            if (column.isNumeric() || column.isDate() || column.isString() || column.isBoolean()) {
                                filterAliasNames.add(aliasS);
                            }
                        }
                        String[] filterAliasNamesA = filterAliasNames.toArray(new String[1]);
                        m_filterAliasCI.setComboValues(filterAliasNamesA);
                        filterAliasesDone = true;
                    } else {
                        m_keyInfo.setText("");
                    }
                } catch (Exception ex) {
                    if (!quiet) {
                        logError(Messages.getString("HBaseInputDialog.ErrorMessage.UnableToGetMapping") + " \""
                                + transMeta.environmentSubstitute(m_mappedTableNamesCombo.getText() + ","
                                        + transMeta.environmentSubstitute(m_mappingNamesCombo.getText()) + "\""),
                                ex);
                        new ErrorDialog(shell,
                                Messages.getString("HBaseInputDialog.ErrorMessage.UnableToGetMapping"),
                                Messages.getString("HBaseInputDialog.ErrorMessage.UnableToGetMapping") + " \""
                                        + transMeta.environmentSubstitute(m_mappedTableNamesCombo.getText() + ","
                                                + transMeta.environmentSubstitute(m_mappingNamesCombo.getText())
                                                + "\""),
                                ex);
                    }
                    m_keyInfo.setText(Messages.getString("HBaseInputDialog.ErrorMessage.UnableToGetMapping"));
                }

                // Fields information
                m_fieldsView.clearAll(false);

                if (current != null && readFieldsFromMapping) {
                    TableItem item = new TableItem(m_fieldsView.table, SWT.NONE);
                    item.setText(1, keyName);
                    item.setText(2, "Y");
                    item.setText(7, "N");
                    if (current.getKeyType() == Mapping.KeyType.DATE
                            || current.getKeyType() == Mapping.KeyType.UNSIGNED_DATE) {
                        item.setText(5, ValueMeta.getTypeDesc(ValueMetaInterface.TYPE_DATE));
                    } else if (current.getKeyType() == Mapping.KeyType.STRING) {
                        item.setText(5, ValueMeta.getTypeDesc(ValueMetaInterface.TYPE_STRING));
                    } else if (current.getKeyType() == Mapping.KeyType.INTEGER
                            || current.getKeyType() == Mapping.KeyType.UNSIGNED_INTEGER
                            || current.getKeyType() == Mapping.KeyType.UNSIGNED_LONG
                            || current.getKeyType() == Mapping.KeyType.LONG) {
                        item.setText(5, ValueMeta.getTypeDesc(ValueMetaInterface.TYPE_INTEGER));
                    } else {
                        item.setText(5, ValueMeta.getTypeDesc(ValueMetaInterface.TYPE_BINARY));
                    }

                    // get all the fields from the mapping
                    for (String alias : mappedColumns.keySet()) {
                        HBaseValueMeta column = mappedColumns.get(alias);
                        String aliasS = column.getAlias();
                        String family = column.getColumnFamily();
                        String name = column.getColumnName();
                        String type = column.getTypeDesc();
                        String format = column.getConversionMask();

                        item = new TableItem(m_fieldsView.table, SWT.NONE);
                        if (column.getStorageType() == ValueMetaInterface.STORAGE_TYPE_INDEXED) {
                            String valuesString = HBaseValueMeta.objectIndexValuesToString(column.getIndex());

                            m_indexedLookup.put(aliasS, valuesString);
                            item.setText(7, "Y");
                        } else {
                            item.setText(7, "N");
                        }

                        item.setText(1, aliasS);
                        item.setText(2, "N");
                        item.setText(3, family);
                        item.setText(4, name);
                        item.setText(5, type);
                        if (!Const.isEmpty(format)) {
                            item.setText(6, format);
                        }
                    }
                }

                if (!readFieldsFromMapping && m_currentMeta.getOutputFields() != null
                        && m_currentMeta.getOutputFields().size() > 0) {

                    // user has selected some fields from the mapping to output
                    List<String> filterAliasNames = new ArrayList<String>();
                    for (HBaseValueMeta column : m_currentMeta.getOutputFields()) {
                        TableItem item = new TableItem(m_fieldsView.table, SWT.NONE);

                        String aliasS = column.getAlias();
                        String type = column.getTypeDesc();
                        item.setText(1, aliasS);
                        item.setText(5, type);

                        if (column.isKey()) {
                            item.setText(2, "Y");
                            item.setText(7, "N");

                            if (!Const.isEmpty(column.getConversionMask())) {
                                item.setText(6, column.getConversionMask());
                            }

                            continue; // skip the rest
                        }

                        item.setText(2, "N");

                        if (column.isNumeric() || column.isDate() || column.isString()) {
                            if (!filterAliasesDone) {
                                filterAliasNames.add(aliasS);
                            }
                        }
                        String family = column.getColumnFamily();
                        String name = column.getColumnName();
                        String format = column.getConversionMask();

                        if (column.getStorageType() == ValueMetaInterface.STORAGE_TYPE_INDEXED) {
                            String valuesString = HBaseValueMeta.objectIndexValuesToString(column.getIndex());

                            m_indexedLookup.put(aliasS, valuesString);
                            item.setText(7, "Y");
                        } else {
                            item.setText(7, "N");
                        }

                        item.setText(3, family);
                        item.setText(4, name);

                        if (!Const.isEmpty(format)) {
                            item.setText(6, format);
                        }
                    }

                    // set the allowable combo values for the selectable columns in the
                    // filter tab
                    if (!filterAliasesDone) {
                        String[] filterAliasNamesA = filterAliasNames.toArray(new String[1]);
                        m_filterAliasCI.setComboValues(filterAliasNamesA);
                        filterAliasesDone = true;
                    }
                }

                m_fieldsView.removeEmptyRows();
                m_fieldsView.setRowNums();
                m_fieldsView.optWidth(true);

            } catch (Exception ex) {
                if (!quiet) {
                    logError(Messages.getString("HBaseInputDialog.ErrorMessage.UnableToGetMapping") + " \""
                            + transMeta.environmentSubstitute(m_mappedTableNamesCombo.getText() + ","
                                    + transMeta.environmentSubstitute(m_mappingNamesCombo.getText()) + "\""),
                            ex);
                    new ErrorDialog(shell, Messages.getString("HBaseInputDialog.ErrorMessage.UnableToGetMapping"),
                            Messages.getString("HBaseInputDialog.ErrorMessage.UnableToGetMapping") + " \""
                                    + transMeta.environmentSubstitute(m_mappedTableNamesCombo.getText() + ","
                                            + transMeta.environmentSubstitute(m_mappingNamesCombo.getText())
                                            + "\""),
                            ex);
                }
                m_keyInfo.setText(Messages.getString("HBaseInputDialog.ErrorMessage.UnableToGetMapping"));
            }
        } else {
            m_keyInfo.setText("");
        }
    }

    private void setupMappedTableNames() {
        m_mappedTableNamesCombo.removeAll();

        try {
            MappingAdmin admin = new MappingAdmin();

            HBaseConnection connection = getHBaseConnection();
            admin.setConnection(connection);
            Set<String> tableNames = admin.getMappedTables();

            for (String s : tableNames) {
                m_mappedTableNamesCombo.add(s);
            }
        } catch (Exception e) {
            logError(Messages.getString("HBaseInputDialog.ErrorMessage.UnableToConnect"), e);
            new ErrorDialog(shell, Messages.getString("HBaseInputDialog.ErrorMessage." + "UnableToConnect"),
                    Messages.getString("HBaseInputDialog.ErrorMessage.UnableToConnect"), e);
        }
    }

    private void setupMappingNamesForTable(boolean quiet) {
        m_mappingNamesCombo.removeAll();

        if (!Const.isEmpty(m_mappedTableNamesCombo.getText())) {
            try {
                MappingAdmin admin = new MappingAdmin();
                HBaseConnection connection = getHBaseConnection();
                admin.setConnection(connection);

                List<String> mappingNames = admin.getMappingNames(m_mappedTableNamesCombo.getText().trim());

                for (String n : mappingNames) {
                    m_mappingNamesCombo.add(n);
                }
            } catch (Exception ex) {
                if (!quiet) {
                    logError(Messages.getString("HBaseInputDialog.ErrorMessage.UnableToConnect"), ex);
                    new ErrorDialog(shell, Messages.getString("HBaseInputDialog.ErrorMessage." + "UnableToConnect"),
                            Messages.getString("HBaseInputDialog.ErrorMessage.UnableToConnect"), ex);
                }
            }
        }
    }

    public String getCurrentConfiguration() {
        updateMetaConnectionDetails(m_configurationMeta);
        return m_configurationMeta.getXML();
    }
}