/*
* @(#)$Id: IntegerDerivedType.java,v 1.22 2002/10/08 22:01:27 kk122374 Exp $
*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
*
* This software is the proprietary information of Sun Microsystems, Inc.
* Use is subject to license terms.
*
*/
package com.sun.msv.datatype.xsd;
import org.relaxng.datatype.ValidationContext;
import com.sun.msv.datatype.SerializationContext;
/**
* base class for types derived from integer.
*
* @author <a href="mailto:kohsuke.kawaguchi@eng.sun.com">Kohsuke KAWAGUCHI</a>
*/
abstract class IntegerDerivedType extends BuiltinAtomicType implements Comparator {
protected IntegerDerivedType( String typeName ) {
super(typeName);
}
public final int isFacetApplicable( String facetName ) {
// TODO : should we allow scale facet, or not?
if( facetName.equals(FACET_TOTALDIGITS)
|| facetName.equals(FACET_PATTERN)
|| facetName.equals(FACET_WHITESPACE)
|| facetName.equals(FACET_ENUMERATION)
|| facetName.equals(FACET_MAXINCLUSIVE)
|| facetName.equals(FACET_MININCLUSIVE)
|| facetName.equals(FACET_MAXEXCLUSIVE)
|| facetName.equals(FACET_MINEXCLUSIVE) )
return APPLICABLE;
else
return NOT_ALLOWED;
}
protected final boolean checkFormat( String content, ValidationContext context ) {
// integer-derived types always checks lexical format by trying to convert it to value object
return _createValue(content,context)!=null;
}
public String convertToLexicalValue( Object value, SerializationContext context ) {
if( value instanceof Number || value instanceof IntegerValueType )
return value.toString();
else
throw new IllegalArgumentException("invalid value type:"+value.getClass().toString());
}
public final int compare( Object o1, Object o2 ) {
// integer-derived type always uses Comparable object as its value type
final int r = ((Comparable)o1).compareTo(o2);
if(r<0) return LESS;
if(r>0) return GREATER;
return EQUAL;
}
/**
* removes leading optional '+' sign.
*
* Several Java conversion functions (e.g., Long.parseLong)
* do not accept leading '+' sign.
*/
protected static String removeOptionalPlus(String s) {
if(s.length()<=1 || s.charAt(0)!='+') return s;
s = s.substring(1);
char ch = s.charAt(0);
if('0'<=ch && ch<='9') return s;
if('.'==ch ) return s;
throw new NumberFormatException();
}
}