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- 711 new data structure regulation validation #721

Closed
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import com.regnosys.rosetta.generator.java.object.JavaPackageInfoGenerator
import com.regnosys.rosetta.generator.java.object.MetaFieldGenerator
import com.regnosys.rosetta.generator.java.object.ModelMetaGenerator
import com.regnosys.rosetta.generator.java.object.ModelObjectGenerator
import com.regnosys.rosetta.generator.java.object.ValidatorsGenerator
import com.regnosys.rosetta.generator.java.reports.TabulatorGenerator
import com.regnosys.rosetta.generator.resourcefsa.ResourceAwareFSAFactory
import com.regnosys.rosetta.generator.util.RosettaFunctionExtensions
Expand All @@ -37,6 +36,8 @@ 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
import com.regnosys.rosetta.generator.java.object.OnlyExistsValidatorGenerator

/**
* Generates code from your model files on save.
Expand All @@ -56,7 +57,8 @@ class RosettaGenerator implements IGenerator2 {
@Inject RuleGenerator ruleGenerator

@Inject ModelObjectGenerator dataGenerator
@Inject ValidatorsGenerator validatorsGenerator
@Inject OnlyExistsValidatorGenerator onlyExistsValidatorGenerator
@Inject ValidatorGenerator validatorGenerator
@Inject extension RosettaFunctionExtensions
@Inject FunctionGenerator funcGenerator
@Inject ReportGenerator reportGenerator
Expand Down Expand Up @@ -146,10 +148,12 @@ class RosettaGenerator implements IGenerator2 {
Data: {
dataGenerator.generate(packages, fsa, it, version)
metaGenerator.generate(packages, fsa, it, version)
validatorsGenerator.generate(packages, fsa, it, version)
onlyExistsValidatorGenerator.generate(packages, fsa, it, version)
it.conditions.forEach [ cond |
conditionGenerator.generate(packages, fsa, it, cond, version)
]
//new
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 @@ -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)»);
«ValidationResult» 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 «ValidationResult» 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 @@ -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 «ValidationResult» validate(«RosettaPath» «noOpClassPathId», «rosettaClass.name» «noOpClassValidateScope.createIdentifier(implicitVarRepr, rosettaClass.name.toFirstLower)») {
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
@@ -0,0 +1,90 @@
package com.regnosys.rosetta.generator.java.object

import com.google.common.base.Strings
import com.google.common.collect.ImmutableMap
import com.google.common.collect.Lists
import com.regnosys.rosetta.RosettaExtensions
import com.regnosys.rosetta.generator.java.util.ImportManagerExtension
import com.regnosys.rosetta.generator.object.ExpandedAttribute
import com.regnosys.rosetta.rosetta.simple.Attribute
import com.regnosys.rosetta.rosetta.simple.Data
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.ValidationType
import com.rosetta.model.lib.validation.Validator
import com.rosetta.model.lib.validation.ValidatorWithArg
import java.util.Map
import java.util.Set
import java.util.stream.Collectors
import org.eclipse.xtend2.lib.StringConcatenationClient
import org.eclipse.xtext.generator.IFileSystemAccess2

import static extension com.regnosys.rosetta.generator.util.RosettaAttributeExtensions.*
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.types.RDataType
import com.regnosys.rosetta.types.RosettaTypeProvider
import com.regnosys.rosetta.types.TypeSystem
import com.regnosys.rosetta.types.builtin.RStringType
import com.regnosys.rosetta.types.builtin.RNumberType
import com.regnosys.rosetta.types.builtin.RBuiltinTypeService
import java.util.Optional
import java.util.regex.Pattern
import org.apache.commons.text.StringEscapeUtils
import java.math.BigDecimal
import javax.inject.Inject
import com.regnosys.rosetta.generator.java.types.JavaTypeUtil

class OnlyExistsValidatorGenerator {

@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 t = new RDataType(data)
fsa.generateFile(t.toOnlyExistsValidatorClass.canonicalName.withForwardSlashes + ".java",
generateOnlyExistsValidator(root, data, version))
}


private def generateOnlyExistsValidator(RootPackage root, Data d, String version) {
val scope = new JavaScope(root.existsValidation)
buildClass(root.existsValidation, new RDataType(d).onlyExistsClassBody(version, d.allNonOverridesAttributes), scope)
}

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

/* Casting is required to ensure types are output to ensure recompilation in Rosetta */
@Override
public <T2 extends «t.toJavaType»> «ValidationResult» 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»()))
«ENDFOR»
.build();

// Find the fields that are set
«Set»<String> setFields = fieldExistenceMap.entrySet().stream()
.filter(Map.Entry::getValue)
.map(Map.Entry::getKey)
.collect(«Collectors».toSet());

if (setFields.equals(fields)) {
return «method(ValidationResult, "success")»(path);
}
return «method(ValidationResult, "failure")»(path,
String.format("[%s] should only be set. Set fields: %s", fields, setFields), null);
}
}
'''
}
Loading