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