hydrograph.ui.propertywindow.widgets.dialog.hiveInput.HivePartitionKeyValueDialog.java Source code

Java tutorial

Introduction

Here is the source code for hydrograph.ui.propertywindow.widgets.dialog.hiveInput.HivePartitionKeyValueDialog.java

Source

/*******************************************************************************
 * Copyright 2017 Capital One Services, LLC and Bitwise, Inc.
 * 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 hydrograph.ui.propertywindow.widgets.dialog.hiveInput;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.ICellEditorValidator;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TableViewerEditor;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceAdapter;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.slf4j.Logger;

import hydrograph.ui.common.util.Constants;
import hydrograph.ui.common.util.CustomColorRegistry;
import hydrograph.ui.common.util.ImagePathConstant;
import hydrograph.ui.common.util.OSValidator;
import hydrograph.ui.datastructure.property.FilterProperties;
import hydrograph.ui.datastructure.property.InputHivePartitionColumn;
import hydrograph.ui.datastructure.property.InputHivePartitionKeyValues;
import hydrograph.ui.logging.factory.LogFactory;
import hydrograph.ui.propertywindow.messages.Messages;
import hydrograph.ui.propertywindow.propertydialog.PropertyDialogButtonBar;
import hydrograph.ui.propertywindow.widgets.customwidgets.runtimeproperty.PropertyContentProvider;
import hydrograph.ui.propertywindow.widgets.filterproperty.ELTCellModifier;
import hydrograph.ui.propertywindow.widgets.filterproperty.ELTFilterContentProvider;
import hydrograph.ui.propertywindow.widgets.filterproperty.ELTFilterLabelProvider;
import hydrograph.ui.propertywindow.widgets.utility.WidgetUtility;

/**
 * 
 * The class to create Partition key field dialog.
 * 
 * @author Bitwise
 * 
 */

public class HivePartitionKeyValueDialog extends Dialog {
    private static final Logger logger = LogFactory.INSTANCE.getLogger(HivePartitionKeyValueDialog.class);

    private final List<FilterProperties> propertyList;
    private List<String> fieldNameList;
    private List<InputHivePartitionColumn> hivePartitionColumns;
    private String componentName;

    private static final String[] PROPS = { Constants.COMPONENT_NAME };
    private Label lblPropertyError;
    private TableViewer targetTableViewer;
    private TableViewer sourceTableViewer;
    private Table sourceTable;
    private Table targetTable;

    private boolean isAnyUpdatePerformed;

    private TableColumn sourceTableColumn;
    private TableViewerColumn tableViewerColumn;
    private DragSource dragSource;
    private DropTarget dropTarget;
    private List<String> sourceFieldsList;

    PropertyDialogButtonBar propertyDialogButtonBar;
    private boolean closeDialog;
    private boolean okPressed;
    private Button deleteButton;
    private Button upButton;
    private Button downButton;
    private Composite container;
    private Composite PartKeyComposite;
    private Composite partkeyValueComposite;

    private TableViewer keyValueTableViewer;
    private Button btnCheckButton;
    private List<HivePartitionFields> keyValues;
    private Set<String> keyValueColumns;

    public HivePartitionKeyValueDialog(Shell parentShell, PropertyDialogButtonBar propertyDialogButtonBar) {
        super(parentShell);
        setShellStyle(SWT.CLOSE | SWT.RESIZE | SWT.TITLE);

        propertyList = new ArrayList<FilterProperties>();
        fieldNameList = new ArrayList<String>();
        keyValues = new ArrayList<>();
        hivePartitionColumns = new ArrayList<InputHivePartitionColumn>();
        keyValueColumns = new HashSet<>();

        this.propertyDialogButtonBar = propertyDialogButtonBar;

    }

    // Add New Property After Validating old properties
    private void addNewProperty(TableViewer tv, String fieldName) {
        if (isPropertyAlreadyExists(fieldName))
            return;
        isAnyUpdatePerformed = true;
        FilterProperties filter = new FilterProperties();
        if (fieldName == null)
            fieldName = "";
        if (propertyList.size() != 0) {
            if (!validate())
                return;
            filter.setPropertyname(fieldName); //$NON-NLS-1$
            propertyList.add(filter);
            tv.refresh();
            targetTableViewer.editElement(targetTableViewer.getElementAt(propertyList.size() - 1), 0);
        } else {
            filter.setPropertyname(fieldName);//$NON-NLS-1$
            propertyList.add(filter);
            tv.refresh();
            targetTableViewer.editElement(targetTableViewer.getElementAt(0), 0);
        }
    }

