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/new validation result interim #718

Closed
wants to merge 49 commits into from
Closed
Show file tree
Hide file tree
Changes from 28 commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
1f21c82
task-3736: new data structure
PayalKhanna Dec 1, 2023
724207b
task-3736: add getters
PayalKhanna Dec 1, 2023
e1f3e3d
Merge branch 'master' into story/586/t3736/newdatastruc
PayalKhanna Dec 1, 2023
48736c9
task-3736: fixing type and missing extends
PayalKhanna Dec 11, 2023
e7545b4
Merge branch 'master' into story/586/t3736/newdatastruc
PayalKhanna Dec 11, 2023
8a0121a
task-3736: added Deprecation
PayalKhanna Dec 11, 2023
6ff40af
task-3736: refactor existing Validation Result
PayalKhanna Dec 11, 2023
6373326
task-3736: refactor existing Validation Result
PayalKhanna Dec 11, 2023
f57f01e
task-3736: refactor existing Validation Result
PayalKhanna Dec 11, 2023
f4de8aa
task-3736: refactor existing Validation Result
PayalKhanna Dec 11, 2023
89025c1
task-3736: refactor existing Validation Result
PayalKhanna Dec 11, 2023
e613e97
task-3736: refactor existing Validation Result
PayalKhanna Dec 11, 2023
fff855e
new Validation Result implementation
PayalKhanna Dec 13, 2023
0495270
new Validation Result implementation
PayalKhanna Dec 13, 2023
a78aec0
new Validation Result implementation
PayalKhanna Dec 14, 2023
cf3eb08
new Validation Result implementation
PayalKhanna Dec 14, 2023
c2357de
new Validation Result implementation
PayalKhanna Dec 14, 2023
759076e
new Validation Result implementation
PayalKhanna Jan 5, 2024
a8322dd
Merge remote-tracking branch 'origin/master' into story/586/t3736/new…
PayalKhanna Jan 9, 2024
d4f2c60
new Validation Result implementation
PayalKhanna Jan 11, 2024
e043260
new Validation Result implementation
PayalKhanna Jan 12, 2024
7bb26da
new Validation Result implementation
PayalKhanna Jan 12, 2024
8e9700e
new Validation Result implementation
PayalKhanna Jan 12, 2024
df29ca9
new Validation Result implementation
PayalKhanna Jan 12, 2024
15ead14
new Validation Result implementation
PayalKhanna Jan 12, 2024
0cdbffd
new Validation Result implementation
PayalKhanna Jan 12, 2024
05ecc2d
new Validation Result implementation
PayalKhanna Jan 12, 2024
c94264e
new Validation Result implementation
PayalKhanna Jan 12, 2024
4fd0662
new Validation Result implementation
PayalKhanna Jan 12, 2024
155e084
new Validation Result implementation
PayalKhanna Jan 12, 2024
f8f0743
new Validation Result implementation
PayalKhanna Jan 12, 2024
865f4fa
new Validation Result implementation
PayalKhanna Jan 12, 2024
bdd38fc
Merge remote-tracking branch 'origin/master' into story/586/t3736/new…
PayalKhanna Jan 12, 2024
20fb7ca
new Validation Result implementation
PayalKhanna Jan 12, 2024
df0b3f9
new Validation Result implementation
PayalKhanna Jan 12, 2024
fe23fa2
new Validation Result implementation
PayalKhanna Jan 12, 2024
7d026a7
new Validation Result implementation
PayalKhanna Jan 15, 2024
b83a7fc
new Validation Result implementation
PayalKhanna Jan 15, 2024
05725ef
tobe Deleted
PayalKhanna Jan 15, 2024
03697bf
tobe Deleted
PayalKhanna Jan 15, 2024
a4c6443
new Validation Result implementation
PayalKhanna Jan 15, 2024
1c2b981
new Validation Result implementation
PayalKhanna Jan 15, 2024
7b0e53f
new Validation Result implementation
PayalKhanna Jan 15, 2024
49b911b
new Validation Result implementation
PayalKhanna Jan 16, 2024
5062320
test fixes
PayalKhanna Jan 19, 2024
66e5fd5
test fixes
PayalKhanna Jan 19, 2024
9807c7a
test fixes
PayalKhanna Jan 19, 2024
0b5d150
test fixes
PayalKhanna Jan 19, 2024
a60c5a4
Merge remote-tracking branch 'origin/master' into story/586/t3736/new…
PayalKhanna Jan 19, 2024
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 @@ -37,6 +37,7 @@ import com.regnosys.rosetta.generator.java.reports.ReportGenerator
import javax.inject.Inject
import com.regnosys.rosetta.rosetta.RosettaRule
import com.regnosys.rosetta.rosetta.RosettaReport
import com.regnosys.rosetta.generator.java.validator.ValidatorGenerator

