in plugins/transforms/validator/src/main/java/org/apache/hop/pipeline/transforms/validator/Validator.java [256:626]
private List<HopValidatorException> validateFields(IRowMeta inputRowMeta, Object[] r)
throws HopValueException {
List<HopValidatorException> exceptions = new ArrayList<>();
for (int i = 0; i < meta.getValidations().size(); i++) {
Validation field = meta.getValidations().get(i);
int valueIndex = data.fieldIndexes[i];
IValueMeta validatorMeta = data.constantsMeta[i];
IValueMeta valueMeta = inputRowMeta.getValueMeta(valueIndex);
Object valueData = r[valueIndex];
// Check for null
//
boolean isNull = valueMeta.isNull(valueData);
if (!field.isNullAllowed() && isNull) {
HopValidatorException exception =
new HopValidatorException(
this,
field,
HopValidatorException.ERROR_NULL_VALUE_NOT_ALLOWED,
BaseMessages.getString(
PKG,
"Validator.Exception.NullNotAllowed",
field.getFieldName(),
inputRowMeta.getString(r)),
field.getFieldName());
exceptions.add(exception);
if (!meta.isValidatingAll()) {
return exceptions;
}
}
if (field.isOnlyNullAllowed() && !isNull) {
HopValidatorException exception =
new HopValidatorException(
this,
field,
HopValidatorException.ERROR_ONLY_NULL_VALUE_ALLOWED,
BaseMessages.getString(
PKG,
"Validator.Exception.OnlyNullAllowed",
field.getFieldName(),
inputRowMeta.getString(r)),
field.getFieldName());
exceptions.add(exception);
if (!meta.isValidatingAll()) {
return exceptions;
}
}
int dataType = ValueMetaFactory.getIdForValueMeta(field.getDataType());
// Check the data type!
// Same data type?
//
if (field.isDataTypeVerified()
&& dataType != IValueMeta.TYPE_NONE
&& dataType != valueMeta.getType()) {
HopValidatorException exception =
new HopValidatorException(
this,
field,
HopValidatorException.ERROR_UNEXPECTED_DATA_TYPE,
BaseMessages.getString(
PKG,
"Validator.Exception.UnexpectedDataType",
field.getFieldName(),
valueMeta.toStringMeta(),
validatorMeta.toStringMeta()),
field.getFieldName());
exceptions.add(exception);
if (!meta.isValidatingAll()) {
return exceptions;
}
}
// Check various things if the value is not null.
//
if (isNull) {
continue;
}
if (data.fieldsMinimumLengthAsInt[i] >= 0
|| data.fieldsMaximumLengthAsInt[i] >= 0
|| data.minimumValue[i] != null
|| data.maximumValue[i] != null
|| data.listValues[i].length > 0
|| field.isSourcingValues()
|| StringUtils.isNotEmpty(data.startString[i])
|| StringUtils.isNotEmpty(data.endString[i])
|| StringUtils.isNotEmpty(data.startStringNotAllowed[i])
|| StringUtils.isNotEmpty(data.endStringNotAllowed[i])
|| field.isOnlyNumericAllowed()
|| data.patternExpected[i] != null
|| data.patternDisallowed[i] != null) {
String stringValue = valueMeta.getString(valueData);
int stringLength = stringValue.length();
// Minimum length
//
if (data.fieldsMinimumLengthAsInt[i] >= 0
&& stringLength < data.fieldsMinimumLengthAsInt[i]) {
HopValidatorException exception =
new HopValidatorException(
this,
field,
HopValidatorException.ERROR_SHORTER_THAN_MINIMUM_LENGTH,
BaseMessages.getString(
PKG,
"Validator.Exception.ShorterThanMininumLength",
field.getFieldName(),
valueMeta.getString(valueData),
Integer.toString(stringValue.length()),
field.getMinimumLength()),
field.getFieldName());
exceptions.add(exception);
if (!meta.isValidatingAll()) {
return exceptions;
}
}
// Maximum length
//
if (data.fieldsMaximumLengthAsInt[i] >= 0
&& stringLength > data.fieldsMaximumLengthAsInt[i]) {
HopValidatorException exception =
new HopValidatorException(
this,
field,
HopValidatorException.ERROR_LONGER_THAN_MAXIMUM_LENGTH,
BaseMessages.getString(
PKG,
"Validator.Exception.LongerThanMaximumLength",
field.getFieldName(),
valueMeta.getString(valueData),
Integer.toString(stringValue.length()),
field.getMaximumLength()),
field.getFieldName());
exceptions.add(exception);
if (!meta.isValidatingAll()) {
return exceptions;
}
}
// Minimal value
//
if (data.minimumValue[i] != null
&& valueMeta.compare(valueData, validatorMeta, data.minimumValue[i]) < 0) {
HopValidatorException exception =
new HopValidatorException(
this,
field,
HopValidatorException.ERROR_LOWER_THAN_ALLOWED_MINIMUM,
BaseMessages.getString(
PKG,
"Validator.Exception.LowerThanMinimumValue",
field.getFieldName(),
valueMeta.getString(valueData),
data.constantsMeta[i].getString(data.minimumValue[i])),
field.getFieldName());
exceptions.add(exception);
if (!meta.isValidatingAll()) {
return exceptions;
}
}
// Maximum value
//
if (data.maximumValue[i] != null
&& valueMeta.compare(valueData, validatorMeta, data.maximumValue[i]) > 0) {
HopValidatorException exception =
new HopValidatorException(
this,
field,
HopValidatorException.ERROR_HIGHER_THAN_ALLOWED_MAXIMUM,
BaseMessages.getString(
PKG,
"Validator.Exception.HigherThanMaximumValue",
field.getFieldName(),
valueMeta.getString(valueData),
data.constantsMeta[i].getString(data.maximumValue[i])),
field.getFieldName());
exceptions.add(exception);
if (!meta.isValidatingAll()) {
return exceptions;
}
}
// In list?
//
if (field.isSourcingValues() || data.listValues[i].length > 0) {
boolean found = false;
for (Object object : data.listValues[i]) {
if (object != null
&& data.listValues[i] != null
&& valueMeta.compare(valueData, validatorMeta, object) == 0) {
found = true;
}
}
if (!found) {
HopValidatorException exception =
new HopValidatorException(
this,
field,
HopValidatorException.ERROR_VALUE_NOT_IN_LIST,
BaseMessages.getString(
PKG,
"Validator.Exception.NotInList",
field.getFieldName(),
valueMeta.getString(valueData)),
field.getFieldName());
exceptions.add(exception);
if (!meta.isValidatingAll()) {
return exceptions;
}
}
}
// Numeric data or strings with only
if (field.isOnlyNumericAllowed()) {
HopValidatorException exception = assertNumeric(valueMeta, valueData, field);
if (exception != null) {
exceptions.add(exception);
if (!meta.isValidatingAll()) {
return exceptions;
}
}
}
// Does not start with string value
//
if (StringUtils.isNotEmpty(data.startString[i])
&& !stringValue.startsWith(data.startString[i])) {
HopValidatorException exception =
new HopValidatorException(
this,
field,
HopValidatorException.ERROR_DOES_NOT_START_WITH_STRING,
BaseMessages.getString(
PKG,
"Validator.Exception.DoesNotStartWithString",
field.getFieldName(),
valueMeta.getString(valueData),
field.getStartString()),
field.getFieldName());
exceptions.add(exception);
if (!meta.isValidatingAll()) {
return exceptions;
}
}
// Ends with string value
//
if (StringUtils.isNotEmpty(data.endString[i]) && !stringValue.endsWith(data.endString[i])) {
HopValidatorException exception =
new HopValidatorException(
this,
field,
HopValidatorException.ERROR_DOES_NOT_END_WITH_STRING,
BaseMessages.getString(
PKG,
"Validator.Exception.DoesNotEndWithString",
field.getFieldName(),
valueMeta.getString(valueData),
field.getEndString()),
field.getFieldName());
exceptions.add(exception);
if (!meta.isValidatingAll()) {
return exceptions;
}
}
// Starts with string value
//
if (StringUtils.isNotEmpty(data.startStringNotAllowed[i])
&& stringValue.startsWith(data.startStringNotAllowed[i])) {
HopValidatorException exception =
new HopValidatorException(
this,
field,
HopValidatorException.ERROR_STARTS_WITH_STRING,
BaseMessages.getString(
PKG,
"Validator.Exception.StartsWithString",
field.getFieldName(),
valueMeta.getString(valueData),
field.getStartStringNotAllowed()),
field.getFieldName());
exceptions.add(exception);
if (!meta.isValidatingAll()) {
return exceptions;
}
}
// Ends with string value
//
if (StringUtils.isNotEmpty(data.endStringNotAllowed[i])
&& stringValue.endsWith(data.endStringNotAllowed[i])) {
HopValidatorException exception =
new HopValidatorException(
this,
field,
HopValidatorException.ERROR_ENDS_WITH_STRING,
BaseMessages.getString(
PKG,
"Validator.Exception.EndsWithString",
field.getFieldName(),
valueMeta.getString(valueData),
field.getEndStringNotAllowed()),
field.getFieldName());
exceptions.add(exception);
if (!meta.isValidatingAll()) {
return exceptions;
}
}
// Matching regular expression allowed?
//
if (data.patternExpected[i] != null) {
Matcher matcher = data.patternExpected[i].matcher(stringValue);
if (!matcher.matches()) {
HopValidatorException exception =
new HopValidatorException(
this,
field,
HopValidatorException.ERROR_MATCHING_REGULAR_EXPRESSION_EXPECTED,
BaseMessages.getString(
PKG,
"Validator.Exception.MatchingRegExpExpected",
field.getFieldName(),
valueMeta.getString(valueData),
data.regularExpression[i]),
field.getFieldName());
exceptions.add(exception);
if (!meta.isValidatingAll()) {
return exceptions;
}
}
}
// Matching regular expression NOT allowed?
//
if (data.patternDisallowed[i] != null) {
Matcher matcher = data.patternDisallowed[i].matcher(stringValue);
if (matcher.matches()) {
HopValidatorException exception =
new HopValidatorException(
this,
field,
HopValidatorException.ERROR_MATCHING_REGULAR_EXPRESSION_NOT_ALLOWED,
BaseMessages.getString(
PKG,
"Validator.Exception.MatchingRegExpNotAllowed",
field.getFieldName(),
valueMeta.getString(valueData),
data.regularExpressionNotAllowed[i]),
field.getFieldName());
exceptions.add(exception);
if (!meta.isValidatingAll()) {
return exceptions;
}
}
}
}
}
return exceptions;
}