    /**
     * 
     * Returns the list of key field names
     * 
     * @return - list of key fields
     */
    public List<String> getFieldNameList() {
        return fieldNameList;
    }

    /**
     * set the list of key fields
     * 
     * @param hivePartitionKeyValues
     */
    public void setRuntimePropertySet(InputHivePartitionKeyValues hivePartitionKeyValues) {
        this.hivePartitionColumns = hivePartitionKeyValues.getKeyValues();
        this.fieldNameList = hivePartitionKeyValues.getKey();

    }

    /**
     * 
     * @return
     */
    public InputHivePartitionKeyValues getRuntimePropertySet() {
        InputHivePartitionKeyValues inputHivePartitionKeyValues = new InputHivePartitionKeyValues();
        inputHivePartitionKeyValues.setKey(this.fieldNameList);
        inputHivePartitionKeyValues.setKeyValues(this.hivePartitionColumns);

        return inputHivePartitionKeyValues;
    }

    /**
     * 
     * returns the name of component
     * 
     * @return - name of component
     */
    public String getComponentName() {
        return componentName;
    }

    /**
     * 
     * Set the name of component
     * 
     * @param componentName
     */
    public void setComponentName(String componentName) {
        this.componentName = componentName;
    }

    // Loads Already Saved Properties..
    private void loadProperties(TableViewer tv) {

        if (fieldNameList != null && !fieldNameList.isEmpty()) {
            for (String key : fieldNameList) {
                FilterProperties filter = new FilterProperties();
                if (validateBeforeLoad(key)) {
                    filter.setPropertyname(key);
                    propertyList.add(filter);

                }
            }

            tv.refresh();
        } else {

            logger.debug("LodProperties :: Empty Map");
        }
    }

    /**
     * 
     */
    private void loadKeyValueProperties(TableViewer keyValueTableViewer) {

        keyValues.clear();
        keyValues = HiveFieldDialogHelper.INSTANCE.getSavedColumnData(hivePartitionColumns,
                new ArrayList<String>(fieldNameList));

        if (keyValues.size() > 0 || hivePartitionColumns.size() > 0) {

            btnCheckButton.setSelection(true);
            partkeyValueComposite.setVisible(true);

        }
    }

    private boolean validateBeforeLoad(String key) {
        if (key.trim().isEmpty()) {
            return false;
        }
        return true;

    }

    /**
     * Create contents of the dialog.
     * 
     * @param parent
     */
    @Override
    protected Control createDialogArea(Composite parent) {

        isAnyUpdatePerformed = false;
        getShell().setText(Constants.PARTITION_KEYS_WINDOW_TITLE);

        container = (Composite) super.createDialogArea(parent);
        container.setLayout(new GridLayout(1, false));

        SashForm outterSashForm = new SashForm(container, SWT.BORDER);
        outterSashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

        PartKeyComposite = new Composite(outterSashForm, SWT.NONE);
        addButtonPanel(PartKeyComposite);
        SashForm srcTgtTableSashForm = new SashForm(PartKeyComposite, SWT.NONE);
        srcTgtTableSashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
        createSourceTable(srcTgtTableSashForm);
        createTargetTable(srcTgtTableSashForm);

        partkeyValueComposite = new Composite(outterSashForm, SWT.NONE);
        createKeyValueComposite(partkeyValueComposite);

        outterSashForm.setWeights(new int[] { 451, 176 });

        checkTargetFieldsSequence();

        getShell().setMinimumSize(400, 500);
        return container;
    }

