1 /*
2 * SPDX-FileCopyrightText: none
3 * SPDX-License-Identifier: CC0-1.0
4 */
5
6 package gov.nist.secauto.metaschema.core.model.constraint;
7
8 import gov.nist.secauto.metaschema.core.datatype.IDataTypeAdapter;
9 import gov.nist.secauto.metaschema.core.metapath.DynamicContext;
10 import gov.nist.secauto.metaschema.core.metapath.MetapathException;
11 import gov.nist.secauto.metaschema.core.metapath.item.ISequence;
12 import gov.nist.secauto.metaschema.core.metapath.item.node.INodeItem;
13
14 import java.util.List;
15 import java.util.regex.Pattern;
16
17 import edu.umd.cs.findbugs.annotations.NonNull;
18
19 /**
20 * Provides a set of callback methods used to process the result of evaluating a
21 * constraint.
22 */
23 public interface IConstraintValidationHandler {
24
25 /**
26 * Handle a cardinality constraint minimum violation.
27 *
28 * @param constraint
29 * the constraint that was evaluated
30 * @param target
31 * the node used as the evaluation focus to determine the items to test
32 * @param testedItems
33 * the items tested
34 * @param dynamicContext
35 * the Metapath dynamic execution context to use for Metapath
36 * evaluation
37 */
38 void handleCardinalityMinimumViolation(
39 @NonNull ICardinalityConstraint constraint,
40 @NonNull INodeItem target,
41 @NonNull ISequence<? extends INodeItem> testedItems,
42 @NonNull DynamicContext dynamicContext);
43
44 /**
45 * Handle a cardinality constraint maximum violation.
46 *
47 * @param constraint
48 * the constraint that was evaluated
49 * @param target
50 * the node used as the evaluation focus to determine the items to test
51 * @param testedItems
52 * the items tested
53 * @param dynamicContext
54 * the Metapath dynamic execution context to use for Metapath
55 * evaluation
56 */
57 void handleCardinalityMaximumViolation(
58 @NonNull ICardinalityConstraint constraint,
59 @NonNull INodeItem target,
60 @NonNull ISequence<? extends INodeItem> testedItems,
61 @NonNull DynamicContext dynamicContext);
62
63 /**
64 * Handle a duplicate index violation.
65 *
66 * @param constraint
67 * the constraint that was evaluated
68 * @param node
69 * the node used as the evaluation focus to determine constraint
70 * targets
71 * @param dynamicContext
72 * the Metapath dynamic execution context to use for Metapath
73 * evaluation
74 */
75 void handleIndexDuplicateViolation(
76 @NonNull IIndexConstraint constraint,
77 @NonNull INodeItem node,
78 @NonNull DynamicContext dynamicContext);
79
80 /**
81 * Handle an index duplicate key violation.
82 * <p>
83 * This happens when two target nodes have the same key.
84 *
85 * @param constraint
86 * the constraint that was evaluated
87 * @param node
88 * the node used as the evaluation focus to determine constraint
89 * targets
90 * @param oldItem
91 * the node that exists in the index for the related key
92 * @param target
93 * the target of evaluation
94 * @param dynamicContext
95 * the Metapath dynamic execution context to use for Metapath
96 * evaluation
97 */
98 void handleIndexDuplicateKeyViolation(
99 @NonNull IIndexConstraint constraint,
100 @NonNull INodeItem node,
101 @NonNull INodeItem oldItem,
102 @NonNull INodeItem target,
103 @NonNull DynamicContext dynamicContext);
104
105 /**
106 * Handle an unique key violation.
107 * <p>
108 * This happens when two target nodes have the same key.
109 *
110 * @param constraint
111 * the constraint that was evaluated
112 * @param node
113 * the node used as the evaluation focus to determine constraint
114 * targets
115 * @param oldItem
116 * the other node with the same key
117 * @param target
118 * the target of evaluation
119 * @param dynamicContext
120 * the Metapath dynamic execution context to use for Metapath
121 * evaluation
122 */
123 void handleUniqueKeyViolation(
124 @NonNull IUniqueConstraint constraint,
125 @NonNull INodeItem node,
126 @NonNull INodeItem oldItem,
127 @NonNull INodeItem target,
128 @NonNull DynamicContext dynamicContext);
129
130 /**
131 * Handle an error that occurred while generating a key.
132 *
133 * @param constraint
134 * the constraint that was evaluated
135 * @param node
136 * the node used as the evaluation focus to determine constraint
137 * targets
138 * @param target
139 * the target of evaluation
140 * @param exception
141 * the resulting Metapath exception
142 * @param dynamicContext
143 * the Metapath dynamic execution context to use for Metapath
144 * evaluation
145 */
146 void handleKeyMatchError(
147 @NonNull IKeyConstraint constraint,
148 @NonNull INodeItem node,
149 @NonNull INodeItem target,
150 @NonNull MetapathException exception,
151 @NonNull DynamicContext dynamicContext);
152
153 /**
154 * Handle a missing index violation.
155 * <p>
156 * This happens when an index-has-key constraint references a missing index.
157 *
158 * @param constraint
159 * the constraint that was evaluated
160 * @param node
161 * the node used as the evaluation focus to determine constraint
162 * targets
163 * @param target
164 * the target of evaluation
165 * @param message
166 * the error message
167 * @param dynamicContext
168 * the Metapath dynamic execution context to use for Metapath
169 * evaluation
170 */
171 void handleMissingIndexViolation(
172 @NonNull IIndexHasKeyConstraint constraint,
173 @NonNull INodeItem node,
174 @NonNull INodeItem target,
175 @NonNull String message,
176 @NonNull DynamicContext dynamicContext);
177
178 /**
179 * Handle an index lookup key miss violation.
180 * <p>
181 * This happens when another node references an expected member of an index that
182 * does not actually exist in the index.
183 *
184 * @param constraint
185 * the constraint that was evaluated
186 * @param node
187 * the node used as the evaluation focus to determine constraint
188 * targets
189 * @param target
190 * the target of evaluation
191 * @param key
192 * the key that was used to lookup the index entry
193 * @param dynamicContext
194 * the Metapath dynamic execution context to use for Metapath
195 * evaluation
196 */
197 void handleIndexMiss(
198 @NonNull IIndexHasKeyConstraint constraint,
199 @NonNull INodeItem node,
200 @NonNull INodeItem target,
201 @NonNull List<String> key,
202 @NonNull DynamicContext dynamicContext);
203
204 /**
205 * Handle a match pattern violation.
206 * <p>
207 * This happens when the target value does not match the specified pattern.
208 *
209 * @param constraint
210 * the constraint that was evaluated
211 * @param node
212 * the node used as the evaluation focus to determine constraint
213 * targets
214 * @param target
215 * the target of evaluation
216 * @param value
217 * the value used for pattern matching
218 * @param pattern
219 * the pattern used for pattern matching
220 * @param dynamicContext
221 * the Metapath dynamic execution context to use for Metapath
222 * evaluation
223 */
224 void handleMatchPatternViolation(
225 @NonNull IMatchesConstraint constraint,
226 @NonNull INodeItem node,
227 @NonNull INodeItem target,
228 @NonNull String value,
229 @NonNull Pattern pattern,
230 @NonNull DynamicContext dynamicContext);
231
232 /**
233 * Handle a match data type violation.
234 * <p>
235 * This happens when the target value does not conform to the specified data
236 * type.
237 *
238 * @param constraint
239 * the constraint that was evaluated
240 * @param node
241 * the node used as the evaluation focus to determine constraint
242 * targets
243 * @param target
244 * the target of evaluation
245 * @param value
246 * the value used for data type matching
247 * @param adapter
248 * the data type used for data type matching
249 * @param cause
250 * the data type exception related to this violation
251 * @param dynamicContext
252 * the Metapath dynamic execution context to use for Metapath
253 * evaluation
254 */
255 void handleMatchDatatypeViolation(
256 @NonNull IMatchesConstraint constraint,
257 @NonNull INodeItem node,
258 @NonNull INodeItem target,
259 @NonNull String value,
260 @NonNull IDataTypeAdapter<?> adapter,
261 @NonNull IllegalArgumentException cause,
262 @NonNull DynamicContext dynamicContext);
263
264 /**
265 * Handle an expect test violation.
266 * <p>
267 * This happens when the test does not evaluate to true.
268 *
269 * @param constraint
270 * the constraint that was evaluated
271 * @param node
272 * the node used as the evaluation focus to determine constraint
273 * targets
274 * @param target
275 * the target of evaluation
276 * @param dynamicContext
277 * the Metapath dynamic execution context to use for Metapath
278 * evaluation
279 */
280 void handleExpectViolation(
281 @NonNull IExpectConstraint constraint,
282 @NonNull INodeItem node,
283 @NonNull INodeItem target,
284 @NonNull DynamicContext dynamicContext);
285
286 /**
287 * Handle an allowed values constraint violation.
288 *
289 * @param failedConstraints
290 * the allowed values constraints that did not match.
291 * @param target
292 * the target of evaluation
293 * @param dynamicContext
294 * the Metapath dynamic execution context to use for Metapath
295 * evaluation
296 */
297 void handleAllowedValuesViolation(
298 @NonNull List<IAllowedValuesConstraint> failedConstraints,
299 @NonNull INodeItem target,
300 @NonNull DynamicContext dynamicContext);
301
302 /**
303 * Handle a constraint that has passed validation.
304 *
305 * @param constraint
306 * the constraint that was evaluated
307 * @param node
308 * the node used as the evaluation focus to determine constraint
309 * targets
310 * @param target
311 * the target of evaluation
312 * @param dynamicContext
313 * the Metapath dynamic execution context to use for Metapath
314 * evaluation
315 */
316 void handlePass(
317 @NonNull IConstraint constraint,
318 @NonNull INodeItem node,
319 @NonNull INodeItem target,
320 @NonNull DynamicContext dynamicContext);
321
322 /**
323 * Handle a constraint that whose evaluation resulted in an unexpected error
324 * during validation.
325 *
326 * @param constraint
327 * the constraint that was evaluated
328 * @param node
329 * the node used as the evaluation focus to determine constraint
330 * targets
331 * @param message
332 * the error message
333 * @param exception
334 * the causing exception
335 * @param dynamicContext
336 * the Metapath dynamic execution context to use for Metapath
337 * evaluation
338 */
339 void handleError(
340 @NonNull IConstraint constraint,
341 @NonNull INodeItem node,
342 @NonNull String message,
343 @NonNull Throwable exception,
344 @NonNull DynamicContext dynamicContext);
345 }