View Javadoc
1   /**
2    * Copyright (C) 2014-2017 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.validation;
18  
19  import javax.annotation.Nonnull;
20  import javax.annotation.Nullable;
21  
22  import org.w3c.dom.Node;
23  
24  import com.helger.commons.state.EContinue;
25  import com.helger.schematron.pure.model.PSAssertReport;
26  import com.helger.schematron.pure.model.PSPattern;
27  import com.helger.schematron.pure.model.PSPhase;
28  import com.helger.schematron.pure.model.PSRule;
29  import com.helger.schematron.pure.model.PSSchema;
30  
31  /**
32   * Base interface for a Schematron validation callback handler. It is only
33   * invoked when validating an XML against a Schematron file.
34   *
35   * @see com.helger.schematron.pure.bound.IPSBoundSchema#validate(Node,
36   *      IPSValidationHandler)
37   * @author Philip Helger
38   */
39  public interface IPSValidationHandler
40  {
41    /**
42     * This is the first method called.
43     *
44     * @param aSchema
45     *        The Schematron to be validated. Never <code>null</code>.
46     * @param aActivePhase
47     *        The selected phase, if any special phase was selected. May be
48     *        <code>null</code>.
49     * @see #onEnd(PSSchema, PSPhase)
50     * @throws SchematronValidationException
51     *         In case of validation errors
52     */
53    void onStart (@Nonnull PSSchema aSchema, @Nullable PSPhase aActivePhase) throws SchematronValidationException;
54  
55    /**
56     * This method is called for every pattern inside the schema.
57     *
58     * @param aPattern
59     *        The current pattern. Never <code>null</code>.
60     * @throws SchematronValidationException
61     *         In case of validation errors
62     */
63    void onPattern (@Nonnull PSPattern aPattern) throws SchematronValidationException;
64  
65    /**
66     * This method is called for every rule inside the current pattern.
67     *
68     * @param aRule
69     *        The current rule. Never <code>null</code>.
70     * @param sContext
71     *        The real context to be used in validation. May differ from the
72     *        result of {@link PSRule#getContext()} because of replaced variables
73     *        from &lt;let&gt; elements.
74     * @throws SchematronValidationException
75     *         In case of validation errors
76     */
77    void onRule (@Nonnull PSRule aRule, @Nonnull String sContext) throws SchematronValidationException;
78  
79    /**
80     * This method is called for every failed assert.
81     *
82     * @param aAssertReport
83     *        The current assert element. Never <code>null</code>.
84     * @param sTestExpression
85     *        The source XPath expression that was evaluated for this node. It may
86     *        be different from the test expression contained in the passed
87     *        assert/report element because of replaced &lt;let&gt; elements.
88     *        Never <code>null</code>.
89     * @param aRuleMatchingNode
90     *        The XML node of the document to be validated.
91     * @param nNodeIndex
92     *        The index of the matched node, relative to the current rule.
93     * @param aContext
94     *        A context object - implementation dependent. For the default query
95     *        binding this is e.g. an
96     *        {@link com.helger.schematron.pure.bound.xpath.PSXPathBoundAssertReport}
97     *        object.
98     * @return {@link EContinue#BREAK} to stop validating immediately.
99     * @throws SchematronValidationException
100    *         In case of validation errors
101    */
102   @Nonnull
103   EContinue onFailedAssert (@Nonnull PSAssertReport aAssertReport,
104                             @Nonnull String sTestExpression,
105                             @Nonnull Node aRuleMatchingNode,
106                             int nNodeIndex,
107                             @Nullable Object aContext) throws SchematronValidationException;
108 
109   /**
110    * This method is called for every failed assert.
111    *
112    * @param aAssertReport
113    *        The current assert element. Never <code>null</code>.
114    * @param sTestExpression
115    *        The source XPath expression that was evaluated for this node. It may
116    *        be different from the test expression contained in the passed
117    *        assert/report element because of replaced &lt;let&gt; elements.
118    *        Never <code>null</code>.
119    * @param aRuleMatchingNode
120    *        The XML node of the document to be validated.
121    * @param nNodeIndex
122    *        The index of the matched node, relative to the current rule.
123    * @param aContext
124    *        A context object - implementation dependent. For the default query
125    *        binding this is e.g. an
126    *        {@link com.helger.schematron.pure.bound.xpath.PSXPathBoundAssertReport}
127    *        object.
128    * @return {@link EContinue#BREAK} to stop validating immediately.
129    * @throws SchematronValidationException
130    *         In case of validation errors
131    */
132   @Nonnull
133   EContinue onSuccessfulReport (@Nonnull PSAssertReport aAssertReport,
134                                 @Nonnull String sTestExpression,
135                                 @Nonnull Node aRuleMatchingNode,
136                                 int nNodeIndex,
137                                 @Nullable Object aContext) throws SchematronValidationException;
138 
139   /**
140    * This is the last method called. It indicates that the validation for the
141    * current scheme ended.
142    *
143    * @param aSchema
144    *        The Schematron that was be validated. Never <code>null</code>.
145    * @param aActivePhase
146    *        The selected phase, if any special phase was selected. May be
147    *        <code>null</code>.
148    * @see #onStart(PSSchema, PSPhase)
149    * @throws SchematronValidationException
150    *         In case of validation errors
151    */
152   void onEnd (@Nonnull PSSchema aSchema, @Nullable PSPhase aActivePhase) throws SchematronValidationException;
153 }