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

Java tutorial

Introduction

Here is the source code for hydrograph.ui.propertywindow.widgets.dialog.hiveInput.HiveFieldDialogHelper.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 hydrograph.ui.datastructure.property.InputHivePartitionColumn;
import hydrograph.ui.propertywindow.messages.Messages;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.ListIterator;
import java.util.Set;

import org.apache.commons.collections.ListUtils;
import org.apache.commons.lang.StringUtils;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;

/**
 * Hive field dialog helper class.
 * @author Bitwise
 *
 */
public class HiveFieldDialogHelper {

    public static final HiveFieldDialogHelper INSTANCE = new HiveFieldDialogHelper();

    private HiveFieldDialogHelper() {

    }

    /**
     * Arranges key Values data 
     * @param rowFields
     * @param columnNameList
     * @return
     */
    public InputHivePartitionColumn arrangeColumndata(List<String> rowFields, List<String> columnNameList) {

        InputHivePartitionColumn hivePartitionColumn = null;

        if (!columnNameList.isEmpty() && null != columnNameList.get(0)) {
            hivePartitionColumn = new InputHivePartitionColumn();
            hivePartitionColumn.setName(columnNameList.get(0));
            hivePartitionColumn.setValue(rowFields.get(0));

            columnNameList.remove(0);
            rowFields.remove(0);

            hivePartitionColumn.setInputHivePartitionColumn(arrangeColumndata(rowFields, columnNameList));

        }

        return hivePartitionColumn;

    }

    /**
     * Retrieve Saved data to render.
     * @param hivePartitionColumnsl
     * @param fieldNameList
     * @return
     */
    public List<HivePartitionFields> getSavedColumnData(List<InputHivePartitionColumn> incomingList,
            List<String> fieldNameList) {

        List<HivePartitionFields> fieldsDialogList = new ArrayList<>();

        for (InputHivePartitionColumn inputHivePartitionColumn : incomingList) {

            HivePartitionFields tempObj = new HivePartitionFields();

            tempObj.setRowFields(
                    extractListFromObject(inputHivePartitionColumn, new ArrayList<String>(), fieldNameList));
            fieldsDialogList.add(tempObj);

        }

        checkAndAdjustRowsColumns(fieldsDialogList, fieldNameList, incomingList);

        return fieldsDialogList;
    }

    /**
     * Refreshes key values colunm and its data
     * @param propertyList
     * @param keyValues
     * @param isKeyDeleted 
     */
    public List<HivePartitionFields> refreshKeyColumnsAndValues(List<String> propertyList,
            List<HivePartitionFields> keyValues, List<String> colNames, boolean isKeyDeleted) {
        if (isKeyDeleted) {
            for (String deltedColumn : checkIfNewColumnAddedOrDeleted(new ArrayList<>(propertyList), colNames)) {
                for (HivePartitionFields tempRows : keyValues) {
                    tempRows.getRowFields().remove(colNames.indexOf(deltedColumn));
                }
            }
        } else {

            for (int i = 0; i < checkIfNewColumnAddedOrDeleted(colNames, new ArrayList<>(propertyList))
                    .size(); i++) {
                for (HivePartitionFields tempRows : keyValues) {
                    tempRows.getRowFields().add("");
                }
            }

        }
        return keyValues;
    }

    /**
     * 
     * @param keyValues
     * @param keyList
     * @param incomingList2 
     */
    private void checkAndAdjustRowsColumns(List<HivePartitionFields> keyValues, List<String> keyList,
            List<InputHivePartitionColumn> incomingList) {
        Set<String> colNames = new HashSet<>();
        for (int i = 0; i < incomingList.size(); i++) {

            colNames = extractColumnNamesFromObject(incomingList.get(i), colNames);

            List<String> notAvailableFields = ListUtils.subtract(keyList, new ArrayList<>(colNames));

            if (null != notAvailableFields && notAvailableFields.size() > 0) {
                for (String fieldName : notAvailableFields) {

                    keyValues.get(i).getRowFields().add(keyList.indexOf(fieldName), "");
                }
            }
            colNames.clear();
        }

    }

