Custom Restrictions
Custom Restrictions are restrictions that allow you to implement the business rules yourself in a validator class.
<simpleValueType name="Iban">
<restrictions>
<restriction name="IbanValidation" type="elements::CustomRestriction">
<validators>
<customRestrictionValidator>
<technology name="JDK"/>
<implementation>net.democritus.types.IbanValidator</implementation>
</customRestrictionValidator>
</validators>
</restriction>
</restrictions>
</simpleValueType>
Each CustomRestriction adds one or more validators, each of which is linked to the underlying technology.
Currently, JDK and EJB3 are supported.
JDK: The validator will be added to the SharedValidator class and can only access Java standard libraries.EJB3: The validator will be added to the ValidatorBean and has access to ejb-related classes.
Validator Class
The validator has to implement net.democritus.common.validation.Validator.
This is an interface that requires 2 methods:
setTopic(ValidationTopic)is used to pass down information surrounding the fieldFieldA property of a DataElement expanded to a database column and user interface input element..validate(T, ValidationReport)is called to validate the value of the fieldFieldA property of a DataElement expanded to a database column and user interface input element..
The validate method can add messages to the ValidationReport to describe issues.
public void validate(String iban, ValidationReport report) {
if (iban == null || iban.isEmpty()) return;
try {
IbanUtil.validate(iban.replace(" ", ""), IbanFormat.None);
} catch (IbanFormatException | InvalidCheckDigitException | UnsupportedCountryException e) {
ValidationMessage message = topic.message(e.getMessage());
report.addValidationError(message);
}
}
The messages created with the ValidationTopic already contain a translation key and standard message.
You can attach additional information by defining properties.
If the message contains a placeholder (e.g. ${foo}), this will be replaced with the provided value.
ValidationMessage message = topic.message(e.getMessage())
.property("foo", "bar");
Topics are defined in the Validator classes. They contain a translation key for the control layerLayerLogical separation of functionality within a single system/application, focused on code organization., a reference to the fieldFieldA property of a DataElement expanded to a database column and user interface input element. and readable error message for tracing.
private final ValidationTopic nameStringLength = new ValidationTopic("space::Starship::name", "space.starship.name.stringLength", "This string should have a length shorter than ${maximum}.");
Custom Translation
Custom translations are expanded with a generic error message.
But it is possible to provide your own translations by adding options <restriction.translation.{LANG}>:
<restriction name="IbanValidation" type="elements::CustomRestriction">
<validators/>
<options>
<restriction.translation.nl>
De ingevoerde IBAN waarde is niet correct. Gelieve de waarde na te kijken.
</restriction.translation.nl>
<restriction.translation.en>
The entered IBAN number is invalid. Please check the number and try again.
</restriction.translation.en>
</options>
</restriction>