Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Story/586/t3736/refator validation result #712

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import com.regnosys.rosetta.types.RDataType
import com.rosetta.model.lib.annotations.RosettaDataRule
import com.rosetta.model.lib.expression.ComparisonResult
import com.rosetta.model.lib.path.RosettaPath
import com.rosetta.model.lib.validation.ValidationResult
import com.rosetta.model.lib.validation.ModelValidationResult
import com.rosetta.model.lib.validation.Validator
import org.eclipse.xtend2.lib.StringConcatenationClient
import org.eclipse.xtext.generator.IFileSystemAccess2
Expand All @@ -24,7 +24,7 @@ import static com.regnosys.rosetta.generator.java.util.ModelGeneratorUtil.*
import static com.regnosys.rosetta.rosetta.simple.SimplePackage.Literals.CONDITION__EXPRESSION
import javax.inject.Inject
import com.google.inject.ImplementedBy
import com.rosetta.model.lib.validation.ValidationResult.ValidationType
import com.rosetta.model.lib.validation.ValidationType
import com.regnosys.rosetta.generator.java.types.JavaTypeUtil

class ConditionGenerator {
Expand Down Expand Up @@ -85,7 +85,7 @@ class ConditionGenerator {
String NAME = "«ruleName»";
String DEFINITION = «definition»;

«ValidationResult»<«rosettaClass.name»> validate(«RosettaPath» «pathId», «rosettaClass.name» «validateScope.createIdentifier(implicitVarRepr, rosettaClass.name.toFirstLower)»);
«ModelValidationResult»<«rosettaClass.name»> validate(«RosettaPath» «pathId», «rosettaClass.name» «validateScope.createIdentifier(implicitVarRepr, rosettaClass.name.toFirstLower)»);

class «defaultClassName» implements «className» {

Expand All @@ -94,17 +94,17 @@ class ConditionGenerator {

«ENDFOR»
@Override
public «ValidationResult»<«rosettaClass.name»> validate(«RosettaPath» «defaultClassPathId», «rosettaClass.name» «defaultClassValidateScope.createIdentifier(implicitVarRepr, rosettaClass.name.toFirstLower)») {
public «ModelValidationResult»<«rosettaClass.name»> validate(«RosettaPath» «defaultClassPathId», «rosettaClass.name» «defaultClassValidateScope.createIdentifier(implicitVarRepr, rosettaClass.name.toFirstLower)») {
«ComparisonResult» «defaultClassResultId» = executeDataRule(«defaultClassValidateScope.getIdentifierOrThrow(implicitVarRepr)»);
if (result.get()) {
return «ValidationResult».success(NAME, ValidationResult.ValidationType.DATA_RULE, "«rosettaClass.name»", «defaultClassPathId», DEFINITION);
return «ModelValidationResult».success(NAME, ValidationType.DATA_RULE, "«rosettaClass.name»", «defaultClassPathId», DEFINITION);
}

String «defaultClassFailureMessageId» = «defaultClassResultId».getError();
if («defaultClassFailureMessageId» == null || «defaultClassFailureMessageId».contains("Null") || «defaultClassFailureMessageId» == "") {
«defaultClassFailureMessageId» = "Condition has failed.";
}
return «ValidationResult».failure(NAME, «ValidationType».DATA_RULE, "«rosettaClass.name»", «defaultClassPathId», DEFINITION, «defaultClassFailureMessageId»);
return «ModelValidationResult».failure(NAME, «ValidationType».DATA_RULE, "«rosettaClass.name»", «defaultClassPathId», DEFINITION, «defaultClassFailureMessageId»);
}

private «ComparisonResult» executeDataRule(«rosettaClass.name» «defaultClassExecuteScope.createIdentifier(implicitVarRepr, rosettaClass.name.toFirstLower)») {
Expand All @@ -120,8 +120,8 @@ class ConditionGenerator {
class «noOpClassName» implements «className» {

@Override
public «ValidationResult»<«rosettaClass.name»> validate(«RosettaPath» «noOpClassPathId», «rosettaClass.name» «noOpClassValidateScope.createIdentifier(implicitVarRepr, rosettaClass.name.toFirstLower)») {
return «ValidationResult».success(NAME, ValidationResult.ValidationType.DATA_RULE, "«rosettaClass.name»", «noOpClassPathId», DEFINITION);
public «ModelValidationResult»<«rosettaClass.name»> validate(«RosettaPath» «noOpClassPathId», «rosettaClass.name» «noOpClassValidateScope.createIdentifier(implicitVarRepr, rosettaClass.name.toFirstLower)») {
return «ModelValidationResult».success(NAME, ValidationType.DATA_RULE, "«rosettaClass.name»", «noOpClassPathId», DEFINITION);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ import com.rosetta.model.lib.expression.ExpressionOperators
import com.rosetta.model.lib.expression.MapperMaths
import com.rosetta.model.lib.mapper.MapperC
import com.rosetta.model.lib.mapper.MapperS
import com.rosetta.model.lib.validation.ValidationResult.ChoiceRuleValidationMethod
import com.rosetta.model.lib.validation.ChoiceRuleValidationMethod
import java.math.BigDecimal
import java.time.LocalTime
import java.time.format.DateTimeFormatter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ import com.rosetta.model.lib.expression.ComparisonResult
import com.rosetta.model.lib.expression.ExpressionOperators
import com.rosetta.model.lib.path.RosettaPath
import com.rosetta.model.lib.validation.ExistenceChecker
import com.rosetta.model.lib.validation.ValidationResult
import com.rosetta.model.lib.validation.ValidationResult.ValidationType
import com.rosetta.model.lib.validation.ModelValidationResult
import com.rosetta.model.lib.validation.ValidationType
import com.rosetta.model.lib.validation.Validator
import com.rosetta.model.lib.validation.ValidatorWithArg
import java.util.Map
Expand Down Expand Up @@ -78,7 +78,7 @@ class ValidatorsGenerator {
public class «t.toValidatorClass» implements «Validator»<«t.toJavaType»> {

@Override
public «ValidationResult»<«t.toJavaType»> validate(«RosettaPath» path, «t.toJavaType» o) {
public «ModelValidationResult»<«t.toJavaType»> validate(«RosettaPath» path, «t.toJavaType» o) {
/* Casting is required to ensure types are output to ensure recompilation in Rosetta */
String error =
«Lists».<«ComparisonResult»>newArrayList(
Expand All @@ -88,9 +88,9 @@ class ValidatorsGenerator {
).stream().filter(res -> !res.get()).map(res -> res.getError()).collect(«method(Collectors, "joining")»("; "));

if (!«method(Strings, "isNullOrEmpty")»(error)) {
return «method(ValidationResult, "failure")»("«t.name»", «ValidationResult.ValidationType».CARDINALITY, "«t.name»", path, "", error);
return «method(ModelValidationResult, "failure")»("«t.name»", «ValidationType».CARDINALITY, "«t.name»", path, "", error);
}
return «method(ValidationResult, "success")»("«t.name»", «ValidationResult.ValidationType».CARDINALITY, "«t.name»", path, "");
return «method(ModelValidationResult, "success")»("«t.name»", «ValidationType».CARDINALITY, "«t.name»", path, "");
}

}
Expand All @@ -100,7 +100,7 @@ class ValidatorsGenerator {
public class «t.toTypeFormatValidatorClass» implements «Validator»<«t.toJavaType»> {

@Override
public «ValidationResult»<«t.toJavaType»> validate(«RosettaPath» path, «t.toJavaType» o) {
public «ModelValidationResult»<«t.toJavaType»> validate(«RosettaPath» path, «t.toJavaType» o) {
String error =
«Lists».<«ComparisonResult»>newArrayList(
«FOR attrCheck : attributes.map[checkTypeFormat].filter[it !== null] SEPARATOR ", "»
Expand All @@ -109,9 +109,9 @@ class ValidatorsGenerator {
).stream().filter(res -> !res.get()).map(res -> res.getError()).collect(«method(Collectors, "joining")»("; "));

if (!«method(Strings, "isNullOrEmpty")»(error)) {
return «method(ValidationResult, "failure")»("«t.name»", «ValidationResult.ValidationType».TYPE_FORMAT, "«t.name»", path, "", error);
return «method(ModelValidationResult, "failure")»("«t.name»", «ValidationType».TYPE_FORMAT, "«t.name»", path, "", error);
}
return «method(ValidationResult, "success")»("«t.name»", «ValidationResult.ValidationType».TYPE_FORMAT, "«t.name»", path, "");
return «method(ModelValidationResult, "success")»("«t.name»", «ValidationType».TYPE_FORMAT, "«t.name»", path, "");
}

}
Expand All @@ -122,7 +122,7 @@ class ValidatorsGenerator {

/* Casting is required to ensure types are output to ensure recompilation in Rosetta */
@Override
public <T2 extends «t.toJavaType»> «ValidationResult»<«t.toJavaType»> validate(«RosettaPath» path, T2 o, «Set»<String> fields) {
public <T2 extends «t.toJavaType»> «ModelValidationResult»<«t.toJavaType»> validate(«RosettaPath» path, T2 o, «Set»<String> fields) {
«Map»<String, Boolean> fieldExistenceMap = «ImmutableMap».<String, Boolean>builder()
«FOR attr : attributes»
.put("«attr.name»", «ExistenceChecker».isSet((«attr.toExpandedAttribute.toMultiMetaOrRegularJavaType») o.get«attr.name?.toFirstUpper»()))
Expand All @@ -136,9 +136,9 @@ class ValidatorsGenerator {
.collect(«Collectors».toSet());

if (setFields.equals(fields)) {
return «method(ValidationResult, "success")»("«t.name»", «ValidationType».ONLY_EXISTS, "«t.name»", path, "");
return «method(ModelValidationResult, "success")»("«t.name»", «ValidationType».ONLY_EXISTS, "«t.name»", path, "");
}
return «method(ValidationResult, "failure")»("«t.name»", «ValidationType».ONLY_EXISTS, "«t.name»", path, "",
return «method(ModelValidationResult, "failure")»("«t.name»", «ValidationType».ONLY_EXISTS, "«t.name»", path, "",
String.format("[%s] should only be set. Set fields: %s", fields, setFields));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;

import com.rosetta.model.lib.validation.*;
import org.apache.commons.lang3.StringUtils;

import com.rosetta.model.lib.RosettaModelObject;
Expand All @@ -25,9 +26,6 @@
import com.rosetta.model.lib.mapper.Mapper.Path;
import com.rosetta.model.lib.mapper.MapperS;
import com.rosetta.model.lib.meta.RosettaMetaData;
import com.rosetta.model.lib.validation.ExistenceChecker;
import com.rosetta.model.lib.validation.ValidationResult;
import com.rosetta.model.lib.validation.ValidatorWithArg;

public class ExpressionOperators {

Expand Down Expand Up @@ -123,9 +121,9 @@ private static <T extends RosettaModelObject> ComparisonResult validateOnlyExist
RosettaMetaData<T> meta = (RosettaMetaData<T>) parent.metaData();
ValidatorWithArg<? super T, Set<String>> onlyExistsValidator = meta.onlyExistsValidator();
if (onlyExistsValidator != null) {
ValidationResult<? extends RosettaModelObject> validationResult = onlyExistsValidator.validate(null, parent, fields);
ModelValidationResult<? extends RosettaModelObject> validationResult = onlyExistsValidator.validate(null, parent, fields);
// Translate validationResult into comparisonResult
return validationResult.isSuccess() ?
return ModelValidationResult.isSuccess() ?
ComparisonResult.success() :
ComparisonResult.failure(validationResult.getFailureReason().orElse(""));
} else {
Expand Down Expand Up @@ -420,7 +418,7 @@ private static <T> String formatMultiError(Mapper<T> o) {

// one-of and choice

public static <T> ComparisonResult choice(Mapper<T> mapper, List<String> choiceFieldNames, ValidationResult.ChoiceRuleValidationMethod necessity) {
public static <T> ComparisonResult choice(Mapper<T> mapper, List<String> choiceFieldNames, ChoiceRuleValidationMethod necessity) {
T object = mapper.get();
List<String> populatedFieldNames = new LinkedList<>();
for (String a: choiceFieldNames) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,12 @@
import com.rosetta.model.lib.process.Processor;
import com.rosetta.model.lib.qualify.QualifyFunctionFactory;
import com.rosetta.model.lib.qualify.QualifyResult;
import com.rosetta.model.lib.validation.ValidationResult;
import com.rosetta.model.lib.validation.Validator;
import com.rosetta.model.lib.validation.ValidatorFactory;
import com.rosetta.model.lib.validation.ValidatorWithArg;
import com.rosetta.model.lib.validation.*;

import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.function.Function;
import com.rosetta.model.lib.validation.ValidationResult.ValidationType;

/**
* @author TomForwood
Expand Down Expand Up @@ -234,14 +231,14 @@ public Validator<? super Key> validator() {
return new Validator<Key>() {

@Override
public ValidationResult<Key> validate(RosettaPath path, Key key) {
public ModelValidationResult<Key> validate(RosettaPath path, Key key) {
if (key.getKeyValue()==null) {
return ValidationResult.failure("Key.value", ValidationType.KEY, "Key", path, "", "Key value must be set");
return ModelValidationResult.failure("Key.value", ValidationType.KEY, "Key", path, "", "Key value must be set");
}
if (key.getScope()==null) {
return ValidationResult.failure("Key.scope", ValidationType.KEY, "Key", path, "", "Key scope must be set");
return ModelValidationResult.failure("Key.scope", ValidationType.KEY, "Key", path, "", "Key scope must be set");
}
return ValidationResult.success("Key", ValidationType.KEY, "Key", path, "");
return ModelValidationResult.success("Key", ValidationType.KEY, "Key", path, "");
}
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import java.util.Collection;
import java.util.Optional;
import com.rosetta.model.lib.expression.ComparisonResult;
import com.rosetta.model.lib.validation.ValidationResult;
import com.rosetta.model.lib.validation.ModelValidationResult;

/**
* Contains results from applying expression and data rules to try to qualify a RosettaModelObject.
Expand Down Expand Up @@ -88,12 +88,12 @@ public QualifyResultBuilder setExpressionResult(String definition, ComparisonRes
return this;
}

public QualifyResultBuilder addAndDataRuleResult(ValidationResult<?> result) {
public QualifyResultBuilder addAndDataRuleResult(ModelValidationResult<?> result) {
andDataRuleResults.add(ExpressionDataRuleResult.fromDataRule(result, "and"));
return this;
}

public QualifyResultBuilder addOrDataRuleResult(ValidationResult<?> result) {
public QualifyResultBuilder addOrDataRuleResult(ModelValidationResult<?> result) {
orDataRuleResults.add(ExpressionDataRuleResult.fromDataRule(result, "or"));
return this;
}
Expand All @@ -114,7 +114,7 @@ static ExpressionDataRuleResult fromExpression(String definition, ComparisonResu
return new ExpressionDataRuleResult("Expression", Type.Expression, definition, Optional.empty(), result.get(), result.getError());
}

static ExpressionDataRuleResult fromDataRule(ValidationResult<?> result, String operator) {
static ExpressionDataRuleResult fromDataRule(ModelValidationResult<?> result, String operator) {
return new ExpressionDataRuleResult(
result.getName(),
Type.DataRule,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.rosetta.model.lib.validation;

import java.util.function.Function;

public enum ChoiceRuleValidationMethod {

OPTIONAL("Zero or one field must be set", fieldCount -> fieldCount == 1 || fieldCount == 0),
REQUIRED("One and only one field must be set", fieldCount -> fieldCount == 1);

public String getDesc() {
return desc;
}

private final String desc;
private final Function<Integer, Boolean> check;

ChoiceRuleValidationMethod(String desc, Function<Integer, Boolean> check) {
this.desc = desc;
this.check = check;
}

public boolean check(int fields) {
return check.apply(fields);
}

public String getDescription() {
return this.desc;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package com.rosetta.model.lib.validation;

import com.rosetta.model.lib.path.RosettaPath;

import java.util.Optional;


public
class ModelValidationResult<T>{

private static String modelObjectName;
private static String name;
private String definition;
private Optional<String> failureReason;
private static ValidationType validationType;
private final RosettaPath path;
private final Optional<ValidationData> data;

public ModelValidationResult(String name, ValidationType validationType, String modelObjectName, RosettaPath path, String definition, Optional<String> failureReason, Optional<ValidationData> data) {
this.name = name;
this.validationType = validationType;
this.path = path;
this.modelObjectName = modelObjectName;
this.definition = definition;
this.failureReason = failureReason;
this.data = data;
}

public static String getModelObjectName() {
return modelObjectName;
}

public static String getName() {
return name;
}

public String getDefinition() {
return definition;
}

public static ValidationType getValidationType() {
return validationType;
}

public RosettaPath getPath() {
return path;
}

public Optional<ValidationData> getData() {
return data;
}

public static <T> ModelValidationResult<T> success(String name, ValidationType validationType, String modelObjectName, RosettaPath path, String definition) {
return new ModelValidationResult<>(name, validationType, modelObjectName, path, definition, Optional.empty(), Optional.empty());
}

public static <T> ModelValidationResult<T> failure(String name, ValidationType validationType, String modelObjectName, RosettaPath path, String definition, String failureMessage) {
return new ModelValidationResult<>(name, validationType, modelObjectName, path, definition, Optional.of(failureMessage), Optional.empty());
}

public static boolean isSuccess() {
return !getFailureReason().isPresent();
}


public static Optional<String> getFailureReason() {
if (getFailureReason().isPresent() && getModelObjectName().endsWith("Report") && ValidationType.DATA_RULE.equals(getValidationType())) {
return getUpdatedFailureReason();
}
return getFailureReason();
}

@Override
public String toString() {
return String.format("Validation %s on [%s] for [%s] [%s] %s",
isSuccess() ? "SUCCESS" : "FAILURE",
path.buildPath(),
validationType,
name,
failureReason.map(s -> "because [" + s + "]").orElse(""));
}

// TODO: refactor this method. This is an ugly hack.
private static Optional<String> getUpdatedFailureReason() {

String conditionName = getName().replaceFirst(getModelObjectName(), "");
String failReason = getFailureReason().get();

failReason = failReason.replaceAll(getModelObjectName(), "");
failReason = failReason.replaceAll("->get", " ");
failReason = failReason.replaceAll("[^\\w-]+", " ");
failReason = failReason.replaceAll("^\\s+", "");

return Optional.of(conditionName + ":- " + failReason);
}
}
Loading