package runtime; import org.relaxng.datatype.Datatype; import org.relaxng.datatype.DatatypeException; import org.relaxng.datatype.DatatypeStreamingValidator; import org.relaxng.datatype.ValidationContext; import org.relaxng.datatype.helpers.StreamingValidatorImpl; /** * RELAX NG built-in datatype library. * * @author Kohsuke Kawaguchi (kk@kohsuke.org) */ public abstract class BuiltinDatatypeLibrary { private BuiltinDatatypeLibrary() {} private static abstract class BaseImpl implements Datatype { public final void checkValid(String exp, ValidationContext context ) {} public final DatatypeStreamingValidator createStreamingValidator(ValidationContext context) { return new StreamingValidatorImpl(this,context); } public final int getIdType() { return 0; } public final boolean isContextDependent() { return false; } public final boolean isValid(String str, ValidationContext context) { return true; } public final boolean sameValue(Object lhs, Object rhs) { return lhs.equals(rhs); } public final int valueHashCode(Object o) { return o.hashCode(); } } /** String type, which works exactly the same as XML Schema string type. */ public static final Datatype STRING = new BaseImpl() { public Object createValue(String str, ValidationContext context) { return str; } }; /** Token type, which works exactly the same as XML Schema token type. */ public static final Datatype TOKEN = new BaseImpl() { public Object createValue(String str, ValidationContext context) { StringBuffer buf = new StringBuffer(); boolean inWhitespace = true; int len = str.length(); for( int i=0; i<len; i++ ) { char ch = str.charAt(i); if( " \t\r\n".indexOf(ch)==-1 ) { buf.append(ch); inWhitespace = false; } else { if(!inWhitespace) buf.append(' '); inWhitespace = true; } } if(inWhitespace && buf.length()!=0) buf.setLength(buf.length()-1); return buf.toString(); } }; }