com.thaiopensource.datatype.xsd
Class DatatypeBase

java.lang.Object
  extended by com.thaiopensource.datatype.xsd.DatatypeBase
All Implemented Interfaces:
Datatype2, Datatype
Direct Known Subclasses:
BinaryDatatype, BooleanDatatype, DecimalDatatype, DoubleDatatype, ListDatatype, QNameDatatype, RestrictDatatype, TokenDatatype

abstract class DatatypeBase
extends Object
implements Datatype2


Field Summary
(package private) static int WHITE_SPACE_COLLAPSE
           
(package private) static int WHITE_SPACE_PRESERVE
           
(package private) static int WHITE_SPACE_REPLACE
           
private  int whiteSpace
           
 
Fields inherited from interface org.relaxng.datatype.Datatype
ID_TYPE_ID, ID_TYPE_IDREF, ID_TYPE_IDREFS, ID_TYPE_NULL
 
Constructor Summary
DatatypeBase()
           
DatatypeBase(int whiteSpace)
           
 
Method Summary
(package private)  boolean allowsValue(String str, ValidationContext vc)
           
 boolean alwaysValid()
           
 void checkValid(String str, ValidationContext vc)
          Similar to the isValid method but throws an exception with diagnosis in case of errors.
private static int collapseStart(String s)
           
private static String collapseWhiteSpace(String s)
           
 DatatypeStreamingValidator createStreamingValidator(ValidationContext vc)
          Creates an instance of a streaming validator for this type.
 Object createValue(String str, ValidationContext vc)
          Converts lexcial value and the current context to the corresponding value object.
 int getIdType()
          Checks if the ID/IDREF semantics is associated with this datatype.
(package private)  Measure getMeasure()
           
(package private)  OrderRelation getOrderRelation()
           
(package private)  DatatypeBase getPrimitive()
           
(package private) abstract  Object getValue(String str, ValidationContext vc)
           
(package private)  int getWhiteSpace()
           
 boolean isContextDependent()
          Checks if this datatype may need a context object for the validation.
 boolean isValid(String str, ValidationContext vc)
          Checks if the specified 'literal' matches this Datatype with respect to the current context.
(package private) abstract  boolean lexicallyAllows(String str)
           
(package private)  String normalizeWhiteSpace(String str)
           
private static String replaceWhiteSpace(String s)
           
 boolean sameValue(Object value1, Object value2)
          Tests the equality of two value objects which were originally created by the createValue method of this object.
 int valueHashCode(Object value)
          Computes the hash code for a value object, which is consistent with the sameValue method.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

whiteSpace

private final int whiteSpace

WHITE_SPACE_PRESERVE

static final int WHITE_SPACE_PRESERVE
See Also:
Constant Field Values

WHITE_SPACE_REPLACE

static final int WHITE_SPACE_REPLACE
See Also:
Constant Field Values

WHITE_SPACE_COLLAPSE

static final int WHITE_SPACE_COLLAPSE
See Also:
Constant Field Values
Constructor Detail

DatatypeBase

DatatypeBase()

DatatypeBase

DatatypeBase(int whiteSpace)
Method Detail

lexicallyAllows

abstract boolean lexicallyAllows(String str)

getWhiteSpace

int getWhiteSpace()

isValid

public boolean isValid(String str,
                       ValidationContext vc)
Description copied from interface: Datatype
Checks if the specified 'literal' matches this Datatype with respect to the current context.

Specified by:
isValid in interface Datatype
Parameters:
str - the lexical representation to be checked.
vc - If this datatype is context-dependent (i.e. the Datatype.isContextDependent() method returns true), then the caller must provide a non-null valid context object. Otherwise, the caller can pass null.
Returns:
true if the 'literal' is a member of this Datatype; false if it's not a member of this Datatype.

checkValid

public void checkValid(String str,
                       ValidationContext vc)
                throws DatatypeException
Description copied from interface: Datatype
Similar to the isValid method but throws an exception with diagnosis in case of errors.

If the specified 'literal' is a valid lexical representation for this datatype, then this method must return without throwing any exception. If not, the callee must throw an exception (with diagnosis message, if possible.)

The application can use this method to provide detailed error message to users. This method is kept separate from the isValid method to achieve higher performance during normal validation.

Specified by:
checkValid in interface Datatype
Throws:
DatatypeException - If the given literal is invalid, then this exception is thrown. If the callee supports error diagnosis, then the exception should contain a diagnosis message.

createValue

public Object createValue(String str,
                          ValidationContext vc)
