1 /* 2 * Copyright (c) 2005, 2015, Thai Open Source Software Center Ltd 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: 8 * 9 * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in 14 * the documentation and/or other materials provided with the 15 * distribution. 16 * 17 * Neither the name of the Thai Open Source Software Center Ltd nor 18 * the names of its contributors may be used to endorse or promote 19 * products derived from this software without specific prior written 20 * permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR 26 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 27 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 28 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 29 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 30 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 31 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 */ 34 35 package com.sun.xml.internal.org.relaxng.datatype; 36 37 /** 38 * Datatype object. 39 * 40 * This object has the following functionality: 41 * 42 * <ol> 43 * <li> functionality to identify a class of character sequences. This is 44 * done through the isValid method. 45 * 46 * <li> functionality to produce a "value object" from a character sequence and 47 * context information. 48 * 49 * <li> functionality to test the equality of two value objects. 50 * </ol> 51 * 52 * This interface also defines the createStreamingValidator method, 53 * which is intended to efficiently support the validation of 54 * large character sequences. 55 * 56 * @author <a href="mailto:jjc@jclark.com">James Clark</a> 57 * @author <a href="mailto:kohsuke.kawaguchi@sun.com">Kohsuke KAWAGUCHI</a> 58 */ 59 public interface Datatype { 60 61 /** 62 * Checks if the specified 'literal' matches this Datatype 63 * with respect to the current context. 64 * 65 * @param literal 66 * the lexical representation to be checked. 67 * @param context 68 * If this datatype is context-dependent 69 * (i.e. the {@link #isContextDependent} method returns true), 70 * then the caller must provide a non-null valid context object. 71 * Otherwise, the caller can pass null. 72 * 73 * @return 74 * true if the 'literal' is a member of this Datatype; 75 * false if it's not a member of this Datatype. 76 */ 77 boolean isValid( String literal, ValidationContext context ); 78 79 /** 80 * Similar to the isValid method but throws an exception with diagnosis 81 * in case of errors. 82 * 83 * <p> 84 * If the specified 'literal' is a valid lexical representation for this 85 * datatype, then this method must return without throwing any exception. 86 * If not, the callee must throw an exception (with diagnosis message, 87 * if possible.) 88 * 89 * <p> 90 * The application can use this method to provide detailed error message 91 * to users. This method is kept separate from the isValid method to 92 * achieve higher performance during normal validation. 93 * 94 * @exception DatatypeException 95 * If the given literal is invalid, then this exception is thrown. 96 * If the callee supports error diagnosis, then the exception should 97 * contain a diagnosis message. 98 */ 99 void checkValid( String literal, ValidationContext context ) 100 throws DatatypeException; 101 102 /** 103 * Creates an instance of a streaming validator for this type. 104 * 105 * <p> 106 * By using streaming validators instead of the isValid method, 107 * the caller can avoid keeping the entire string, which is 108 * sometimes quite big, in memory. 109 * 110 * @param context 111 * If this datatype is context-dependent 112 * (i.e. the {@link #isContextDependent} method returns true), 113 * then the caller must provide a non-null valid context object. 114 * Otherwise, the caller can pass null. 115 * The callee may keep a reference to this context object 116 * only while the returned streaming validator is being used. 117 */ 118 DatatypeStreamingValidator createStreamingValidator( ValidationContext context ); 119 120 /** 121 * Converts lexcial value and the current context to the corresponding 122 * value object. 123 * 124 * <p> 125 * The caller cannot generally assume that the value object is 126 * a meaningful Java object. For example, the caller cannot expect 127 * this method to return <code>java.lang.Number</code> type for 128 * the "integer" type of XML Schema Part 2. 129 * 130 * <p> 131 * Also, the caller cannot assume that the equals method and 132 * the hashCode method of the value object are consistent with 133 * the semantics of the datatype. For that purpose, the sameValue 134 * method and the valueHashCode method have to be used. Note that 135 * this means you cannot use classes like 136 * <code>java.util.Hashtable</code> to store the value objects. 137 * 138 * <p> 139 * The returned value object should be used solely for the sameValue 140 * and valueHashCode methods. 141 * 142 * @param context 143 * If this datatype is context-dependent 144 * (when the {@link #isContextDependent} method returns true), 145 * then the caller must provide a non-null valid context object. 146 * Otherwise, the caller can pass null. 147 * 148 * @return null 149 * when the given lexical value is not a valid lexical 150 * value for this type. 151 */ 152 Object createValue( String literal, ValidationContext context ); 153 154 /** 155 * Tests the equality of two value objects which were originally 156 * created by the createValue method of this object. 157 * 158 * The behavior is undefined if objects not created by this type 159 * are passed. It is the caller's responsibility to ensure that 160 * value objects belong to this type. 161 * 162 * @return 163 * true if two value objects are considered equal according to 164 * the definition of this datatype; false if otherwise. 165 */ 166 boolean sameValue( Object value1, Object value2 ); 167 168 169 /** 170 * Computes the hash code for a value object, 171 * which is consistent with the sameValue method. 172 * 173 * @return 174 * hash code for the specified value object. 175 */ 176 int valueHashCode( Object value ); 177 178 179 180 181 /** 182 * Indicates that the datatype doesn't have ID/IDREF semantics. 183 * 184 * This value is one of the possible return values of the 185 * {@link #getIdType} method. 186 */ 187 public static final int ID_TYPE_NULL = 0; 188 189 /** 190 * Indicates that RELAX NG compatibility processors should 191 * treat this datatype as having ID semantics. 192 * 193 * This value is one of the possible return values of the 194 * {@link #getIdType} method. 195 */ 196 public static final int ID_TYPE_ID = 1; 197 198 /** 199 * Indicates that RELAX NG compatibility processors should 200 * treat this datatype as having IDREF semantics. 201 * 202 * This value is one of the possible return values of the 203 * {@link #getIdType} method. 204 */ 205 public static final int ID_TYPE_IDREF = 2; 206 207 /** 208 * Indicates that RELAX NG compatibility processors should 209 * treat this datatype as having IDREFS semantics. 210 * 211 * This value is one of the possible return values of the 212 * {@link #getIdType} method. 213 */ 214 public static final int ID_TYPE_IDREFS = 3; 215 216 /** 217 * Checks if the ID/IDREF semantics is associated with this 218 * datatype. 219 * 220 * <p> 221 * This method is introduced to support the RELAX NG DTD 222 * compatibility spec. (Of course it's always free to use 223 * this method for other purposes.) 224 * 225 * <p> 226 * If you are implementing a datatype library and have no idea about 227 * the "RELAX NG DTD compatibility" thing, just return 228 * <code>ID_TYPE_NULL</code> is fine. 229 * 230 * @return 231 * If this datatype doesn't have any ID/IDREF semantics, 232 * it returns {@link #ID_TYPE_NULL}. If it has such a semantics 233 * (for example, XSD:ID, XSD:IDREF and comp:ID type), then 234 * it returns {@link #ID_TYPE_ID}, {@link #ID_TYPE_IDREF} or 235 * {@link #ID_TYPE_IDREFS}. 236 */ 237 public int getIdType(); 238 239 240 /** 241 * Checks if this datatype may need a context object for 242 * the validation. 243 * 244 * <p> 245 * The callee must return true even when the context 246 * is not always necessary. (For example, the "QName" type 247 * doesn't need a context object when validating unprefixed 248 * string. But nonetheless QName must return true.) 249 * 250 * <p> 251 * XSD's <code>string</code> and <code>short</code> types 252 * are examples of context-independent datatypes. 253 * Its <code>QName</code> and <code>ENTITY</code> types 254 * are examples of context-dependent datatypes. 255 * 256 * <p> 257 * When a datatype is context-independent, then 258 * the {@link #isValid} method, the {@link #checkValid} method, 259 * the {@link #createStreamingValidator} method and 260 * the {@link #createValue} method can be called without 261 * providing a context object. 262 * 263 * @return 264 * <b>true</b> if this datatype is context-dependent 265 * (it needs a context object sometimes); 266 * 267 * <b>false</b> if this datatype is context-<b>in</b>dependent 268 * (it never needs a context object). 269 */ 270 public boolean isContextDependent(); 271 }