private void challengeConversions()

in core/src/main/java/org/apache/hop/core/util/StringEvaluator.java [113:240]


  private void challengeConversions(String value) {
    List<StringEvaluationResult> all = new ArrayList<>(evaluationResults);
    IValueMeta stringMetaClone = null;
    for (StringEvaluationResult cmm : all) {
      if (cmm.getConversionMeta().isBoolean()) {
        // Boolean conversion never fails.
        // If it's a Y, N, true, false it's a boolean otherwise it ain't.
        //
        String string;
        if (tryTrimming) {
          string = Const.trim(value);
        } else {
          string = value;
        }
        if (StringUtils.isEmpty(value)) {
          cmm.incrementNrNull();
        } else if (!("Y".equalsIgnoreCase(string)
            || "N".equalsIgnoreCase(string)
            || "TRUE".equalsIgnoreCase(string)
            || "FALSE".equalsIgnoreCase(string))) {
          evaluationResults.remove(cmm);
        } else {
          cmm.incrementSuccesses();
        }
      } else if (cmm.getConversionMeta().isDate()) {
        String dateFormat = cmm.getConversionMeta().getConversionMask();
        if (!DateDetector.isValidDateFormatToStringDate(dateFormat, value, "en_US")) {
          evaluationResults.remove(cmm);
        } else {
          try {
            Object object = DateDetector.getDateFromStringByFormat(value, dateFormat);
            cmm.incrementSuccesses();
            if (cmm.getMin() == null || cmm.getConversionMeta().compare(cmm.getMin(), object) > 0) {
              cmm.setMin(object);
            }
            if (cmm.getMax() == null || cmm.getConversionMeta().compare(cmm.getMax(), object) < 0) {
              cmm.setMax(object);
            }
          } catch (ParseException e) {
            evaluationResults.remove(cmm);
          } catch (HopValueException e) {
            evaluationResults.remove(cmm);
          }
        }
      } else {
        try {
          if (cmm.getConversionMeta().isNumeric()) {
            boolean stop = false;
            int nrDots = 0;
            int nrCommas = 0;
            int pos = 0;
            for (char c : value.toCharArray()) {

              boolean currencySymbolMatch =
                  !String.valueOf(c).equals(cmm.getConversionMeta().getCurrencySymbol())
                      && c != '('
                      && c != ')';

              if (!Character.isDigit(c)
                  && c != '.'
                  && c != ','
                  && !Character.isSpaceChar(c)
                  && currencySymbolMatch
                  && (pos > 0 && (c == '+' || c == '-')) // allow + & - at the 1st position
              ) {
                evaluationResults.remove(cmm);
                stop = true;
                break;
              }

              // If the value contains a decimal or grouping symbol or some sort, it's not an
              // integer
              //
              if ((c == '.' && cmm.getConversionMeta().isInteger())
                  || (c == ',' && cmm.getConversionMeta().isInteger())) {
                evaluationResults.remove(cmm);
                stop = true;
                break;
              }
              if (c == '.') {
                nrDots++;
              }
              if (c == ',') {
                nrCommas++;
              }
              pos++;
            }

            if (nrDots > 1 && nrCommas > 1) {
              evaluationResults.remove(cmm);
              stop = true;
            }

            if (stop) {
              continue;
            }
          }

          if (stringMetaClone == null) {
            // avoid cloning each time
            stringMetaClone = stringMeta.clone();
          }
          stringMetaClone.setConversionMetadata(cmm.getConversionMeta());
          stringMetaClone.setTrimType(cmm.getConversionMeta().getTrimType());
          Object object = stringMetaClone.convertDataUsingConversionMetaData(value);

          // Still here? Evaluate the data...
          // Keep track of null values, min, max, etc.
          //
          if (cmm.getConversionMeta().isNull(object)) {
            cmm.incrementNrNull();
          } else {
            cmm.incrementSuccesses();
          }
          if (cmm.getMin() == null || cmm.getConversionMeta().compare(cmm.getMin(), object) > 0) {
            cmm.setMin(object);
          }
          if (cmm.getMax() == null || cmm.getConversionMeta().compare(cmm.getMax(), object) < 0) {
            cmm.setMax(object);
          }
        } catch (HopValueException e) {
          // This one doesn't work, remove it from the list!
          //
          evaluationResults.remove(cmm);
        }
      }
    }
  }