private ColumnSpec getColumnSpecFromField(
      ValueMetaInterface inputValueMeta,
      ValueMetaInterface insertValueMeta,
      ValueMetaInterface targetValueMeta) {
    logBasic(
        "Mapping input field "
            + inputValueMeta.getName()
            + " ("
            + inputValueMeta.getTypeDesc()
            + ")"
            + " to target column "
            + insertValueMeta.getName()
            + " ("
            + targetValueMeta.getOriginalColumnTypeName()
            + ") ");

    String targetColumnTypeName = targetValueMeta.getOriginalColumnTypeName();

    if (targetColumnTypeName.equals("INTEGER") || targetColumnTypeName.equals("BIGINT")) {
      return new ColumnSpec(ColumnSpec.ConstantWidthType.INTEGER_64);
    } else if (targetColumnTypeName.equals("BOOLEAN")) {
      return new ColumnSpec(ColumnSpec.ConstantWidthType.BOOLEAN);
    } else if (targetColumnTypeName.equals("FLOAT")
        || targetColumnTypeName.equals("DOUBLE PRECISION")) {
      return new ColumnSpec(ColumnSpec.ConstantWidthType.FLOAT);
    } else if (targetColumnTypeName.equals("CHAR")) {
      return new ColumnSpec(ColumnSpec.UserDefinedWidthType.CHAR, targetValueMeta.getLength());
    } else if (targetColumnTypeName.equals("VARCHAR")) {
      return new ColumnSpec(ColumnSpec.VariableWidthType.VARCHAR);
    } else if (targetColumnTypeName.equals("DATE")) {
      return new ColumnSpec(ColumnSpec.ConstantWidthType.DATE);
    } else if (targetColumnTypeName.equals("TIME")) {
      return new ColumnSpec(ColumnSpec.ConstantWidthType.TIME);
    } else if (targetColumnTypeName.equals("TIMETZ")) {
      return new ColumnSpec(ColumnSpec.ConstantWidthType.TIMETZ);
    } else if (targetColumnTypeName.equals("TIMESTAMP")) {
      return new ColumnSpec(ColumnSpec.ConstantWidthType.TIMESTAMP);
    } else if (targetColumnTypeName.equals("TIMESTAMPTZ")) {
      return new ColumnSpec(ColumnSpec.ConstantWidthType.TIMESTAMPTZ);
    } else if (targetColumnTypeName.equals("INTERVAL")
        || targetColumnTypeName.equals("INTERVAL DAY TO SECOND")) {
      return new ColumnSpec(ColumnSpec.ConstantWidthType.INTERVAL);
    } else if (targetColumnTypeName.equals("BINARY")) {
      return new ColumnSpec(ColumnSpec.VariableWidthType.VARBINARY);
    } else if (targetColumnTypeName.equals("VARBINARY")) {
      return new ColumnSpec(ColumnSpec.VariableWidthType.VARBINARY);
    } else if (targetColumnTypeName.equals("NUMERIC")) {
      return new ColumnSpec(ColumnSpec.ConstantWidthType.NUMERIC);
    }
    throw new IllegalArgumentException(
        "Column type " + targetColumnTypeName + " not supported."); // $NON-NLS-1$
  }
  /** Copy information from the meta-data input to the dialog fields. */
  public void getData() {
    int i;

    for (i = 0; i < input.size(); i++) {
      TableItem item = wFields.table.getItem(i);
      ValueMetaInterface v = input.getValueMeta(i);
      int idx = 1;
      if (v.getName() != null) {
        item.setText(idx++, v.getName());
      }
      item.setText(idx++, v.getTypeDesc());
      item.setText(idx++, v.getLength() < 0 ? "-" : "" + v.getLength());
      item.setText(idx++, v.getPrecision() < 0 ? "-" : "" + v.getPrecision());
      item.setText(idx++, Const.NVL(v.getOrigin(), ""));
      item.setText(idx++, ValueMeta.getStorageTypeCode(v.getStorageType()));
      item.setText(idx++, Const.NVL(v.getConversionMask(), ""));
      item.setText(idx++, Const.NVL(v.getCurrencySymbol(), ""));
      item.setText(idx++, Const.NVL(v.getDecimalSymbol(), ""));
      item.setText(idx++, Const.NVL(v.getGroupingSymbol(), ""));
      item.setText(idx++, ValueMeta.getTrimTypeDesc(v.getTrimType()));
      item.setText(idx++, Const.NVL(v.getComments(), ""));
    }
    wFields.optWidth(true);
  }
  private void populateTableWithIncomingFields() {
    if (m_incomingFieldsProducer != null) {
      RowMetaInterface incomingRowMeta = m_incomingFieldsProducer.getIncomingFields();

      Table table = m_fieldsView.table;
      if (incomingRowMeta != null) {
        Set<String> existingRowAliases = new HashSet<String>();
        for (int i = 0; i < table.getItemCount(); i++) {
          TableItem tableItem = table.getItem(i);
          String alias = tableItem.getText(1);
          if (!Const.isEmpty(alias)) {
            existingRowAliases.add(alias);
          }
        }

        int choice = 0;
        if (existingRowAliases.size() > 0) {
          // Ask what we should do with existing mapping data
          MessageDialog md =
              new MessageDialog(
                  m_shell,
                  Messages.getString("MappingDialog.GetFieldsChoice.Title"),
                  null,
                  Messages.getString(
                      "MappingDialog.GetFieldsChoice.Message",
                      "" + existingRowAliases.size(),
                      "" + incomingRowMeta.size()),
                  MessageDialog.WARNING,
                  new String[] {
                    Messages.getString("MappingDialog.AddNew"),
                    Messages.getString("MappingOutputDialog.Add"),
                    Messages.getString("MappingOutputDialog.ClearAndAdd"),
                    Messages.getString("MappingOutputDialog.Cancel"),
                  },
                  0);
          MessageDialog.setDefaultImage(GUIResource.getInstance().getImageSpoon());
          int idx = md.open();
          choice = idx & 0xFF;
        }

        if (choice == 3 || choice == 255 /* 255 = escape pressed */) {
          return; // Cancel
        }

        if (choice == 2) {
          m_fieldsView.clearAll();
        }

        for (int i = 0; i < incomingRowMeta.size(); i++) {
          ValueMetaInterface vm = incomingRowMeta.getValueMeta(i);
          boolean addIt = true;

          if (choice == 0) {
            // only add if its not already in the table
            if (existingRowAliases.contains(vm.getName())) {
              addIt = false;
            }
          }

          if (addIt) {
            TableItem item = new TableItem(m_fieldsView.table, SWT.NONE);
            item.setText(1, vm.getName());
            item.setText(2, "N");

            if (m_familyCI.getComboValues()[0].length() > 0) {
              // use existing first column family name as the default
              item.setText(3, m_familyCI.getComboValues()[0]);
            } else {
              // default
              item.setText(3, DEFAULT_FAMILY);
            }

            item.setText(4, vm.getName());
            item.setText(5, vm.getTypeDesc());
            if (vm.getType() == ValueMetaInterface.TYPE_INTEGER) {
              item.setText(5, "Long");
            }
            if (vm.getType() == ValueMetaInterface.TYPE_NUMBER) {
              item.setText(5, "Double");
            }
            if (vm.getStorageType() == ValueMetaInterface.STORAGE_TYPE_INDEXED) {
              Object[] indexValus = vm.getIndex();
              String indexValsS = HBaseValueMeta.objectIndexValuesToString(indexValus);
              item.setText(6, indexValsS);
            }
          }
        }

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