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);
}
}
}
}