/**
* Generates code from your model files on save.
Expand All @@ -57,6 +58,7 @@ class RosettaGenerator implements IGenerator2 {

@Inject ModelObjectGenerator dataGenerator
@Inject ValidatorsGenerator validatorsGenerator
@Inject ValidatorGenerator validatorGenerator
@Inject extension RosettaFunctionExtensions
@Inject FunctionGenerator funcGenerator
@Inject ReportGenerator reportGenerator
Expand Down Expand Up @@ -146,10 +148,11 @@ class RosettaGenerator implements IGenerator2 {
Data: {
dataGenerator.generate(packages, fsa, it, version)
metaGenerator.generate(packages, fsa, it, version)
validatorsGenerator.generate(packages, fsa, it, version)
//validatorsGenerator.generate(packages, fsa, it, version)
it.conditions.forEach [ cond |
conditionGenerator.generate(packages, fsa, it, cond, version)
]
validatorGenerator.generate(packages, fsa, it, version)
tabulatorGenerator.generate(fsa, it, Optional.empty)
}
Function: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package com.regnosys.rosetta.generator.java.condition

import com.google.inject.ImplementedBy
import com.regnosys.rosetta.RosettaExtensions
import com.regnosys.rosetta.generator.java.JavaIdentifierRepresentationService
import com.regnosys.rosetta.generator.java.JavaScope
import com.regnosys.rosetta.generator.java.RosettaJavaPackages.RootPackage
import com.regnosys.rosetta.generator.java.expression.ExpressionGenerator
import com.regnosys.rosetta.generator.java.function.FunctionDependencyProvider
import com.regnosys.rosetta.generator.java.types.JavaTypeTranslator
import com.regnosys.rosetta.generator.java.types.JavaTypeUtil
import com.regnosys.rosetta.generator.java.util.ImportManagerExtension
import com.regnosys.rosetta.generator.java.util.RosettaGrammarUtil
import com.regnosys.rosetta.rosetta.simple.Condition
Expand All @@ -15,17 +17,15 @@ 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.ConditionValidationData
import com.rosetta.model.lib.validation.ValidationResult
import com.rosetta.model.lib.validation.Validator
import javax.inject.Inject
import org.eclipse.xtend2.lib.StringConcatenationClient
import org.eclipse.xtext.generator.IFileSystemAccess2

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.regnosys.rosetta.generator.java.types.JavaTypeUtil

class ConditionGenerator {
@Inject ExpressionGenerator expressionHandler
Expand Down Expand Up @@ -97,14 +97,14 @@ class ConditionGenerator {
public «ValidationResult»<«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 «ValidationResult».success(«defaultClassPathId»);
}

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 «ValidationResult».failure(«defaultClassPathId», «defaultClassFailureMessageId», new «ConditionValidationData»());
}

private «ComparisonResult» executeDataRule(«rosettaClass.name» «defaultClassExecuteScope.createIdentifier(implicitVarRepr, rosettaClass.name.toFirstLower)») {
Expand All @@ -121,7 +121,7 @@ class ConditionGenerator {

@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);
return «ValidationResult».success(«noOpClassPathId»);
}
}
}
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 @@ -84,14 +84,16 @@ class ModelMetaGenerator {
«ENDIF»
}

@Deprecated
@Override
public «Validator»<? super «dataClass»> validator() {
return new «validator»();
throw new «UnsupportedOperationException»();
}

@Deprecated
@Override
public «Validator»<? super «dataClass»> typeFormatValidator() {
return new «typeFormatValidator»();
throw new «UnsupportedOperationException»();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ 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.ValidationType
import com.rosetta.model.lib.validation.Validator
import com.rosetta.model.lib.validation.ValidatorWithArg
import java.util.Map
Expand Down Expand Up @@ -80,7 +80,7 @@ class ValidatorsGenerator {
@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 =
String error =
«Lists».<«ComparisonResult»>newArrayList(
«FOR attrCheck : attributes.map[checkCardinality(toExpandedAttribute)].filter[it !== null] SEPARATOR ", "»
«attrCheck»
Expand All @@ -101,13 +101,13 @@ class ValidatorsGenerator {

@Override
public «ValidationResult»<«t.toJavaType»> validate(«RosettaPath» path, «t.toJavaType» o) {
String error =
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»", «ValidationResult.ValidationType».TYPE_FORMAT, "«t.name»", path, "", error);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
package com.regnosys.rosetta.generator.java.validator

import com.regnosys.rosetta.RosettaExtensions
import com.regnosys.rosetta.generator.java.JavaScope
import com.regnosys.rosetta.generator.java.RosettaJavaPackages.RootPackage
import com.regnosys.rosetta.generator.java.types.JavaTypeTranslator
import com.regnosys.rosetta.generator.java.types.JavaTypeUtil
import com.regnosys.rosetta.generator.java.util.ImportManagerExtension
import com.regnosys.rosetta.rosetta.simple.Attribute
import com.regnosys.rosetta.rosetta.simple.Data
import com.regnosys.rosetta.types.RDataType
import com.regnosys.rosetta.types.RosettaTypeProvider
import com.regnosys.rosetta.types.TypeSystem
import com.regnosys.rosetta.types.builtin.RBuiltinTypeService
import com.regnosys.rosetta.types.builtin.RNumberType
import com.regnosys.rosetta.types.builtin.RStringType
import com.rosetta.model.lib.ModelSymbolId
import com.rosetta.model.lib.validation.AttributeValidation
import com.rosetta.model.lib.validation.RosettaModelObjectValidator
import com.rosetta.model.lib.validation.TypeValidation
import com.rosetta.model.lib.validation.ValidationUtil
import com.rosetta.util.DottedPath
import java.math.BigDecimal
import java.util.ArrayList
import java.util.Optional
import java.util.regex.Pattern
import java.util.stream.Collectors
import javax.inject.Inject
import org.apache.commons.text.StringEscapeUtils
import org.eclipse.xtend2.lib.StringConcatenationClient
import org.eclipse.xtext.generator.IFileSystemAccess2
import static extension com.regnosys.rosetta.generator.util.RosettaAttributeExtensions.*
import java.util.List
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

class ValidatorGenerator {
@Inject extension ImportManagerExtension
@Inject extension RosettaExtensions
@Inject extension JavaTypeTranslator
@Inject extension RosettaTypeProvider
@Inject extension TypeSystem
@Inject extension RBuiltinTypeService
@Inject extension JavaTypeUtil

def generate(RootPackage root, IFileSystemAccess2 fsa, Data data, String version) {
val topScope = new JavaScope(root.typeValidation)

val classBody = data.classBody(topScope, root)
val content = buildClass(root.typeValidation, classBody, topScope)
fsa.generateFile('''«root.typeValidation.withForwardSlashes»/«data.name»Validator.java''', content)
}

private def StringConcatenationClient classBody(Data data, JavaScope scope, RootPackage root) {

val modelPojo = new RDataType(data).toJavaReferenceType
val rDataType = new RDataType(data)
'''
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»;

«ENDFOR»
@Override
public «TypeValidation» validate(«RosettaPath» path, «rDataType.toJavaReferenceType» o) {

«DottedPath» packageName = «DottedPath».of(o.getClass().getPackage().toString());
«String» simpleName = o.getClass().getSimpleName();
«ModelSymbolId» modelSymbolId = new «ModelSymbolId»(packageName, simpleName);

«List»<«AttributeValidation»> attributeValidations = new «ArrayList»<>();
«FOR attribute : data.allAttributes»
attributeValidations.add(validate«attribute.name.toFirstUpper»(«attribute.attributeValue», path));
«ENDFOR»

«List»<«ConditionValidation»> conditionValidations = new «ArrayList»<>();
«FOR dataCondition : data.conditions»
conditionValidations.add(validate«dataCondition.name.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)»);

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

return new «ConditionValidation»(«dataCondition.name.toFirstLower».toString(), result);
}
«ENDFOR»
}
'''

}
private def StringConcatenationClient checkCardinality(Attribute attr) {
if (attr.card.inf === 0 && attr.card.unbounded) {
null
} else {
/* Casting is required to ensure types are output to ensure recompilation in Rosetta */
if (attr.card.isIsMany) {
'''«method(ValidationUtil, "checkCardinality")»("«attr.name»", atr == null ? 0 : atr.size(), «attr.card.inf», «attr.card.sup» , path)'''
} else {
'''«method(ValidationUtil, "checkCardinality")»("«attr.name»", atr != null ? 1 : 0, «attr.card.inf», «attr.card.sup», path)'''
}
}
}

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(ValidationUtil, "checkString")»("«attr.name»", atr, «min», «max», «pattern», path)'''
}
} 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(ValidationUtil, "checkNumber")»("«attr.name»",atr, «digits», «IF !t.isInteger»«fractionalDigits», «ENDIF»«min», «max», path)'''
}
}
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 @@ -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 @@ -125,7 +123,7 @@ private static <T extends RosettaModelObject> ComparisonResult validateOnlyExist
if (onlyExistsValidator != null) {
ValidationResult<? extends RosettaModelObject> validationResult = onlyExistsValidator.validate(null, parent, fields);
// Translate validationResult into comparisonResult
return validationResult.isSuccess() ?
return ValidationResult.isSuccess() ?
ComparisonResult.success() :
ComparisonResult.failure(validationResult.getFailureReason().orElse(""));
} else {
Expand Down Expand Up @@ -274,6 +272,7 @@ public static ComparisonResult checkCardinality(String msgPrefix, int actual, in
return ComparisonResult.success();
}

@Deprecated
public static ComparisonResult checkString(String msgPrefix, String value, int minLength, Optional<Integer> maxLength, Optional<Pattern> pattern) {
if (value == null) {
return ComparisonResult.success();
Expand Down Expand Up @@ -420,7 +419,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
Loading
Loading