这是indexloc提供的服务,不要输入任何密码
Skip to content

Type format validators and cardinality validators should be injected #927

@SimonCockx

Description

@SimonCockx

Right now, the type format validator and the cardinality validator of a class are instantiated directly by the corresponding Meta class of a pojo. This results in less configurable generated code (e.g., consumers cannot override the behaviour of some validators) and makes it hard to implement future enhancements which may require dependency injection such as supporting conditions on type aliases. (see #879)

I would propose to inject them in the same way as we currently inject conditions, i.e., using a ValidatorFactory argument.

Below is an example from the CDM.

Current meta code for type BondReference:

@RosettaMeta(model=BondReference.class)
public class BondReferenceMeta implements RosettaMetaData<BondReference> {

	@Override
	public List<Validator<? super BondReference>> dataRules(ValidatorFactory factory) {
		return Arrays.asList(
			factory.<cdm.product.asset.BondReference>create(cdm.product.asset.validation.datarule.BondReferenceBondUnderlier.class)
		);
	}
	
	...

	@Override
	public Validator<? super BondReference> validator() {
		return new BondReferenceValidator();
	}

	@Override
	public Validator<? super BondReference> typeFormatValidator() {
		return new BondReferenceTypeFormatValidator();
	}

        ...
}

This would change to:

@RosettaMeta(model=BondReference.class)
public class BondReferenceMeta implements RosettaMetaData<BondReference> {

	@Override
	public List<Validator<? super BondReference>> dataRules(ValidatorFactory factory) {
		return Arrays.asList(
			factory.<BondReference>create(BondReferenceBondUnderlier.class)
		);
	}
	
	...

	@Override
	public Validator<? super BondReference> validator(ValidatorFactory factory) {
		return factory.<BondReference>create(BondReferenceValidator.class);
	}

	@Override
	public Validator<? super BondReference> typeFormatValidator(ValidatorFactory factory) {
		return factory.<BondReference>create(BondReferenceTypeFormatValidator.class);
	}

        // For backwards compatibility
	@Deprecated
	@Override
	public Validator<? super BondReference> validator() {
		return new BondReferenceValidator();
	}

	@Deprecated
	@Override
	public Validator<? super BondReference> typeFormatValidator() {
		return new BondReferenceTypeFormatValidator();
	}

        ...
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    Status

    Closed

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions