1 /**
2 * Copyright (C) 2014-2015 Philip Helger (www.helger.com)
3 * philip[at]helger[dot]com
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package com.helger.schematron.pure.bound;
18
19 import java.util.List;
20
21 import javax.annotation.Nonnull;
22 import javax.annotation.Nullable;
23
24 import org.oclc.purl.dsdl.svrl.SchematronOutputType;
25 import org.w3c.dom.Node;
26
27 import com.helger.commons.annotation.ReturnsMutableCopy;
28 import com.helger.commons.state.EValidity;
29 import com.helger.commons.xml.namespace.MapBasedNamespaceContext;
30 import com.helger.schematron.CSchematron;
31 import com.helger.schematron.pure.binding.IPSQueryBinding;
32 import com.helger.schematron.pure.model.PSPattern;
33 import com.helger.schematron.pure.model.PSPhase;
34 import com.helger.schematron.pure.model.PSSchema;
35 import com.helger.schematron.pure.validation.IPSValidationHandler;
36 import com.helger.schematron.pure.validation.SchematronValidationException;
37
38 /**
39 * Base interface for a bound schema. A bound schema is a {@link PSSchema} with
40 * a specific
41 *
42 * @author Philip Helger
43 */
44 public interface IPSBoundSchema
45 {
46 /**
47 * @return The query binding that was used to create this bound schema.
48 */
49 @Nonnull
50 IPSQueryBinding getQueryBinding ();
51
52 /**
53 * @return The original schema used to bind. Never <code>null</code>.
54 */
55 @Nonnull
56 PSSchema getOriginalSchema ();
57
58 /**
59 * @return The namespace context as defined by the namespaces in the original
60 * schema. Never <code>null</code>.
61 */
62 @Nonnull
63 MapBasedNamespaceContext getNamespaceContext ();
64
65 /**
66 * @return Get the phase ID used. If none was specified, the schema
67 * defaultPhase is used. If this is not present, than all patterns are
68 * used and ID of the phase is {@link CSchematron#PHASE_ALL}.
69 */
70 @Nonnull
71 String getPhaseID ();
72
73 /**
74 * @return The phase object to be evaluated. May be <code>null</code> if no
75 * specific phase is to be validated!
76 */
77 @Nullable
78 PSPhase getPhase ();
79
80 /**
81 * @return <code>true</code> if a special phase was specified,
82 * <code>false</code> if not.
83 */
84 boolean isPhaseSpecified ();
85
86 /**
87 * @return A list of all patterns to be validated. If a phase was selected,
88 * only the patterns matching the selected phase are contained. Never
89 * <code>null</code>.
90 */
91 @Nonnull
92 @ReturnsMutableCopy
93 List <PSPattern> getAllRelevantPatterns ();
94
95 /**
96 * Get the validation context to be used. As rules can be stated as "element"
97 * they are not necessarily present on root level. For XPath this may e.g. be
98 * resolved by prepending "//" so that all elements are resolved correctly.
99 *
100 * @param sRuleContext
101 * The original rule context. May not be <code>null</code>.
102 * @return The real validation context to use.
103 */
104 @Nonnull
105 String getValidationContext (@Nonnull String sRuleContext);
106
107 /**
108 * The generic validation method. It validates the passed XML node to this
109 * bound schema.
110 *
111 * @param aNode
112 * The node to be validated. May not be <code>null</code>.
113 * @param aHandler
114 * The validation handler that receives the callback informations. May
115 * not be <code>null</code>.
116 * @throws SchematronValidationException
117 * In case a validation exception occurs
118 */
119 void validate (@Nonnull Node aNode, @Nonnull IPSValidationHandler aHandler) throws SchematronValidationException;
120
121 /**
122 * Special validation that breaks on the first error. This is a specialized
123 * call of {@link #validate(Node, IPSValidationHandler)}.
124 *
125 * @param aNode
126 * The XML node to be validated. May not be <code>null</code>.
127 * @return {@link EValidity#VALID} if the document is valid,
128 * {@link EValidity#INVALID} if it is invalid.
129 * @throws SchematronValidationException
130 * In case a validation exception occurs
131 */
132 @Nonnull
133 EValidity validatePartially (@Nonnull Node aNode) throws SchematronValidationException;
134
135 /**
136 * Special validation that creates an SVRL document. This is a specialized
137 * call of {@link #validate(Node, IPSValidationHandler)}.
138 *
139 * @param aNode
140 * The XML node to be validated. May not be <code>null</code>.
141 * @return The SVRL domain object.
142 * @throws SchematronValidationException
143 * In case a validation exception occurs
144 */
145 @Nonnull
146 SchematronOutputType validateComplete (@Nonnull Node aNode) throws SchematronValidationException;
147 }