Description copied from interface: Datatype
Converts lexcial value and the current context to the corresponding value object.

The caller cannot generally assume that the value object is a meaningful Java object. For example, the caller cannot expect this method to return java.lang.Number type for the "integer" type of XML Schema Part 2.

Also, the caller cannot assume that the equals method and the hashCode method of the value object are consistent with the semantics of the datatype. For that purpose, the sameValue method and the valueHashCode method have to be used. Note that this means you cannot use classes like java.util.Hashtable to store the value objects.

The returned value object should be used solely for the sameValue and valueHashCode methods.

Specified by:
createValue in interface Datatype
vc - If this datatype is context-dependent (when the Datatype.isContextDependent() method returns true), then the caller must provide a non-null valid context object. Otherwise, the caller can pass null.
Returns:
null when the given lexical value is not a valid lexical value for this type.

normalizeWhiteSpace

final String normalizeWhiteSpace(String str)

allowsValue

boolean allowsValue(String str,
                    ValidationContext vc)

getValue

abstract Object getValue(String str,
                         ValidationContext vc)

getOrderRelation

OrderRelation getOrderRelation()

getMeasure

Measure getMeasure()

collapseWhiteSpace

private static final String collapseWhiteSpace(String s)

collapseStart

private static final int collapseStart(String s)

replaceWhiteSpace

private static final String replaceWhiteSpace(String s)

getPrimitive

DatatypeBase getPrimitive()

isContextDependent

public boolean isContextDependent()
Description copied from interface: Datatype
Checks if this datatype may need a context object for the validation.

The callee must return true even when the context is not always necessary. (For example, the "QName" type doesn't need a context object when validating unprefixed string. But nonetheless QName must return true.)

XSD's string and short types are examples of context-independent datatypes. Its QName and ENTITY types are examples of context-dependent datatypes.

When a datatype is context-independent, then the Datatype.isValid(java.lang.String, org.relaxng.datatype.ValidationContext) method, the Datatype.checkValid(java.lang.String, org.relaxng.datatype.ValidationContext) method, the Datatype.createStreamingValidator(org.relaxng.datatype.ValidationContext) method and the Datatype.createValue(java.lang.String, org.relaxng.datatype.ValidationContext) method can be called without providing a context object.

Specified by:
isContextDependent in interface Datatype
Returns:
true if this datatype is context-dependent (it needs a context object sometimes); false if this datatype is context-independent (it never needs a context object).

alwaysValid

public boolean alwaysValid()
Specified by:
alwaysValid in interface Datatype2

getIdType

public int getIdType()
Description copied from interface: Datatype
Checks if the ID/IDREF semantics is associated with this datatype.

This method is introduced to support the RELAX NG DTD compatibility spec. (Of course it's always free to use this method for other purposes.)

If you are implementing a datatype library and have no idea about the "RELAX NG DTD compatibility" thing, just return ID_TYPE_NULL is fine.

Specified by:
getIdType in interface Datatype
Returns:
If this datatype doesn't have any ID/IDREF semantics, it returns Datatype.ID_TYPE_NULL. If it has such a semantics (for example, XSD:ID, XSD:IDREF and comp:ID type), then it returns Datatype.ID_TYPE_ID, Datatype.ID_TYPE_IDREF or Datatype.ID_TYPE_IDREFS.

valueHashCode

public int valueHashCode(Object value)
Description copied from interface: Datatype
Computes the hash code for a value object, which is consistent with the sameValue method.

Specified by:
valueHashCode in interface Datatype
Returns:
hash code for the specified value object.

sameValue

public boolean sameValue(Object value1,
                         Object value2)
Description copied from interface: Datatype
Tests the equality of two value objects which were originally created by the createValue method of this object. The behavior is undefined if objects not created by this type are passed. It is the caller's responsibility to ensure that value objects belong to this type.

Specified by:
sameValue in interface Datatype
Returns:
true if two value objects are considered equal according to the definition of this datatype; false if otherwise.

createStreamingValidator

public DatatypeStreamingValidator createStreamingValidator(ValidationContext vc)
Description copied from interface: Datatype
Creates an instance of a streaming validator for this type.

By using streaming validators instead of the isValid method, the caller can avoid keeping the entire string, which is sometimes quite big, in memory.

Specified by:
createStreamingValidator in interface Datatype
Parameters:
vc - If this datatype is context-dependent (i.e. the Datatype.isContextDependent() method returns true), then the caller must provide a non-null valid context object. Otherwise, the caller can pass null. The callee may keep a reference to this context object only while the returned streaming validator is being used.