Skip to content

Commit

Permalink
new Validation Result implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
PayalKhanna committed Jan 16, 2024
1 parent 7b0e53f commit 49b911b
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 128 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -61,49 +61,6 @@ class ValidatorsGenerator {
buildClass(root.existsValidation, new RDataType(d).onlyExistsClassBody(version, d.allNonOverridesAttributes), scope)
}

def private StringConcatenationClient classBody(RDataType t, String version, Iterable<Attribute> attributes) '''
public class «t.toValidatorClass» implements «Validator»<«t.toJavaType»> {

@Override
public «ValidationResult»<«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(
«FOR attrCheck : attributes.map[checkCardinality(toExpandedAttribute)].filter[it !== null] SEPARATOR ", "»
«attrCheck»
«ENDFOR»
).stream().filter(res -> !res.get()).map(res -> res.getError()).collect(«method(Collectors, "joining")»("; "));

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

}
'''
def private StringConcatenationClient typeFormatClassBody(RDataType t, String version, Iterable<Attribute> attributes) '''
public class «t.toTypeFormatValidatorClass» implements «Validator»<«t.toJavaType»> {

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

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

}
'''
def private StringConcatenationClient onlyExistsClassBody(RDataType t, String version, Iterable<Attribute> attributes) '''
public class «t.toOnlyExistsValidatorClass» implements «ValidatorWithArg»<«t.toJavaType», «Set»<String>> {

Expand All @@ -123,84 +80,11 @@ class ValidatorsGenerator {
.collect(«Collectors».toSet());

if (setFields.equals(fields)) {
return «method(ValidationResult, "success")»("«t.name»", «ValidationType».ONLY_EXISTS, "«t.name»", path, "");
return «method(ValidationResult, "success")»(path);
}
return «method(ValidationResult, "failure")»("«t.name»", «ValidationType».ONLY_EXISTS, "«t.name»", path, "",
String.format("[%s] should only be set. Set fields: %s", fields, setFields));
return «method(ValidationResult, "failure")»(path,
String.format("[%s] should only be set. Set fields: %s", fields, setFields), null);
}
}
'''
private def StringConcatenationClient checkCardinality(ExpandedAttribute attr) {
if (attr.inf === 0 && attr.isUnbound) {
null
} else {
/* Casting is required to ensure types are output to ensure recompilation in Rosetta */
'''
«IF attr.isMultiple»
«method(ExpressionOperators, "checkCardinality")»("«attr.name»", («attr.toMultiMetaOrRegularJavaType») o.get«attr.name?.toFirstUpper»() == null ? 0 : ((«attr.toMultiMetaOrRegularJavaType») o.get«attr.name?.toFirstUpper»()).size(), «attr.inf», «attr.sup»)
«ELSE»
«method(ExpressionOperators, "checkCardinality")»("«attr.name»", («attr.toMultiMetaOrRegularJavaType») o.get«attr.name?.toFirstUpper»() != null ? 1 : 0, «attr.inf», «attr.sup»)
«ENDIF»
'''
}
}
private def StringConcatenationClient checkTypeFormat(Attribute attr) {
val t = attr.RTypeOfSymbol.stripFromTypeAliases
if (t instanceof RStringType) {
if (t != UNCONSTRAINED_STRING) {
val min = t.interval.minBound
val max = t.interval.max.optional
val pattern = t.pattern.optionalPattern
return '''«method(ExpressionOperators, "checkString")»("«attr.name»", «attr.attributeValue», «min», «max», «pattern»)'''
}
} else if (t instanceof RNumberType) {
if (t != UNCONSTRAINED_NUMBER) {
val digits = t.digits.optional
val fractionalDigits = t.fractionalDigits.optional
val min = t.interval.min.optionalBigDecimal
val max = t.interval.max.optionalBigDecimal
return '''«method(ExpressionOperators, "checkNumber")»("«attr.name»", «attr.attributeValue», «digits», «fractionalDigits», «min», «max»)'''
}
}
return null
}
private def StringConcatenationClient getAttributeValue(Attribute attr) {
if (attr.metaAnnotations.empty) {
'''o.get«attr.name?.toFirstUpper»()'''
} else {
val jt = attr.toExpandedAttribute.toMultiMetaOrRegularJavaType
if (jt.isList) {
val itemType = jt.itemType
'''o.get«attr.name?.toFirstUpper»().stream().map(«itemType»::getValue).collect(«Collectors».toList())'''
} else {
'''o.get«attr.name?.toFirstUpper»().getValue()'''
}
}
}
private def StringConcatenationClient optional(Optional<? extends Object> v) {
if (v.isPresent) {
'''«method(Optional, "of")»(«v.get»)'''
} else {
'''«method(Optional, "empty")»()'''
}
}
private def StringConcatenationClient optionalPattern(Optional<Pattern> v) {
if (v.isPresent) {
'''«method(Optional, "of")»(«Pattern».compile("«StringEscapeUtils.escapeJava(v.get.toString)»"))'''
} else {
'''«method(Optional, "empty")»()'''
}
}
private def StringConcatenationClient optionalBigDecimal(Optional<BigDecimal> v) {
if (v.isPresent) {
'''«method(Optional, "of")»(new «BigDecimal»("«StringEscapeUtils.escapeJava(v.get.toString)»"))'''
} else {
'''«method(Optional, "empty")»()'''
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,13 @@ import com.rosetta.model.lib.validation.ValidationResult
import com.rosetta.model.lib.path.RosettaPath
import com.rosetta.model.lib.validation.ConditionValidation
import com.rosetta.util.types.generated.GeneratedJavaClass
import java.util.Set
import java.util.Map
import com.rosetta.model.lib.validation.ExistenceChecker
import com.rosetta.model.lib.validation.ValidatorWithArg
import com.google.common.collect.ImmutableMap
import com.rosetta.model.lib.validation.ValidationData
import java.util.concurrent.ConcurrentHashMap

class ValidatorGenerator {
@Inject extension ImportManagerExtension
Expand All @@ -60,7 +67,7 @@ class ValidatorGenerator {
'''
public class «data.name»Validator implements «RosettaModelObjectValidator»<«modelPojo»>{
«FOR con : data.conditions»
@«Inject» protected «new GeneratedJavaClass(root.condition, con.conditionName(data), Object)» «con.name.toFirstLower»;
@«Inject» protected «new GeneratedJavaClass(root.condition, con.conditionName(data), Object)» «con.conditionName(data).toFirstLower» ;
«ENDFOR»
@Override
Expand All @@ -77,27 +84,28 @@ class ValidatorGenerator {
«List»<«ConditionValidation»> conditionValidations = new «ArrayList»<>();
«FOR dataCondition : data.conditions»
conditionValidations.add(validate«dataCondition.name.toFirstUpper»(o, path));
conditionValidations.add(validate«dataCondition.conditionName(data).toFirstUpper»(o, path));
«ENDFOR»
return new «TypeValidation»(modelSymbolId, attributeValidations, conditionValidations);
}
«FOR attribute : data.allAttributes»
public «AttributeValidation» validate«attribute.name.toFirstUpper»(«attribute.RTypeOfSymbol.toJavaReferenceType» atr, «RosettaPath» path) {
«List»<«ValidationResult»> validationResults = new «ArrayList»<>();
«ValidationResult» cardinalityValidation = «checkCardinality(attribute)»;
validationResults.add(«checkTypeFormat(attribute)»);
«val typeFormatCheck = checkTypeFormat(attribute)»
«IF typeFormatCheck !== null»validationResults.add(«typeFormatCheck»);«ENDIF»
return new «AttributeValidation»("«attribute.name»", cardinalityValidation, validationResults);
}
«ENDFOR»
«FOR dataCondition : data.conditions»
public «ConditionValidation» validate«dataCondition.name.toFirstUpper»(«rDataType.toJavaReferenceType» data, «RosettaPath» path) {
«ValidationResult» result = «dataCondition.name.toFirstLower».validate(path, data);
public «ConditionValidation» validate«dataCondition.conditionName(data).toFirstUpper»(«rDataType.toJavaReferenceType» data, «RosettaPath» path) {
«ValidationResult» result = «dataCondition.conditionName(data).toFirstLower».validate(path, data);
return new «ConditionValidation»(«dataCondition.name.toFirstLower».toString(), result);
return new «ConditionValidation»(«dataCondition.conditionName(data).toFirstLower».toString(), result);
}
«ENDFOR»
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class TypeValidation extends ValidationData {
private final List<ConditionValidation> conditionValidation;


public TypeValidation(ModelSymbolId typeId,List<AttributeValidation> attributeValidations, List<ConditionValidation> conditionValidation) {
public TypeValidation(ModelSymbolId typeId, List<AttributeValidation> attributeValidations, List<ConditionValidation> conditionValidation) {
this.typeId = typeId;
this.attributeValidations = attributeValidations;
this.conditionValidation = conditionValidation;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ class DataRuleGeneratorTest {
import com.rosetta.model.lib.expression.ComparisonResult;
import com.rosetta.model.lib.mapper.MapperS;
import com.rosetta.model.lib.path.RosettaPath;
import com.rosetta.model.lib.validation.ConditionValidationData;
import com.rosetta.model.lib.validation.ValidationResult;
import com.rosetta.model.lib.validation.ValidationType;
import com.rosetta.model.lib.validation.Validator;
import com.rosetta.test.model.Foo;
Expand Down

0 comments on commit 49b911b

Please sign in to comment.