/**
  * copy property's values from SVD operator to SVD Calculator operator this function should be
  * called when update SVD operator's properties and connect SVD operator to SVD calculator.
  *
  * @param svdOperator
  * @param calculatorOperator
  */
 public static void syncSVDParams2SVDCalculator(
     Operator svdOperator, Operator calculatorOperator) {
   final int svdOperatorIdx = 1, svdCalculatorOperatorIdx = 0;
   final String[][] syncParamsNameMapping = {
     {OperatorParameter.NAME_UmatrixFullTable, OperatorParameter.NAME_UmatrixTable},
     {OperatorParameter.NAME_RowNameF, OperatorParameter.NAME_RowName},
     {OperatorParameter.NAME_UdependentColumn, OperatorParameter.NAME_dependentColumn},
     {OperatorParameter.NAME_VmatrixFullTable, OperatorParameter.NAME_VmatrixTable},
     {OperatorParameter.NAME_ColNameF, OperatorParameter.NAME_ColName},
     {OperatorParameter.NAME_VdependentColumn, OperatorParameter.NAME_dependentColumn},
     {OperatorParameter.NAME_SmatrixFullTable, OperatorParameter.NAME_singularValueTable},
     {OperatorParameter.NAME_SdependentColumn, OperatorParameter.NAME_dependentColumn}
   };
   for (String[] syncParamNameMapping : syncParamsNameMapping) {
     Object value =
         svdOperator.getOperatorParameter(syncParamNameMapping[svdOperatorIdx]).getValue();
     boolean isTable = false;
     String schemaName = null;
     if (syncParamNameMapping[svdOperatorIdx] == OperatorParameter.NAME_UmatrixTable) {
       schemaName =
           StringHandler.doubleQ(
               (String)
                   svdOperator
                       .getOperatorParameter(OperatorParameter.NAME_UmatrixSchema)
                       .getValue());
       isTable |= true;
     } else if (syncParamNameMapping[svdOperatorIdx] == OperatorParameter.NAME_VmatrixTable) {
       schemaName =
           StringHandler.doubleQ(
               (String)
                   svdOperator
                       .getOperatorParameter(OperatorParameter.NAME_VmatrixSchema)
                       .getValue());
       isTable |= true;
     } else if (syncParamNameMapping[svdOperatorIdx]
         == OperatorParameter.NAME_singularValueTable) {
       schemaName =
           StringHandler.doubleQ(
               (String)
                   svdOperator
                       .getOperatorParameter(OperatorParameter.NAME_singularValueSchema)
                       .getValue());
       isTable |= true;
     }
     if (isTable) {
       value = schemaName + "." + StringHandler.doubleQ((String) value);
     }
     calculatorOperator
         .getOperatorParameter(syncParamNameMapping[svdCalculatorOperatorIdx])
         .setValue(value);
   }
 }
  @Override
  public String validateInputLink(Operator precedingOperator) {
    String message = super.validateInputLink(precedingOperator);
    if (message == null || message.trim().equals("")) {
      if (!(precedingOperator instanceof RandomSamplingOperator)
          && !(precedingOperator instanceof StratifiedSamplingOperator)) {
        message =
            NLSUtility.bind(
                LanguagePack.getMessage(LanguagePack.MESSAGE_CHECK_LINK, locale),
                precedingOperator.getToolTipTypeName(),
                this.getToolTipTypeName());
      }
    }

    if (message == null || message.trim().equals("")) {
      List<UIOperatorModel> parentList = OperatorUtility.getParentList(getOperModel());
      if (parentList != null && parentList.size() > 0) {
        message =
            NLSUtility.bind(
                LanguagePack.getMessage(LanguagePack.CANNOT_LINKMUTIL_TOOPERATOR, locale),
                this.getToolTipTypeName());
      }
    }
    return message;
  }