    /**
     * 
     * @param columnNames
     * @param keyList
     * @return
     */
    private List<String> checkIfNewColumnAddedOrDeleted(List<String> columnNames, List<String> keyList) {

        if (null != columnNames && !columnNames.isEmpty() && !keyList.isEmpty()) {

            return ListUtils.subtract(keyList, columnNames);

        }

        return new ArrayList<String>();

    }

    /**
     * 
     * @param hivePartitionColumn
     * @param temp
     * @param keyList
     * @return
     */
    private List<String> extractListFromObject(InputHivePartitionColumn hivePartitionColumn, List<String> temp,
            final List<String> keyList) {

        for (String colName : keyList) {
            if (colName.equalsIgnoreCase(hivePartitionColumn.getName())) {

                temp.add(hivePartitionColumn.getValue());

            }
        }

        if (null != hivePartitionColumn.getInputHivePartitionColumn()) {
            extractListFromObject(hivePartitionColumn.getInputHivePartitionColumn(), temp, keyList);
        }

        return temp;

    }

    /**
     * 
     * @param hivePartitionColumn
     * @param colNames
     * @return
     */
    private Set<String> extractColumnNamesFromObject(InputHivePartitionColumn hivePartitionColumn,
            Set<String> colNames) {

        colNames.add(hivePartitionColumn.getName());

        if (null != hivePartitionColumn.getInputHivePartitionColumn()) {

            extractColumnNamesFromObject(hivePartitionColumn.getInputHivePartitionColumn(), colNames);
        }

        return colNames;
    }

    /**
     * Disposes all columns in table
     * @param tableViewer
     */
    public void disposeAllColumns(TableViewer tableViewer, List<HivePartitionFields> fieldsDialogList) {
        fieldsDialogList.clear();
        tableViewer.refresh();

        TableColumn[] columns = tableViewer.getTable().getColumns();
        for (TableColumn tc : columns) {
            tc.dispose();
        }
        tableViewer.getTable().redraw();
    }

    /**
     * 
     * Compares available fields and selected partition key fields for 
     *   hive input and output components. 
     * 
     */
    public boolean compare_fields(TableItem[] items, List<String> sourceFieldsList) {
        ListIterator<String> t_itr, s_itr;
        boolean is_equal = true;

        List<String> target_fields = new ArrayList<String>();
        if (items.length > 0) {
            for (TableItem tableItem : items) {
                target_fields.add((String) tableItem.getText());
            }

            List<String> source_field = new ArrayList<String>(sourceFieldsList);

            t_itr = target_fields.listIterator(target_fields.size());
            s_itr = source_field.listIterator(source_field.size());

            while (t_itr.hasPrevious() & s_itr.hasPrevious()) {
                if (StringUtils.equals(s_itr.previous(), t_itr.previous())) {
                    is_equal = true;
                } else {
                    is_equal = false;
                    break;
                }
            }
        }
        return is_equal;

    }

    /**
     * 
     * Message dialog to be displayed if compare_fields() method returns false. 
     * 
     */
    public int Message_Dialog() {

        MessageDialog dialog = new MessageDialog(Display.getCurrent().getActiveShell(), "Rearrange Fields", null,
                Messages.HIVE_PARTI_SEQ_ERROR, MessageDialog.ERROR,
                new String[] { "Rearrange Schema", "Rearrange Partition Fields" }, 0);
        int result = dialog.open();
        return result;
    }

    /**
     * 
     * Change color of selected partition key fields to red if compare_fields() method returns false.
     * 
     */
    public boolean compareAndChangeColor(TableViewer tableViewer, List<String> sourceFieldsList) {
        boolean check_field = compare_fields(tableViewer.getTable().getItems(), sourceFieldsList);
        if (!check_field) {
            Color color = Display.getCurrent().getSystemColor(SWT.COLOR_RED);
            for (TableItem tableItem : tableViewer.getTable().getItems()) {
                tableItem.setForeground(color);
            }
        } else {
            Color color = Display.getCurrent().getSystemColor(SWT.COLOR_BLACK);
            for (TableItem tableItem : tableViewer.getTable().getItems()) {
                tableItem.setForeground(color);
            }

        }
        tableViewer.refresh();
        return check_field;
    }

}