@@ -18,31 +18,36 @@ Metaschema constraints provide validation beyond schema compliance:
1818### Validate During Deserialization
1919
2020```java
21+ import dev.metaschema.databind.io.DeserializationFeature;
22+ import dev.metaschema.databind.io.IBoundLoader;
2123import dev.metaschema.oscal.lib.OscalBindingContext;
2224import dev.metaschema.oscal.lib.model.Catalog;
23- import dev.metaschema.databind.io.Format;
24- import dev.metaschema.databind.io.IDeserializer;
25- import dev.metaschema.core.model.constraint.IConstraintValidationHandler;
26- import dev.metaschema.core.model.validation.IValidationResult;
25+
26+ import java.nio.file.Path;
2727
2828OscalBindingContext context = OscalBindingContext.instance();
29- IDeserializer<Catalog> deserializer = context.newDeserializer(
30- Format.JSON, Catalog.class);
29+ IBoundLoader loader = context.newBoundLoader();
3130
32- // Enable constraint validation
33- deserializer.setConstraintValidationEnabled(true );
31+ // Enable constraint validation during loading
32+ loader.enableFeature(DeserializationFeature.DESERIALIZE_VALIDATE_CONSTRAINTS );
3433
35- Catalog catalog = deserializer.deserialize( Path.of("catalog.json"));
34+ Catalog catalog = loader.load(Catalog.class, Path.of("catalog.json"));
3635```
3736
3837### Validate Existing Objects
3938
4039```java
41- import dev.metaschema.databind.model.IBoundObject;
4240import dev.metaschema.core.model.validation.IValidationResult;
41+ import dev.metaschema.oscal.lib.OscalBindingContext;
42+
43+ import java.net.URI;
44+ import java.nio.file.Path;
45+
46+ OscalBindingContext context = OscalBindingContext.instance();
47+ URI target = Path.of("catalog.json").toUri();
4348
44- // Validate an already-loaded object
45- IValidationResult result = context.validate(catalog );
49+ // Validate against constraints
50+ IValidationResult result = context.validateWithConstraints(target, null );
4651
4752if (!result.isPassing()) {
4853 result.getFindings().forEach(finding -> {
@@ -55,10 +60,18 @@ if (!result.isPassing()) {
5560## Working with Validation Results
5661
5762```java
63+ import dev.metaschema.core.model.constraint.IConstraint.Level;
5864import dev.metaschema.core.model.validation.IValidationFinding;
5965import dev.metaschema.core.model.validation.IValidationResult;
66+ import dev.metaschema.oscal.lib.OscalBindingContext;
67+
68+ import java.net.URI;
69+ import java.nio.file.Path;
6070
61- IValidationResult result = context.validate(catalog);
71+ OscalBindingContext context = OscalBindingContext.instance();
72+ URI target = Path.of("catalog.json").toUri();
73+
74+ IValidationResult result = context.validateWithConstraints(target, null);
6275
6376// Check if validation passed
6477if (result.isPassing()) {
@@ -85,34 +98,30 @@ for (IValidationFinding finding : result.getFindings()) {
8598| `WARNING` | Potential issue, may be intentional |
8699| `INFORMATIONAL` | Note for awareness |
87100
88- ## Custom Validation Handler
101+ ## Using FindingCollectingConstraintValidationHandler
89102
90- ```java
91- import dev.metaschema.core.model.constraint.IConstraintValidationHandler;
92- import dev.metaschema.core.model.constraint.IFinding;
103+ The framework provides `FindingCollectingConstraintValidationHandler` for collecting validation findings:
93104
94- public class CustomValidationHandler implements IConstraintValidationHandler {
95-
96- private final List<IFinding> findings = new ArrayList<>();
97-
98- @Override
99- public void handleFinding(IFinding finding) {
100- findings.add(finding);
105+ ```java
106+ import dev.metaschema.core.model.constraint.FindingCollectingConstraintValidationHandler;
107+ import dev.metaschema.core.model.constraint.IConstraint.Level;
101108
102- // Log immediately
103- if (finding.getSeverity().ordinal() >= Severity.ERROR.ordinal()) {
104- System.err.println("Validation error: " + finding.getMessage());
105- }
106- }
109+ // The handler implements IValidationResult
110+ FindingCollectingConstraintValidationHandler handler =
111+ new FindingCollectingConstraintValidationHandler();
107112
108- public List<IFinding> getFindings() {
109- return findings;
110- }
113+ // After validation completes, check results
114+ if (!handler.isPassing()) {
115+ handler.getFindings().forEach(finding -> {
116+ System.err.println(finding.getSeverity() + ": " +
117+ finding.getMessage());
118+ });
119+ }
111120
112- public boolean hasErrors() {
113- return findings.stream()
114- .anyMatch(f -> f.getSeverity(). ordinal() >= Severity .ERROR.ordinal());
115- }
121+ // Check highest severity level
122+ Level highestSeverity = handler.getHighestSeverity();
123+ if (highestSeverity. ordinal() >= Level .ERROR.ordinal()) {
124+ System.err.println("Validation failed with errors");
116125}
117126```
118127
0 commit comments