001    package org.relaxng.datatype;
002    
003    /**
004     * Datatype object.
005     * 
006     * This object has the following functionality:
007     * 
008     * <ol>
009     *  <li> functionality to identify a class of character sequences. This is
010     *       done through the isValid method.
011     * 
012     *  <li> functionality to produce a "value object" from a character sequence and
013     *               context information.
014     * 
015     *  <li> functionality to test the equality of two value objects.
016     * </ol>
017     * 
018     * This interface also defines the createStreamingValidator method,
019     * which is intended to efficiently support the validation of
020     * large character sequences.
021     * 
022     * @author <a href="mailto:jjc@jclark.com">James Clark</a>
023     * @author <a href="mailto:kohsuke.kawaguchi@sun.com">Kohsuke KAWAGUCHI</a>
024     */
025    public interface Datatype {
026            
027            /**
028             * Checks if the specified 'literal' matches this Datatype
029             * with respect to the current context.
030             * 
031             * @param literal
032             *              the lexical representation to be checked.
033             * @param context
034             *              If this datatype is context-dependent
035             *              (i.e. the {@link #isContextDependent} method returns true),
036             *              then the caller must provide a non-null valid context object.
037             *              Otherwise, the caller can pass null.
038             * 
039             * @return
040             *              true if the 'literal' is a member of this Datatype;
041             *              false if it's not a member of this Datatype.
042             */
043            boolean isValid( String literal, ValidationContext context );
044            
045            /**
046             * Similar to the isValid method but throws an exception with diagnosis
047             * in case of errors.
048             * 
049             * <p>
050             * If the specified 'literal' is a valid lexical representation for this
051             * datatype, then this method must return without throwing any exception.
052             * If not, the callee must throw an exception (with diagnosis message,
053             * if possible.)
054             * 
055             * <p>
056             * The application can use this method to provide detailed error message
057             * to users. This method is kept separate from the isValid method to
058             * achieve higher performance during normal validation.
059             * 
060             * @exception DatatypeException
061             *              If the given literal is invalid, then this exception is thrown.
062             *              If the callee supports error diagnosis, then the exception should
063             *              contain a diagnosis message.
064             */
065            void checkValid( String literal, ValidationContext context )
066                    throws DatatypeException;
067            
068            /**
069             * Creates an instance of a streaming validator for this type.
070             * 
071             * <p>
072             * By using streaming validators instead of the isValid method,
073             * the caller can avoid keeping the entire string, which is
074             * sometimes quite big, in memory.
075             * 
076             * @param context
077             *              If this datatype is context-dependent
078             *              (i.e. the {@link #isContextDependent} method returns true),
079             *              then the caller must provide a non-null valid context object.
080             *              Otherwise, the caller can pass null.
081             *              The callee may keep a reference to this context object
082             *              only while the returned streaming validator is being used.
083             */
084            DatatypeStreamingValidator createStreamingValidator( ValidationContext context );
085            
086            /**
087             * Converts lexcial value and the current context to the corresponding
088             * value object.
089             * 
090             * <p>
091             * The caller cannot generally assume that the value object is
092             * a meaningful Java object. For example, the caller cannot expect
093             * this method to return <code>java.lang.Number</code> type for
094             * the "integer" type of XML Schema Part 2.
095             * 
096             * <p>
097             * Also, the caller cannot assume that the equals method and
098             * the hashCode method of the value object are consistent with
099             * the semantics of the datatype. For that purpose, the sameValue
100             * method and the valueHashCode method have to be used. Note that
101             * this means you cannot use classes like
102             * <code>java.util.Hashtable</code> to store the value objects.
103             * 
104             * <p>
105             * The returned value object should be used solely for the sameValue
106             * and valueHashCode methods.
107             * 
108             * @param context
109             *              If this datatype is context-dependent
110             *              (when the {@link #isContextDependent} method returns true),
111             *              then the caller must provide a non-null valid context object.
112             *              Otherwise, the caller can pass null.
113             * 
114             * @return      null
115             *              when the given lexical value is not a valid lexical
116             *              value for this type.
117             */
118            Object createValue( String literal, ValidationContext context );
119            
120            /**
121             * Tests the equality of two value objects which were originally
122             * created by the createValue method of this object.
123             * 
124             * The behavior is undefined if objects not created by this type
125             * are passed. It is the caller's responsibility to ensure that
126             * value objects belong to this type.
127             * 
128             * @return
129             *              true if two value objects are considered equal according to
130             *              the definition of this datatype; false if otherwise.
131             */
132            boolean sameValue( Object value1, Object value2 );
133            
134            
135            /**
136             * Computes the hash code for a value object,
137             * which is consistent with the sameValue method.
138             * 
139             * @return
140             *              hash code for the specified value object.
141             */
142            int valueHashCode( Object value );
143    
144    
145    
146            
147            /**
148             * Indicates that the datatype doesn't have ID/IDREF semantics.
149             * 
150             * This value is one of the possible return values of the
151             * {@link #getIdType} method.
152             */
153            public static final int ID_TYPE_NULL = 0;
154            
155            /**
156             * Indicates that RELAX NG compatibility processors should
157             * treat this datatype as having ID semantics.
158             * 
159             * This value is one of the possible return values of the
160             * {@link #getIdType} method.
161             */
162            public static final int ID_TYPE_ID = 1;
163            
164            /**
165             * Indicates that RELAX NG compatibility processors should
166             * treat this datatype as having IDREF semantics.
167             * 
168             * This value is one of the possible return values of the
169             * {@link #getIdType} method.
170             */
171            public static final int ID_TYPE_IDREF = 2;
172            
173            /**
174             * Indicates that RELAX NG compatibility processors should
175             * treat this datatype as having IDREFS semantics.
176             * 
177             * This value is one of the possible return values of the
178             * {@link #getIdType} method.
179             */
180            public static final int ID_TYPE_IDREFS = 3;
181            
182            /**
183             * Checks if the ID/IDREF semantics is associated with this
184             * datatype.
185             * 
186             * <p>
187             * This method is introduced to support the RELAX NG DTD
188             * compatibility spec. (Of course it's always free to use
189             * this method for other purposes.)
190             * 
191             * <p>
192             * If you are implementing a datatype library and have no idea about
193             * the "RELAX NG DTD compatibility" thing, just return
194             * <code>ID_TYPE_NULL</code> is fine.
195             * 
196             * @return
197             *              If this datatype doesn't have any ID/IDREF semantics,
198             *              it returns {@link #ID_TYPE_NULL}. If it has such a semantics
199             *              (for example, XSD:ID, XSD:IDREF and comp:ID type), then
200             *              it returns {@link #ID_TYPE_ID}, {@link #ID_TYPE_IDREF} or
201             *              {@link #ID_TYPE_IDREFS}.
202             */
203            public int getIdType();
204            
205            
206            /**
207             * Checks if this datatype may need a context object for
208             * the validation.
209             * 
210             * <p>
211             * The callee must return true even when the context
212             * is not always necessary. (For example, the "QName" type
213             * doesn't need a context object when validating unprefixed
214             * string. But nonetheless QName must return true.)
215             * 
216             * <p>
217             * XSD's <code>string</code> and <code>short</code> types
218             * are examples of context-independent datatypes.
219             * Its <code>QName</code> and <code>ENTITY</code> types
220             * are examples of context-dependent datatypes.
221             * 
222             * <p>
223             * When a datatype is context-independent, then
224             * the {@link #isValid} method, the {@link #checkValid} method,
225             * the {@link #createStreamingValidator} method and
226             * the {@link #createValue} method can be called without
227             * providing a context object.
228             * 
229             * @return
230             *              <b>true</b> if this datatype is context-dependent
231             *              (it needs a context object sometimes);
232             * 
233             *              <b>false</b> if this datatype is context-<b>in</b>dependent
234             *              (it never needs a context object).
235             */
236            public boolean isContextDependent();
237    }