    /**
     * @param partkeyValueComposite2
     */
    private void createKeyValueComposite(Composite keyValueComposite) {

        keyValueComposite.setLayout(new GridLayout(1, false));

        Composite keyValueButtonPanelcmpst = new Composite(keyValueComposite, SWT.NONE);
        keyValueButtonPanelcmpst.setLayout(new GridLayout(2, false));
        GridData gd_keyValueButtonPanelcmpst = new GridData(SWT.RIGHT, SWT.FILL, true, false, 1, 1);
        gd_keyValueButtonPanelcmpst.widthHint = 324;

        keyValueComposite.setVisible(false);

        keyValueButtonPanelcmpst.setLayoutData(gd_keyValueButtonPanelcmpst);

        final Button keyValAddButton = new Button(keyValueButtonPanelcmpst, SWT.NONE);
        final Button keyValueDelButton = new Button(keyValueButtonPanelcmpst, SWT.NONE);

        keyValAddButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false, 1, 1));
        keyValAddButton.setText("");
        keyValAddButton.setImage(ImagePathConstant.ADD_BUTTON.getImageFromRegistry());
        keyValAddButton.addSelectionListener(addButtonListner(keyValueDelButton));
        keyValAddButton.setToolTipText(Messages.HIVE_PARTI_KEY_VALUE_ADD_TOOLTIP);

        keyValueDelButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
        keyValueDelButton.setText("");
        keyValueDelButton.setImage(ImagePathConstant.DELETE_BUTTON.getImageFromRegistry());
        keyValueDelButton.addSelectionListener(deleteButtonListner(keyValueDelButton));
        keyValueDelButton.setToolTipText(Messages.HIVE_PARTI_KEY_VALUE_DEL_TOOLTIP);

        keyValueTableViewer = new TableViewer(partkeyValueComposite, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);

        Table table = keyValueTableViewer.getTable();
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

        keyValueTableViewer.setCellModifier(new HiveFieldDialogCellModifier(keyValueTableViewer));

        loadKeyValueProperties(keyValueTableViewer);

        if (keyValues.size() == 0) {
            keyValueDelButton.setEnabled(false);
        }

        if (keyValues.size() > 0) {

            keyValueColumns.clear();
            for (int i = 0; i < propertyList.size(); i++) {

                TableViewerColumn tableViewerColumn = new TableViewerColumn(keyValueTableViewer, SWT.NONE);
                TableColumn fieldColumn = tableViewerColumn.getColumn();
                fieldColumn.setWidth(100);
                fieldColumn.setText(propertyList.get(i).getPropertyname());
                keyValueColumns.add(propertyList.get(i).getPropertyname());

            }
        }
        TableViewerEditor.create(keyValueTableViewer, new ColumnViewerEditorActivationStrategy(keyValueTableViewer),
                ColumnViewerEditor.KEYBOARD_ACTIVATION | ColumnViewerEditor.TABBING_HORIZONTAL
                        | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR | ColumnViewerEditor.TABBING_VERTICAL);

        keyValueTableViewer.setColumnProperties(getColumnProperties(propertyList));

        keyValueTableViewer.setContentProvider(new PropertyContentProvider());
        keyValueTableViewer.setLabelProvider(new HiveFieldDialogLableProvider());

        keyValueTableViewer.setInput(keyValues);

        CellEditor[] cellEditors = new CellEditor[propertyList.size()];

        for (int i = 0; i < propertyList.size(); i++) {
            cellEditors[i] = new TextCellEditor(table);
        }

        keyValueTableViewer.setCellEditors(cellEditors);

        keyValueTableViewer.setData(Constants.PARTITION_KEYS, propertyList);

        keyValueTableViewer.getTable().addMouseListener(new MouseListener() {
            @Override
            public void mouseUp(MouseEvent e) {
            }

            @Override
            public void mouseDown(MouseEvent e) {
            }

            @Override
            public void mouseDoubleClick(MouseEvent e) {
                if (validate()) {
                    addNewRow();
                }
                if (keyValues.size() > 0) {
                    keyValueDelButton.setEnabled(true);
                }
            }
        });

        keyValueTableViewer.getTable().addMouseListener(new SingleClickEvent(new Runnable() {
            @Override
            public void run() {
                validate();
            }
        }));
    }

    /**
     * 
     * @param propertyList
     * @return
     */
    private String[] getColumnProperties(List<FilterProperties> propertyList) {
        Object[] tempArray = propertyList.toArray();
        String[] str = new String[propertyList.size()];
        for (int i = 0; i < str.length; i++) {
            str[i] = (String) (((FilterProperties) tempArray[i]).getPropertyname());
        }
        return str;

    }

    /**
     * 
     * @param srcTgtTableSashForm
     */
    private void createSourceTable(SashForm srcTgtTableSashForm) {

        sourceTableViewer = new TableViewer(srcTgtTableSashForm, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
        sourceTableViewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                if (sourceTable.getSelection().length == 1) {
                    addNewProperty(targetTableViewer, sourceTable.getSelection()[0].getText());
                    checkTargetFieldsSequence();
                    refreshKeyValueColums(propertyList, false);
                    enableControlButons();
                }
            }
        });
        sourceTable = sourceTableViewer.getTable();
        sourceTable.setLinesVisible(true);
        sourceTable.setHeaderVisible(true);
        sourceTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));

        tableViewerColumn = new TableViewerColumn(sourceTableViewer, SWT.LEFT);
        sourceTableColumn = tableViewerColumn.getColumn();
        sourceTableColumn.setWidth(300);
        sourceTableColumn.setText(Messages.AVAILABLE_FIELDS_HEADER);
        getSourceFieldsFromPropagatedSchema(sourceTable);
        dragSource = new DragSource(sourceTable, DND.DROP_MOVE);
        dragSource.setTransfer(new Transfer[] { TextTransfer.getInstance() });
        dragSource.addDragListener(new DragSourceAdapter() {
            public void dragSetData(DragSourceEvent event) { // Set the data to
                // be the first
                // selected
                // item's text

                event.data = formatDataToTransfer(sourceTable.getSelection());
            }

        });
    }

    private void createTargetTable(Composite srcTgtTableSashForm) {
        targetTableViewer = new TableViewer(srcTgtTableSashForm, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
        targetTable = targetTableViewer.getTable();
        targetTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1));

        targetTable.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseDoubleClick(MouseEvent e) {
                addNewProperty(targetTableViewer, null);
                checkTargetFieldsSequence();
                refreshKeyValueColums(propertyList, false);
                enableControlButons();
            }

            @Override
            public void mouseDown(MouseEvent e) {
                lblPropertyError.setVisible(false);
            }
        });
        targetTableViewer.getTable().addTraverseListener(new TraverseListener() {

            @Override
            public void keyTraversed(TraverseEvent e) {
                if (e.keyCode == SWT.ARROW_UP) {
                    e.doit = false;
                } else if (e.keyCode == SWT.ARROW_DOWN) {
                    e.doit = false;
                }

            }
        });

        targetTableViewer.getTable().addMouseListener(new SingleClickEvent(new Runnable() {
            @Override
            public void run() {
                validate();
            }
        }));

        targetTable.setBounds(196, 70, 324, 400);
        targetTableViewer.setContentProvider(new ELTFilterContentProvider());
        targetTableViewer.setLabelProvider(new ELTFilterLabelProvider());
        targetTableViewer.setInput(propertyList);

        TableColumn targetTableColumn = new TableColumn(targetTable, SWT.LEFT);
        targetTableColumn.setText("Field Name");
        targetTableColumn.setWidth(300);
        targetTable.setHeaderVisible(true);
        targetTable.setLinesVisible(true);

        // enables the tab functionality
        TableViewerEditor.create(targetTableViewer, new ColumnViewerEditorActivationStrategy(targetTableViewer),
                ColumnViewerEditor.KEYBOARD_ACTIVATION | ColumnViewerEditor.TABBING_HORIZONTAL
                        | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR | ColumnViewerEditor.TABBING_VERTICAL);

        CellEditor propertyNameEditor = new TextCellEditor(targetTable);

        CellEditor[] editors = new CellEditor[] { propertyNameEditor };
        propertyNameEditor.setValidator(createNameEditorValidator(Messages.EmptyFieldNameNotification));

        targetTableViewer.setColumnProperties(PROPS);
        targetTableViewer.setCellModifier(new ELTCellModifier(targetTableViewer));
        targetTableViewer.setCellEditors(editors);

        loadProperties(targetTableViewer);

        if (propertyList.size() != 0) {
            deleteButton.setEnabled(true);
        }
        if (propertyList.size() >= 2) {
            upButton.setEnabled(true);
            downButton.setEnabled(true);
        }

        dropTarget = new DropTarget(targetTable, DND.DROP_MOVE);
        dropTarget.setTransfer(new Transfer[] { TextTransfer.getInstance() });
        dropTarget.addDropListener(new DropTargetAdapter() {
            public void drop(DropTargetEvent event) {
                for (String fieldName : getformatedData((String) event.data))
                    addNewProperty(targetTableViewer, fieldName);
                checkTargetFieldsSequence();
                refreshKeyValueColums(propertyList, false);
                enableControlButons();
            }
        });

    }

    /**
     * 
     * @param propertyList
     * @param isKeyDeleted 
     */
    private void refreshKeyValueColums(List<FilterProperties> propertyList, boolean isKeyDeleted) {

        if (btnCheckButton.getSelection()) {
            List<HivePartitionFields> tempKeyValues = new ArrayList<>(keyValues);
            List<String> tempKeys = new ArrayList<>();

            HiveFieldDialogHelper.INSTANCE.disposeAllColumns(keyValueTableViewer, keyValues);
            for (FilterProperties tempkey : propertyList) {
                tempKeys.add(tempkey.getPropertyname());
            }

            keyValues = HiveFieldDialogHelper.INSTANCE.refreshKeyColumnsAndValues(tempKeys, tempKeyValues,
                    new ArrayList<String>(keyValueColumns), isKeyDeleted);

            createKeyValueTableAndArrangeColumns(btnCheckButton.getSelection(), propertyList);
        }

    }

    /**
     *    
     * @param container
     */
    private void addErrorLabel(Composite container) {

        lblPropertyError = new Label(container, SWT.NONE);
        lblPropertyError.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true, 0, 0));
        lblPropertyError.setForeground(CustomColorRegistry.INSTANCE.getColorFromRegistry(255, 0, 0));
        lblPropertyError.setText(Messages.HIVE_FIELD_DIALOG_ERROR);
        lblPropertyError.setVisible(false);
        lblPropertyError.setData("Error", lblPropertyError);
        keyValueTableViewer.setData("Error", lblPropertyError);
    }

    protected Composite addButtonPanel(Composite KeyComposite) {

        KeyComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

        KeyComposite.setLayout(new GridLayout(1, false));
        Composite partKeyButtonPanel = new Composite(KeyComposite, SWT.NONE);
        partKeyButtonPanel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
        partKeyButtonPanel.setSize(607, 25);
        partKeyButtonPanel.setLayout(new GridLayout(5, false));

        btnCheckButton = new Button(partKeyButtonPanel, SWT.CHECK);
        btnCheckButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1));
        btnCheckButton.setText(Messages.HIVE_PARTI_KEY_CHECKBOX_NAME);

        btnCheckButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {

                if (propertyList.size() > 0) {

                    lblPropertyError.setVisible(false);
                    createKeyValueTableAndArrangeColumns(btnCheckButton.getSelection(), propertyList);

                } else {

                    lblPropertyError.setVisible(true);
                    lblPropertyError.setText(Messages.EMPTY_TARGET_FIELD_ERROR);
                    btnCheckButton.setSelection(false);
                }
            }

        });

        deleteButton = new Button(partKeyButtonPanel, SWT.NONE);
        deleteButton.setToolTipText(Messages.DELETE_SCHEMA_TOOLTIP);
        deleteButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
        deleteButton.setImage(ImagePathConstant.DELETE_BUTTON.getImageFromRegistry());
        deleteButton.setToolTipText(Messages.HIVE_PARTI_KEY_DEL_TOOLTIP);
        attachDeleteButtonListener(deleteButton);

        upButton = new Button(partKeyButtonPanel, SWT.NONE);
        upButton.setToolTipText(Messages.MOVE_SCHEMA_UP_TOOLTIP);
        upButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
        upButton.setImage(ImagePathConstant.MOVEUP_BUTTON.getImageFromRegistry());
        attachUpButtonListener(upButton);

        downButton = new Button(partKeyButtonPanel, SWT.NONE);
        downButton.setToolTipText(Messages.MOVE_SCHEMA_DOWN_TOOLTIP);
        downButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
        downButton.setImage(ImagePathConstant.MOVEDOWN_BUTTON.getImageFromRegistry());
        attachDownButtonListerner(downButton);
        deleteButton.setEnabled(false);
        upButton.setEnabled(false);
        downButton.setEnabled(false);
        new Label(partKeyButtonPanel, SWT.NONE);
        return partKeyButtonPanel;
    }

    /**
     * @param partitionKeyList 
     * @param detail 
     * 
     */
    private void createKeyValueTableAndArrangeColumns(boolean selection, List<FilterProperties> partitionKeyList) {

        container.setBounds(container.getBounds().x, container.getBounds().y, container.getBounds().width,
                container.getBounds().height + 3);

        if (selection) {
            partkeyValueComposite.setVisible(true);
            keyValueColumns.clear();
            for (int i = 0; i < partitionKeyList.size(); i++) {

                TableViewerColumn tableViewerColumn = new TableViewerColumn(keyValueTableViewer, SWT.NONE);
                TableColumn fieldColumn = tableViewerColumn.getColumn();
                fieldColumn.setWidth(100);
                fieldColumn.setText(partitionKeyList.get(i).getPropertyname());
                keyValueColumns.add(partitionKeyList.get(i).getPropertyname());

            }

            keyValueTableViewer.setCellModifier(new HiveFieldDialogCellModifier(keyValueTableViewer));
            keyValueTableViewer.setColumnProperties(getColumnProperties(partitionKeyList));
            keyValueTableViewer.setContentProvider(new PropertyContentProvider());
            keyValueTableViewer.setLabelProvider(new HiveFieldDialogLableProvider());
            keyValueTableViewer.setInput(keyValues);
            CellEditor[] cellEditors = new CellEditor[partitionKeyList.size()];

            for (int i = 0; i < partitionKeyList.size(); i++) {
                cellEditors[i] = new TextCellEditor(keyValueTableViewer.getTable());
            }

            keyValueTableViewer.setCellEditors(cellEditors);

        } else {
            isAnyUpdatePerformed = true;
            partkeyValueComposite.setVisible(false);
            HiveFieldDialogHelper.INSTANCE.disposeAllColumns(keyValueTableViewer, keyValues);
        }

        keyValueTableViewer.refresh();

        container.setBounds(container.getBounds().x, container.getBounds().y, container.getBounds().width,
                container.getBounds().height - 3);

    }

    /**
     * 
     * @param downButton
     */

    private void attachDownButtonListerner(Button downButton) {
        downButton.addMouseListener(new MouseListener() {
            int index1 = 0, index2 = 0;

            @Override
            public void mouseDoubleClick(MouseEvent e) {
                // Nothing to do

            }

            @Override
            public void mouseDown(MouseEvent e) {
                // Nothing to do

            }

            @Override
            public void mouseUp(MouseEvent e) {
                index1 = targetTable.getSelectionIndex();
                index1 = targetTable.getSelectionIndex();

                if (index1 < propertyList.size() - 1) {
                    String data = targetTableViewer.getTable().getItem(index1).getText();
                    index2 = index1 + 1;
                    String data2 = targetTableViewer.getTable().getItem(index2).getText();

                    FilterProperties filter = new FilterProperties();
                    filter.setPropertyname(data2);
                    propertyList.set(index1, filter);

                    filter = new FilterProperties();
                    filter.setPropertyname(data);
                    propertyList.set(index2, filter);
                    targetTableViewer.refresh();
                    targetTable.setSelection(index1 + 1);
                    checkTargetFieldsSequence();
                    swapKeyValueData(index1, index2);
                    refreshKeyValueColums(propertyList, false);
                }
            }
        });

    }

    /**
     * 
     * @param upButton
     */
    private void attachUpButtonListener(Button upButton) {
        upButton.addMouseListener(new MouseListener() {
            int index1 = 0, index2 = 0;

            @Override
            public void mouseDoubleClick(MouseEvent e) {
                // Nothing to do

            }

            @Override
            public void mouseDown(MouseEvent e) {
                // Nothing to do

            }

            @Override
            public void mouseUp(MouseEvent e) {
                index1 = targetTable.getSelectionIndex();

                if (index1 > 0) {
                    index2 = index1 - 1;
                    String data = targetTableViewer.getTable().getItem(index1).getText();
                    String data2 = targetTableViewer.getTable().getItem(index2).getText();

                    FilterProperties filter = new FilterProperties();
                    filter.setPropertyname(data2);
                    propertyList.set(index1, filter);

                    filter = new FilterProperties();
                    filter.setPropertyname(data);
                    propertyList.set(index2, filter);
                    targetTableViewer.refresh();
                    targetTable.setSelection(index1 - 1);
                    checkTargetFieldsSequence();
                    swapKeyValueData(index1, index2);
                    refreshKeyValueColums(propertyList, false);
                }
            }
        });

    }

    /**
     * 
     * @param index1
     * @param index2
     */
    protected void swapKeyValueData(int index1, int index2) {

        for (HivePartitionFields keyValueRowData : keyValues) {

            Collections.swap(((List<String>) keyValueRowData.getRowFields()), index1, index2);
        }

    }

    /**
     * 
     * @param deleteButton
     */
    private void attachDeleteButtonListener(final Button deleteButton) {
        deleteButton.addMouseListener(new MouseListener() {
            @Override
            public void mouseDoubleClick(MouseEvent e) {
            }

            @Override
            public void mouseDown(MouseEvent e) {
            }

            @Override
            public void mouseUp(MouseEvent e) {
                WidgetUtility.setCursorOnDeleteRow(targetTableViewer, propertyList);
                isAnyUpdatePerformed = true;
                targetTableViewer.refresh();
                checkTargetFieldsSequence();
                refreshKeyValueColums(propertyList, true);

                if (propertyList.size() < 1) {
                    deleteButton.setEnabled(false);
                }
                if (propertyList.size() <= 1) {
                    upButton.setEnabled(false);
                    downButton.setEnabled(false);
                }

                if (btnCheckButton.getSelection() && propertyList.size() == 0) {
                    keyValues.clear();
                    keyValueColumns.clear();
                    partkeyValueComposite.setVisible(false);
                    btnCheckButton.setSelection(false);
                    keyValueTableViewer.refresh();
                    container.setBounds(container.getBounds().x, container.getBounds().y,
                            container.getBounds().width, container.getBounds().height - 2);
                }
            }

        });

    }

    /**
     * Create contents of the button bar.
     * 
     * @param parent
     */
    @Override
    protected void createButtonsForButtonBar(Composite parent) {

        parent.setLayout(new GridLayout(1, false));
        parent.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayout(new GridLayout(1, false));
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

        addErrorLabel(composite);

        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
    }

    /**
     * Validate.
     * 
     * @return true, if successful
     */
    protected boolean validate() {

        int propertyCounter = 0;

        for (FilterProperties temp : propertyList) {
            if (!temp.getPropertyname().trim().isEmpty()) {
                // String Regex = "[\\@]{1}[\\{]{1}[\\w]*[\\}]{1}||[\\w]*"; ---
                // TODO PLEASE DO NOT REMOVE THIS COMMENT
                Matcher matchs = Pattern.compile(Constants.REGEX).matcher(temp.getPropertyname().trim());
                if (!matchs.matches()) {
                    targetTable.setSelection(propertyCounter);
                    lblPropertyError.setVisible(true);
                    lblPropertyError.setText(Messages.ALLOWED_CHARACTERS);
                    return false;
                }
            } else {
                targetTable.setSelection(propertyCounter);
                lblPropertyError.setVisible(true);
                lblPropertyError.setText(Messages.EmptyFieldNameNotification);
                return false;
            }
            propertyCounter++;

        }

        if (keyValueColumns.size() != 0) {
            return HiveFieldDialogCellModifier.validatePartitionKeyTable(keyValueTableViewer, lblPropertyError);
        }
        return true;
    }

    /**
     * 
     * @param ErrorMessage
     * @return
     */
    private ICellEditorValidator createNameEditorValidator(final String ErrorMessage) {
        ICellEditorValidator propertyValidator = new ICellEditorValidator() {
            @Override
            public String isValid(Object value) {
                isAnyUpdatePerformed = true;
                String currentSelectedFld = targetTable.getItem(targetTable.getSelectionIndex()).getText();
                String valueToValidate = String.valueOf(value).trim();
                if (valueToValidate.isEmpty()) {
                    lblPropertyError.setText(ErrorMessage);
                    lblPropertyError.setVisible(true);
                    return Constants.ERROR; //$NON-NLS-1$
                } else {
                    lblPropertyError.setVisible(false);
                }

                for (FilterProperties temp : propertyList) {
                    if (!currentSelectedFld.equalsIgnoreCase(valueToValidate)
                            && temp.getPropertyname().trim().equalsIgnoreCase(valueToValidate)) {
                        lblPropertyError.setText(Messages.RuntimePropertAlreadyExists);
                        lblPropertyError.setVisible(true);
                        return Constants.ERROR; //$NON-NLS-1$
                    }

                    lblPropertyError.setVisible(false);
                }

                return null;

            }
        };
        return propertyValidator;
    }

    /**
     * 
     * @param selectedTableItems
     * @return
     */
    private String formatDataToTransfer(TableItem[] selectedTableItems) {
        StringBuffer buffer = new StringBuffer();
        for (TableItem tableItem : selectedTableItems) {
            buffer.append(tableItem.getText() + "#");
        }
        return buffer.toString();
    }

    /**
     * 
     * @param formatedString
     * @return
     */
    private String[] getformatedData(String formatedString) {
        String[] fieldNameArray = null;
        if (formatedString != null) {
            fieldNameArray = formatedString.split("#");
        }
        return fieldNameArray;
    }

    /**
     * 
     * @param valueToValidate
     * @return
     */
    private boolean isPropertyAlreadyExists(String valueToValidate) {
        for (FilterProperties temp : propertyList)
            if (temp.getPropertyname().trim().equalsIgnoreCase(valueToValidate))
                return true;
        return false;
    }

    /**
     * 
     * @param sourceTable
     */
    private void getSourceFieldsFromPropagatedSchema(Table sourceTable) {
        TableItem sourceTableItem = null;
        if (sourceFieldsList != null && !sourceFieldsList.isEmpty())
            for (String filedName : sourceFieldsList) {
                sourceTableItem = new TableItem(sourceTable, SWT.NONE);
                sourceTableItem.setText(filedName);
            }

    }

    /**
     * @param fieldNameList
     */
    public void setSourceFieldsFromPropagatedSchema(List<String> fieldNameList) {
        this.sourceFieldsList = fieldNameList;

    }

    @Override
    protected void okPressed() {

        if (OSValidator.isMac()) {

            List<TableViewer> tableViewers = new ArrayList<TableViewer>();
            tableViewers.add(keyValueTableViewer);
            tableViewers.add(targetTableViewer);
            for (TableViewer tableView : tableViewers) {
                for (CellEditor cellEditor : tableView.getCellEditors()) {
                    if (cellEditor != null) {
                        cellEditor.getControl().setEnabled(false); //Saves the existing value of CellEditor
                        cellEditor.getControl().setEnabled(true);
                    }
                }
            }
        }
        if (validate()) {
            fieldNameList.clear();
            hivePartitionColumns.clear();

            for (FilterProperties temp : propertyList) {
                fieldNameList.add(temp.getPropertyname());
            }

            for (HivePartitionFields hivePartitionFieldDialog : keyValues) {

                hivePartitionColumns.add(HiveFieldDialogHelper.INSTANCE.arrangeColumndata(
                        new ArrayList<>(hivePartitionFieldDialog.getRowFields()),
                        new ArrayList<String>(fieldNameList)));
                isAnyUpdatePerformed = true;
            }

            if (isAnyUpdatePerformed) {
                propertyDialogButtonBar.enableApplyButton(true);
            }

            if (!HiveFieldDialogHelper.INSTANCE.compareAndChangeColor(getTargetTableViewer(), sourceFieldsList)) {
                int rc = HiveFieldDialogHelper.INSTANCE.Message_Dialog();
                if (rc == 0) {
                    okPressed = true;
                    super.okPressed();
                } else if (rc == 1) {
                    return;
                }
            }

            okPressed = true;
            super.okPressed();

        } else {
            return;
        }
    }

    @Override
    protected void cancelPressed() {
        if (isAnyUpdatePerformed) {
            int style = SWT.APPLICATION_MODAL | SWT.OK | SWT.CANCEL | SWT.ICON_INFORMATION;
            MessageBox messageBox = new MessageBox(getShell(), style);
            messageBox.setText(Messages.INFORMATION); //$NON-NLS-1$
            messageBox.setMessage(Messages.MessageBeforeClosingWindow);
            if (messageBox.open() == SWT.OK) {
                closeDialog = super.close();
            }
        } else {
            closeDialog = super.close();
        }

    }

    @Override
    public boolean close() {
        if (!okPressed) {
            cancelPressed();
            return closeDialog;
        } else {
            return super.close();
        }
    }

    private void enableControlButons() {
        if (propertyList.size() >= 1) {
            deleteButton.setEnabled(true);
        }
        if (propertyList.size() >= 2) {
            upButton.setEnabled(true);
            downButton.setEnabled(true);
        }
    }

    protected TableViewer getTargetTableViewer() {
        return targetTableViewer;
    }

    /**
     * 
     * @param keyValueDelButton
     * @return
     */
    private SelectionListener addButtonListner(final Button keyValueDelButton) {
        SelectionListener listener = new SelectionListener() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                if (validate()) {
                    addNewRow();
                }
                if (keyValues.size() > 0) {
                    keyValueDelButton.setEnabled(true);
                }
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
                // TODO Auto-generated method stub

            }

        };
        return listener;
    }

    private void addNewRow() {
        if (!lblPropertyError.getVisible() || keyValues.size() < 1) {
            isAnyUpdatePerformed = true;

            HivePartitionFields fieldDialog = new HivePartitionFields();

            List<String> rowFields = new ArrayList<>();

            for (FilterProperties string : propertyList) {
                rowFields.add("");
            }
            fieldDialog.setRowFields(rowFields);
            keyValues.add(fieldDialog);

            keyValueTableViewer.refresh();

            keyValueTableViewer.editElement(keyValueTableViewer.getElementAt(keyValues.size() - 1), 0);
        }
    }

    /**
     * 
     * @param keyValueDelButton
     * @return
     */
    private SelectionListener deleteButtonListner(final Button keyValueDelButton) {
        SelectionListener listener = new SelectionListener() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                WidgetUtility.setCursorOnDeleteRow(keyValueTableViewer, keyValues);
                isAnyUpdatePerformed = true;
                if (lblPropertyError.getVisible()) {
                    lblPropertyError.setVisible(false);
                }
                keyValueTableViewer.refresh();

                if (keyValues.size() < 1) {
                    keyValueDelButton.setEnabled(false);
                }
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
            }
        };
        return listener;
    }

    /**
     * 
     * @return
     */
    private boolean checkTargetFieldsSequence() {

        boolean result = HiveFieldDialogHelper.INSTANCE.compareAndChangeColor(getTargetTableViewer(),
                sourceFieldsList);
        if (!result && keyValueTableViewer.getTable().getColumnCount() == 0) {
            btnCheckButton.setEnabled(false);
        } else {
            btnCheckButton.setEnabled(true);
        }
        return result;
    }

}