- /*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 2001-2003 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xerces" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 2001, International
- * Business Machines, Inc., http://www.apache.org. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
- package com.sun.org.apache.xerces.internal.impl.dv.xs;
-
- import java.util.StringTokenizer;
- import java.util.Vector;
-
- import com.sun.org.apache.xerces.internal.impl.Constants;
- import com.sun.org.apache.xerces.internal.impl.dv.DatatypeException;
- import com.sun.org.apache.xerces.internal.impl.dv.InvalidDatatypeFacetException;
- import com.sun.org.apache.xerces.internal.impl.dv.InvalidDatatypeValueException;
- import com.sun.org.apache.xerces.internal.impl.dv.ValidatedInfo;
- import com.sun.org.apache.xerces.internal.impl.dv.ValidationContext;
- import com.sun.org.apache.xerces.internal.impl.dv.XSFacets;
- import com.sun.org.apache.xerces.internal.impl.dv.XSSimpleType;
- import com.sun.org.apache.xerces.internal.impl.xpath.regex.RegularExpression;
- import com.sun.org.apache.xerces.internal.xs.StringList;
- import com.sun.org.apache.xerces.internal.xs.XSAnnotation;
- import com.sun.org.apache.xerces.internal.xs.XSConstants;
- import com.sun.org.apache.xerces.internal.xs.XSFacet;
- import com.sun.org.apache.xerces.internal.xs.XSMultiValueFacet;
- import com.sun.org.apache.xerces.internal.xs.XSNamespaceItem;
- import com.sun.org.apache.xerces.internal.xs.XSObjectList;
- import com.sun.org.apache.xerces.internal.xs.XSSimpleTypeDefinition;
- import com.sun.org.apache.xerces.internal.xs.XSTypeDefinition;
- import com.sun.org.apache.xerces.internal.impl.xs.util.ShortListImpl;
- import com.sun.org.apache.xerces.internal.impl.xs.util.StringListImpl;
- import com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl;
- import com.sun.org.apache.xerces.internal.util.XMLChar;
- import com.sun.org.apache.xerces.internal.xni.NamespaceContext;
-
- /**
- * @author Sandy Gao, IBM
- * @author Neeraj Bajaj, Sun Microsystems, inc.
- *
- * @version $Id: XSSimpleTypeDecl.java,v 1.48 2004/01/19 15:30:20 sandygao Exp $
- */
- public class XSSimpleTypeDecl implements XSSimpleType {
-
- static final short DV_STRING = PRIMITIVE_STRING;
- static final short DV_BOOLEAN = PRIMITIVE_BOOLEAN;
- static final short DV_DECIMAL = PRIMITIVE_DECIMAL;
- static final short DV_FLOAT = PRIMITIVE_FLOAT;
- static final short DV_DOUBLE = PRIMITIVE_DOUBLE;
- static final short DV_DURATION = PRIMITIVE_DURATION;
- static final short DV_DATETIME = PRIMITIVE_DATETIME;
- static final short DV_TIME = PRIMITIVE_TIME;
- static final short DV_DATE = PRIMITIVE_DATE;
- static final short DV_GYEARMONTH = PRIMITIVE_GYEARMONTH;
- static final short DV_GYEAR = PRIMITIVE_GYEAR;
- static final short DV_GMONTHDAY = PRIMITIVE_GMONTHDAY;
- static final short DV_GDAY = PRIMITIVE_GDAY;
- static final short DV_GMONTH = PRIMITIVE_GMONTH;
- static final short DV_HEXBINARY = PRIMITIVE_HEXBINARY;
- static final short DV_BASE64BINARY = PRIMITIVE_BASE64BINARY;
- static final short DV_ANYURI = PRIMITIVE_ANYURI;
- static final short DV_QNAME = PRIMITIVE_QNAME;
- static final short DV_NOTATION = PRIMITIVE_NOTATION;
-
- static final short DV_ANYSIMPLETYPE = 0;
- static final short DV_ID = DV_NOTATION + 1;
- static final short DV_IDREF = DV_NOTATION + 2;
- static final short DV_ENTITY = DV_NOTATION + 3;
- static final short DV_INTEGER = DV_NOTATION + 4;
- static final short DV_LIST = DV_NOTATION + 5;
- static final short DV_UNION = DV_NOTATION + 6;
-
- static final TypeValidator[] fDVs = {
- new AnySimpleDV(),
- new StringDV(),
- new BooleanDV(),
- new DecimalDV(),
- new FloatDV(),
- new DoubleDV(),
- new DurationDV(),
- new DateTimeDV(),
- new TimeDV(),
- new DateDV(),
- new YearMonthDV(),
- new YearDV(),
- new MonthDayDV(),
- new DayDV(),
- new MonthDV(),
- new HexBinaryDV(),
- new Base64BinaryDV(),
- new AnyURIDV(),
- new QNameDV(),
- new QNameDV(), // notation use the same one as qname
- new IDDV(),
- new IDREFDV(),
- new EntityDV(),
- new IntegerDV(),
- new ListDV(),
- new UnionDV()
- };
-
- static final short NORMALIZE_NONE = 0;
- static final short NORMALIZE_TRIM = 1;
- static final short NORMALIZE_FULL = 2;
- static final short[] fDVNormalizeType = {
- NORMALIZE_NONE, //AnySimpleDV(),
- NORMALIZE_FULL, //StringDV(),
- NORMALIZE_TRIM, //BooleanDV(),
- NORMALIZE_TRIM, //DecimalDV(),
- NORMALIZE_TRIM, //FloatDV(),
- NORMALIZE_TRIM, //DoubleDV(),
- NORMALIZE_TRIM, //DurationDV(),
- NORMALIZE_TRIM, //DateTimeDV(),
- NORMALIZE_TRIM, //TimeDV(),
- NORMALIZE_TRIM, //DateDV(),
- NORMALIZE_TRIM, //YearMonthDV(),
- NORMALIZE_TRIM, //YearDV(),
- NORMALIZE_TRIM, //MonthDayDV(),
- NORMALIZE_TRIM, //DayDV(),
- NORMALIZE_TRIM, //MonthDV(),
- NORMALIZE_TRIM, //HexBinaryDV(),
- NORMALIZE_NONE, //Base64BinaryDV(), // Base64 know how to deal with spaces
- NORMALIZE_TRIM, //AnyURIDV(),
- NORMALIZE_TRIM, //QNameDV(),
- NORMALIZE_TRIM, //QNameDV(), // notation
- NORMALIZE_TRIM, //IDDV(),
- NORMALIZE_TRIM, //IDREFDV(),
- NORMALIZE_TRIM, //EntityDV(),
- NORMALIZE_TRIM, //IntegerDV(),
- NORMALIZE_FULL, //ListDV(),
- NORMALIZE_NONE, //UnionDV()
- };
-
- static final short SPECIAL_PATTERN_NONE = 0;
- static final short SPECIAL_PATTERN_NMTOKEN = 1;
- static final short SPECIAL_PATTERN_NAME = 2;
- static final short SPECIAL_PATTERN_NCNAME = 3;
-
- static final String[] SPECIAL_PATTERN_STRING = {
- "NONE", "NMTOKEN", "Name", "NCName"
- };
-
- static final String[] WS_FACET_STRING = {
- "preserve", "replace", "collapse"
- };
-
- static final String URI_SCHEMAFORSCHEMA = "http://www.w3.org/2001/XMLSchema";
- static final String ANY_TYPE = "anyType";
-
- static final ValidationContext fEmptyContext = new ValidationContext() {
- public boolean needFacetChecking() {
- return true;
- }
- public boolean needExtraChecking() {
- return false;
- }
- public boolean needToNormalize() {
- return true;
- }
- public boolean useNamespaces () {
- return true;
- }
- public boolean isEntityDeclared (String name) {
- return false;
- }
- public boolean isEntityUnparsed (String name) {
- return false;
- }
- public boolean isIdDeclared (String name) {
- return false;
- }
- public void addId(String name) {
- }
- public void addIdRef(String name) {
- }
- public String getSymbol (String symbol) {
- return null;
- }
- public String getURI(String prefix) {
- return null;
- }
- };
-
- // this will be true if this is a static XSSimpleTypeDecl
- // and hence must remain immutable (i.e., applyFacets
- // may not be permitted to have any effect).
- private boolean fIsImmutable = false;
-
- private XSSimpleTypeDecl fItemType;
- private XSSimpleTypeDecl[] fMemberTypes;
- // The most specific built-in type kind.
- private short fBuiltInKind;
-
- private String fTypeName;
- private String fTargetNamespace;
- private short fFinalSet = 0;
- private XSSimpleTypeDecl fBase;
- private short fVariety = -1;
- private short fValidationDV = -1;
-
- private short fFacetsDefined = 0;
- private short fFixedFacet = 0;
-
- //for constraining facets
- private short fWhiteSpace = 0;
- private int fLength = -1;
- private int fMinLength = -1;
- private int fMaxLength = -1;
- private int fTotalDigits = -1;
- private int fFractionDigits = -1;
- private Vector fPattern;
- private Vector fPatternStr;
- private Vector fEnumeration;
- private StringList fLexicalPattern;
- private StringList fLexicalEnumeration;
- private Object fMaxInclusive;
- private Object fMaxExclusive;
- private Object fMinExclusive;
- private Object fMinInclusive;
-
- // annotations for constraining facets
- public XSAnnotation lengthAnnotation;
- public XSAnnotation minLengthAnnotation;
- public XSAnnotation maxLengthAnnotation;
- public XSAnnotation whiteSpaceAnnotation;
- public XSAnnotation totalDigitsAnnotation;
- public XSAnnotation fractionDigitsAnnotation;
- public XSObjectListImpl patternAnnotations;
- public XSObjectList enumerationAnnotations;
- public XSAnnotation maxInclusiveAnnotation;
- public XSAnnotation maxExclusiveAnnotation;
- public XSAnnotation minInclusiveAnnotation;
- public XSAnnotation minExclusiveAnnotation;
-
- // facets as objects
- private XSObjectListImpl fFacets;
-
- // enumeration and pattern facets
- private XSObjectListImpl fMultiValueFacets;
-
- // simpleType annotations
- private XSObjectList fAnnotations = null;
-
- private short fPatternType = SPECIAL_PATTERN_NONE;
-
- // for fundamental facets
- private short fOrdered;
- private boolean fFinite;
- private boolean fBounded;
- private boolean fNumeric;
-
- /**
- * Unique ID for each simple type.
- * This information is used to assign unique names for simple types.
- */
- private final int fUniqueId = getNextId();
-
- private static int fIdCounter=0;
- private static synchronized int getNextId() { return fIdCounter++; }
-
-
- // default constructor
- public XSSimpleTypeDecl(){}
-
- //Create a new built-in primitive types (and id/idref/entity/integer)
- protected XSSimpleTypeDecl(XSSimpleTypeDecl base, String name, short validateDV,
- short ordered, boolean bounded, boolean finite,
- boolean numeric, boolean isImmutable, short builtInKind) {
- fIsImmutable = isImmutable;
- fBase = base;
- fTypeName = name;
- fTargetNamespace = URI_SCHEMAFORSCHEMA;
- // To simplify the code for anySimpleType, we treat it as an atomic type
- fVariety = VARIETY_ATOMIC;
- fValidationDV = validateDV;
- fFacetsDefined = FACET_WHITESPACE;
- if (validateDV == DV_STRING) {
- fWhiteSpace = WS_PRESERVE;
- } else {
- fWhiteSpace = WS_COLLAPSE;
- fFixedFacet = FACET_WHITESPACE;
- }
- this.fOrdered = ordered;
- this.fBounded = bounded;
- this.fFinite = finite;
- this.fNumeric = numeric;
- fAnnotations = null;
-
- // Specify the build in kind for this primitive type
- fBuiltInKind = builtInKind;
- }
-
- //Create a new simple type for restriction for built-in types
- protected XSSimpleTypeDecl(XSSimpleTypeDecl base, String name, String uri, short finalSet, boolean isImmutable,
- XSObjectList annotations, short builtInKind) {
- this(base, name, uri, finalSet, isImmutable, annotations);
- // Specify the build in kind for this built-in type
- fBuiltInKind = builtInKind;
- }
-
- //Create a new simple type for restriction.
- protected XSSimpleTypeDecl(XSSimpleTypeDecl base, String name, String uri, short finalSet, boolean isImmutable,
- XSObjectList annotations) {
- fBase = base;
- fTypeName = name;
- fTargetNamespace = uri;
- fFinalSet = finalSet;
- fAnnotations = annotations;
-
- fVariety = fBase.fVariety;
- fValidationDV = fBase.fValidationDV;
- switch (fVariety) {
- case VARIETY_ATOMIC:
- break;
- case VARIETY_LIST:
- fItemType = fBase.fItemType;
- break;
- case VARIETY_UNION:
- fMemberTypes = fBase.fMemberTypes;
- break;
- }
-
- // always inherit facets from the base.
- // in case a type is created, but applyFacets is not called
- fLength = fBase.fLength;
- fMinLength = fBase.fMinLength;
- fMaxLength = fBase.fMaxLength;
- fPattern = fBase.fPattern;
- fPatternStr = fBase.fPatternStr;
- fEnumeration = fBase.fEnumeration;
- fWhiteSpace = fBase.fWhiteSpace;
- fMaxExclusive = fBase.fMaxExclusive;
- fMaxInclusive = fBase.fMaxInclusive;
- fMinExclusive = fBase.fMinExclusive;
- fMinInclusive = fBase.fMinInclusive;
- fTotalDigits = fBase.fTotalDigits;
- fFractionDigits = fBase.fFractionDigits;
- fPatternType = fBase.fPatternType;
- fFixedFacet = fBase.fFixedFacet;
- fFacetsDefined = fBase.fFacetsDefined;
-
- //we also set fundamental facets information in case applyFacets is not called.
- caclFundamentalFacets();
- fIsImmutable = isImmutable;
-
- // Inherit from the base type
- fBuiltInKind = base.fBuiltInKind;
- }
-
- //Create a new simple type for list.
- protected XSSimpleTypeDecl(String name, String uri, short finalSet, XSSimpleTypeDecl itemType, boolean isImmutable,
- XSObjectList annotations) {
- fBase = fAnySimpleType;
- fTypeName = name;
- fTargetNamespace = uri;
- fFinalSet = finalSet;
- fAnnotations = annotations;
-
- fVariety = VARIETY_LIST;
- fItemType = (XSSimpleTypeDecl)itemType;
- fValidationDV = DV_LIST;
- fFacetsDefined = FACET_WHITESPACE;
- fFixedFacet = FACET_WHITESPACE;
- fWhiteSpace = WS_COLLAPSE;
-
- //setting fundamental facets
- caclFundamentalFacets();
- fIsImmutable = isImmutable;
-
- // Values of this type are lists
- fBuiltInKind = XSConstants.LIST_DT;
- }
-
- //Create a new simple type for union.
- protected XSSimpleTypeDecl(String name, String uri, short finalSet, XSSimpleTypeDecl[] memberTypes,
- XSObjectList annotations) {
- fBase = fAnySimpleType;
- fTypeName = name;
- fTargetNamespace = uri;
- fFinalSet = finalSet;
- fAnnotations = annotations;
-
- fVariety = VARIETY_UNION;
- fMemberTypes = memberTypes;
- fValidationDV = DV_UNION;
- // even for union, we set whitespace to something
- // this will never be used, but we can use fFacetsDefined to check
- // whether applyFacets() is allwwed: it's not allowed
- // if fFacetsDefined != 0
- fFacetsDefined = FACET_WHITESPACE;
- fWhiteSpace = WS_COLLAPSE;
-
- //setting fundamental facets
- caclFundamentalFacets();
- // none of the schema-defined types are unions, so just set
- // fIsImmutable to false.
- fIsImmutable = false;
-
- // No value can be of this type, so it's unavailable.
- fBuiltInKind = XSConstants.UNAVAILABLE_DT;
- }
-
- //set values for restriction.
- protected XSSimpleTypeDecl setRestrictionValues(XSSimpleTypeDecl base, String name, String uri, short finalSet,
- XSObjectList annotations) {
- //decline to do anything if the object is immutable.
- if(fIsImmutable) return null;
- fBase = base;
- fTypeName = name;
- fTargetNamespace = uri;
- fFinalSet = finalSet;
- fAnnotations = annotations;
-
- fVariety = fBase.fVariety;
- fValidationDV = fBase.fValidationDV;
- switch (fVariety) {
- case VARIETY_ATOMIC:
- break;
- case VARIETY_LIST:
- fItemType = fBase.fItemType;
- break;
- case VARIETY_UNION:
- fMemberTypes = fBase.fMemberTypes;
- break;
- }
-
- // always inherit facets from the base.
- // in case a type is created, but applyFacets is not called
- fLength = fBase.fLength;
- fMinLength = fBase.fMinLength;
- fMaxLength = fBase.fMaxLength;
- fPattern = fBase.fPattern;
- fPatternStr = fBase.fPatternStr;
- fEnumeration = fBase.fEnumeration;
- fWhiteSpace = fBase.fWhiteSpace;
- fMaxExclusive = fBase.fMaxExclusive;
- fMaxInclusive = fBase.fMaxInclusive;
- fMinExclusive = fBase.fMinExclusive;
- fMinInclusive = fBase.fMinInclusive;
- fTotalDigits = fBase.fTotalDigits;
- fFractionDigits = fBase.fFractionDigits;
- fPatternType = fBase.fPatternType;
- fFixedFacet = fBase.fFixedFacet;
- fFacetsDefined = fBase.fFacetsDefined;
-
- //we also set fundamental facets information in case applyFacets is not called.
- caclFundamentalFacets();
- return this;
- }
-
- //set values for list.
- protected XSSimpleTypeDecl setListValues(String name, String uri, short finalSet, XSSimpleTypeDecl itemType,
- XSObjectList annotations) {
- //decline to do anything if the object is immutable.
- if(fIsImmutable) return null;
- fBase = fAnySimpleType;
- fTypeName = name;
- fTargetNamespace = uri;
- fFinalSet = finalSet;
- fAnnotations = annotations;
-
- fVariety = VARIETY_LIST;
- fItemType = (XSSimpleTypeDecl)itemType;
- fValidationDV = DV_LIST;
- fFacetsDefined = FACET_WHITESPACE;
- fFixedFacet = FACET_WHITESPACE;
- fWhiteSpace = WS_COLLAPSE;
-
- //setting fundamental facets
- caclFundamentalFacets();
- return this;
- }
-
- //set values for union.
- protected XSSimpleTypeDecl setUnionValues(String name, String uri, short finalSet, XSSimpleTypeDecl[] memberTypes,
- XSObjectList annotations) {
- //decline to do anything if the object is immutable.
- if(fIsImmutable) return null;
- fBase = fAnySimpleType;
- fTypeName = name;
- fTargetNamespace = uri;
- fFinalSet = finalSet;
- fAnnotations = annotations;
-
- fVariety = VARIETY_UNION;
- fMemberTypes = memberTypes;
- fValidationDV = DV_UNION;
- // even for union, we set whitespace to something
- // this will never be used, but we can use fFacetsDefined to check
- // whether applyFacets() is allwwed: it's not allowed
- // if fFacetsDefined != 0
- fFacetsDefined = FACET_WHITESPACE;
- fWhiteSpace = WS_COLLAPSE;
-
- //setting fundamental facets
- caclFundamentalFacets();
- return this;
- }
-
- public short getType () {
- return XSConstants.TYPE_DEFINITION;
- }
-
- public short getTypeCategory () {
- return SIMPLE_TYPE;
- }
-
- public String getName() {
- return fTypeName;
- }
-
- public String getNamespace() {
- return fTargetNamespace;
- }
-
- public short getFinal(){
- return fFinalSet;
- }
-
- public boolean isFinal(short derivation) {
- return (fFinalSet & derivation) != 0;
- }
-
- public XSTypeDefinition getBaseType(){
- return fBase;
- }
-
- public boolean getAnonymous() {
- return fTypeName == null;
- }
-
- public short getVariety(){
- // for anySimpleType, return absent variaty
- return fValidationDV == DV_ANYSIMPLETYPE ? VARIETY_ABSENT : fVariety;
- }
-
- public boolean isIDType(){
- switch (fVariety) {
- case VARIETY_ATOMIC:
- return fValidationDV == DV_ID;
- case VARIETY_LIST:
- return fItemType.isIDType();
- case VARIETY_UNION:
- for (int i = 0; i < fMemberTypes.length; i++) {
- if (fMemberTypes[i].isIDType())
- return true;
- }
- }
- return false;
- }
-
- public short getWhitespace() throws DatatypeException{
- if (fVariety == VARIETY_UNION) {
- throw new DatatypeException("dt-whitespace", new Object[]{fTypeName});
- }
- return fWhiteSpace;
- }
-
- public short getPrimitiveKind() {
- if (fVariety == VARIETY_ATOMIC && fValidationDV != DV_ANYSIMPLETYPE) {
- if (fValidationDV == DV_ID || fValidationDV == DV_IDREF || fValidationDV == DV_ENTITY)
- return DV_STRING;
- else if (fValidationDV == DV_INTEGER)
- return DV_DECIMAL;
- else
- return fValidationDV;
- }
- else {
- // REVISIT: error situation. runtime exception?
- return (short)0;
- }
- }
-
- public short getBuiltInKind() {
- return this.fBuiltInKind;
- }
-
- public XSSimpleTypeDefinition getPrimitiveType() {
- if (fVariety == VARIETY_ATOMIC && fValidationDV != DV_ANYSIMPLETYPE) {
- XSSimpleTypeDecl pri = this;
- // recursively get base, until we reach anySimpleType
- while (pri.fBase != fAnySimpleType)
- pri = pri.fBase;
- return pri;
- }
- else {
- // REVISIT: error situation. runtime exception?
- return null;
- }
- }
-
- public XSSimpleTypeDefinition getItemType() {
- if (fVariety == VARIETY_LIST) {
- return fItemType;
- }
- else {
- // REVISIT: error situation. runtime exception?
- return null;
- }
- }
-
- public XSObjectList getMemberTypes() {
- if (fVariety == VARIETY_UNION) {
- return new XSObjectListImpl(fMemberTypes, fMemberTypes.length);
- }
- else {
- // REVISIT: error situation. runtime exception?
- return null;
- }
- }
-
- /**
- * If <restriction> is chosen
- */
- public void applyFacets(XSFacets facets, short presentFacet, short fixedFacet, ValidationContext context)
- throws InvalidDatatypeFacetException {
- applyFacets(facets, presentFacet, fixedFacet, SPECIAL_PATTERN_NONE, context);
- }
-
- /**
- * built-in derived types by restriction
- */
- void applyFacets1(XSFacets facets, short presentFacet, short fixedFacet) {
-
- try {
- applyFacets(facets, presentFacet, fixedFacet, SPECIAL_PATTERN_NONE, fDummyContext);
- } catch (InvalidDatatypeFacetException e) {
- // should never gets here, internel error
- throw new RuntimeException("internal error");
- }
- // we've now applied facets; so lock this object:
- fIsImmutable = true;
- }
-
- /**
- * built-in derived types by restriction
- */
- void applyFacets1(XSFacets facets, short presentFacet, short fixedFacet, short patternType) {
-
- try {
- applyFacets(facets, presentFacet, fixedFacet, patternType, fDummyContext);
- } catch (InvalidDatatypeFacetException e) {
- // should never gets here, internel error
- throw new RuntimeException("internal error");
- }
- // we've now applied facets; so lock this object:
- fIsImmutable = true;
- }
-
- /**
- * If <restriction> is chosen, or built-in derived types by restriction
- */
- void applyFacets(XSFacets facets, short presentFacet, short fixedFacet, short patternType, ValidationContext context)
- throws InvalidDatatypeFacetException {
-
- // if the object is immutable, should not apply facets...
- if(fIsImmutable) return;
- ValidatedInfo tempInfo = new ValidatedInfo();
-
- // clear facets. because we always inherit facets in the constructor
- // REVISIT: in fact, we don't need to clear them.
- // we can convert 5 string values (4 bounds + 1 enum) to actual values,
- // store them somewhere, then do facet checking at once, instead of
- // going through the following steps. (lots of checking are redundant:
- // for example, ((presentFacet & FACET_XXX) != 0))
-
- fFacetsDefined = 0;
- fFixedFacet = 0;
-
- int result = 0 ;
-
- // step 1: parse present facets
- short allowedFacet = fDVs[fValidationDV].getAllowedFacets();
-
- // length
- if ((presentFacet & FACET_LENGTH) != 0) {
- if ((allowedFacet & FACET_LENGTH) == 0) {
- reportError("cos-applicable-facets", new Object[]{"length", fTypeName});
- } else {
- fLength = facets.length;
- lengthAnnotation = facets.lengthAnnotation;
- fFacetsDefined |= FACET_LENGTH;
- if ((fixedFacet & FACET_LENGTH) != 0)
- fFixedFacet |= FACET_LENGTH;
- }
- }
- // minLength
- if ((presentFacet & FACET_MINLENGTH) != 0) {
- if ((allowedFacet & FACET_MINLENGTH) == 0) {
- reportError("cos-applicable-facets", new Object[]{"minLength", fTypeName});
- } else {
- fMinLength = facets.minLength;
- minLengthAnnotation = facets.minLengthAnnotation;
- fFacetsDefined |= FACET_MINLENGTH;
- if ((fixedFacet & FACET_MINLENGTH) != 0)
- fFixedFacet |= FACET_MINLENGTH;
- }
- }
- // maxLength
- if ((presentFacet & FACET_MAXLENGTH) != 0) {
- if ((allowedFacet & FACET_MAXLENGTH) == 0) {
- reportError("cos-applicable-facets", new Object[]{"maxLength", fTypeName});
- } else {
- fMaxLength = facets.maxLength;
- maxLengthAnnotation = facets.maxLengthAnnotation;
- fFacetsDefined |= FACET_MAXLENGTH;
- if ((fixedFacet & FACET_MAXLENGTH) != 0)
- fFixedFacet |= FACET_MAXLENGTH;
- }
- }
- // pattern
- if ((presentFacet & FACET_PATTERN) != 0) {
- if ((allowedFacet & FACET_PATTERN) == 0) {
- reportError("cos-applicable-facets", new Object[]{"pattern", fTypeName});
- } else {
- patternAnnotations = facets.patternAnnotations;
- RegularExpression regex = null;
- try {
- regex = new RegularExpression(facets.pattern, "X");
- } catch (Exception e) {
- reportError("InvalidRegex", new Object[]{facets.pattern, e.getLocalizedMessage()});
- }
- if (regex != null) {
- fPattern = new Vector();
- fPattern.addElement(regex);
- fPatternStr = new Vector();
- fPatternStr.addElement(facets.pattern);
- fFacetsDefined |= FACET_PATTERN;
- if ((fixedFacet & FACET_PATTERN) != 0)
- fFixedFacet |= FACET_PATTERN;
- }
- }
- }
-
- // enumeration
- if ((presentFacet & FACET_ENUMERATION) != 0) {
- if ((allowedFacet & FACET_ENUMERATION) == 0) {
- reportError("cos-applicable-facets", new Object[]{"enumeration", fTypeName});
- } else {
- fEnumeration = new Vector();
- Vector enumVals = facets.enumeration;
- Vector enumNSDecls = facets.enumNSDecls;
- ValidationContextImpl ctx = new ValidationContextImpl(context);
- enumerationAnnotations = facets.enumAnnotations;
- for (int i = 0; i < enumVals.size(); i++) {
- if (enumNSDecls != null)
- ctx.setNSContext((NamespaceContext)enumNSDecls.elementAt(i));
- try {
- // check 4.3.5.c0 must: enumeration values from the value space of base
- fEnumeration.addElement(this.fBase.validate((String)enumVals.elementAt(i), ctx, tempInfo));
- } catch (InvalidDatatypeValueException ide) {
- reportError("enumeration-valid-restriction", new Object[]{enumVals.elementAt(i), this.getBaseType().getName()});
- }
- }
- fFacetsDefined |= FACET_ENUMERATION;
- if ((fixedFacet & FACET_ENUMERATION) != 0)
- fFixedFacet |= FACET_ENUMERATION;
- }
- }
- // whiteSpace
- if ((presentFacet & FACET_WHITESPACE) != 0) {
- if ((allowedFacet & FACET_WHITESPACE) == 0) {
- reportError("cos-applicable-facets", new Object[]{"whiteSpace", fTypeName});
- } else {
- fWhiteSpace = facets.whiteSpace;
- whiteSpaceAnnotation = facets.whiteSpaceAnnotation;
- fFacetsDefined |= FACET_WHITESPACE;
- if ((fixedFacet & FACET_WHITESPACE) != 0)
- fFixedFacet |= FACET_WHITESPACE;
- }
- }
-
- boolean needCheckBase = true;
- // maxInclusive
- if ((presentFacet & FACET_MAXINCLUSIVE) != 0) {
- if ((allowedFacet & FACET_MAXINCLUSIVE) == 0) {
- reportError("cos-applicable-facets", new Object[]{"maxInclusive", fTypeName});
- } else {
- maxInclusiveAnnotation = facets.maxInclusiveAnnotation;
- try {
- fMaxInclusive = getActualValue(facets.maxInclusive, context, tempInfo, true);
- fFacetsDefined |= FACET_MAXINCLUSIVE;
- if ((fixedFacet & FACET_MAXINCLUSIVE) != 0)
- fFixedFacet |= FACET_MAXINCLUSIVE;
- } catch (InvalidDatatypeValueException ide) {
- reportError(ide.getKey(), ide.getArgs());
- reportError("FacetValueFromBase", new Object[]{fTypeName, facets.maxInclusive,
- "maxInclusive", fBase.getName()});
- }
-
- // maxInclusive from base
- if (((fBase.fFacetsDefined & FACET_MAXINCLUSIVE) != 0)) {
- result = fDVs[fValidationDV].compare(fMaxInclusive, fBase.fMaxInclusive);
- if ((fBase.fFixedFacet & FACET_MAXINCLUSIVE) != 0 && result != 0) {
- reportError( "FixedFacetValue", new Object[]{"maxInclusive", fMaxInclusive, fBase.fMaxInclusive, fTypeName});
- }
- if (result == 0) {
- needCheckBase = false;
- }
- }
- if (needCheckBase) {
- try {
- fBase.validate(context, tempInfo);
- } catch (InvalidDatatypeValueException ide) {
- reportError(ide.getKey(), ide.getArgs());
- reportError("FacetValueFromBase", new Object[]{fTypeName, facets.maxInclusive,
- "maxInclusive", fBase.getName()});
- }
- }
- }
- }
-
- // maxExclusive
- needCheckBase = true;
- if ((presentFacet & FACET_MAXEXCLUSIVE) != 0) {
- if ((allowedFacet & FACET_MAXEXCLUSIVE) == 0) {
- reportError("cos-applicable-facets", new Object[]{"maxExclusive", fTypeName});
- } else {
- maxExclusiveAnnotation = facets.maxExclusiveAnnotation;
- try {
- fMaxExclusive = getActualValue(facets.maxExclusive, context, tempInfo, true);
- fFacetsDefined |= FACET_MAXEXCLUSIVE;
- if ((fixedFacet & FACET_MAXEXCLUSIVE) != 0)
- fFixedFacet |= FACET_MAXEXCLUSIVE;
- } catch (InvalidDatatypeValueException ide) {
- reportError(ide.getKey(), ide.getArgs());
- reportError("FacetValueFromBase", new Object[]{fTypeName, facets.maxExclusive,
- "maxExclusive", fBase.getName()});
- }
-
- // maxExclusive from base
- if (((fBase.fFacetsDefined & FACET_MAXEXCLUSIVE) != 0)) {
- result = fDVs[fValidationDV].compare(fMaxExclusive, fBase.fMaxExclusive);
- if ((fBase.fFixedFacet & FACET_MAXEXCLUSIVE) != 0 && result != 0) {
- reportError( "FixedFacetValue", new Object[]{"maxExclusive", facets.maxExclusive, fBase.fMaxExclusive, fTypeName});
- }
- if (result == 0) {
- needCheckBase = false;
- }
- }
- if (needCheckBase) {
- try {
- fBase.validate(context, tempInfo);
- } catch (InvalidDatatypeValueException ide) {
- reportError(ide.getKey(), ide.getArgs());
- reportError("FacetValueFromBase", new Object[]{fTypeName, facets.maxExclusive,
- "maxExclusive", fBase.getName()});
- }
- }
- }
- }
- // minExclusive
- needCheckBase = true;
- if ((presentFacet & FACET_MINEXCLUSIVE) != 0) {
- if ((allowedFacet & FACET_MINEXCLUSIVE) == 0) {
- reportError("cos-applicable-facets", new Object[]{"minExclusive", fTypeName});
- } else {
- minExclusiveAnnotation = facets.minExclusiveAnnotation;
- try {
- fMinExclusive = getActualValue(facets.minExclusive, context, tempInfo, true);
- fFacetsDefined |= FACET_MINEXCLUSIVE;
- if ((fixedFacet & FACET_MINEXCLUSIVE) != 0)
- fFixedFacet |= FACET_MINEXCLUSIVE;
- } catch (InvalidDatatypeValueException ide) {
- reportError(ide.getKey(), ide.getArgs());
- reportError("FacetValueFromBase", new Object[]{fTypeName, facets.minExclusive,
- "minExclusive", fBase.getName()});
- }
-
- // minExclusive from base
- if (((fBase.fFacetsDefined & FACET_MINEXCLUSIVE) != 0)) {
- result = fDVs[fValidationDV].compare(fMinExclusive, fBase.fMinExclusive);
- if ((fBase.fFixedFacet & FACET_MINEXCLUSIVE) != 0 && result != 0) {
- reportError( "FixedFacetValue", new Object[]{"minExclusive", facets.minExclusive, fBase.fMinExclusive, fTypeName});
- }
- if (result == 0) {
- needCheckBase = false;
- }
- }
- if (needCheckBase) {
- try {
- fBase.validate(context, tempInfo);
- } catch (InvalidDatatypeValueException ide) {
- reportError(ide.getKey(), ide.getArgs());
- reportError("FacetValueFromBase", new Object[]{fTypeName, facets.minExclusive,
- "minExclusive", fBase.getName()});
- }
- }
- }
- }
- // minInclusive
- needCheckBase = true;
- if ((presentFacet & FACET_MININCLUSIVE) != 0) {
- if ((allowedFacet & FACET_MININCLUSIVE) == 0) {
- reportError("cos-applicable-facets", new Object[]{"minInclusive", fTypeName});
- } else {
- minInclusiveAnnotation = facets.minInclusiveAnnotation;
- try {
- fMinInclusive = getActualValue(facets.minInclusive, context, tempInfo, true);
- fFacetsDefined |= FACET_MININCLUSIVE;
- if ((fixedFacet & FACET_MININCLUSIVE) != 0)
- fFixedFacet |= FACET_MININCLUSIVE;
- } catch (InvalidDatatypeValueException ide) {
- reportError(ide.getKey(), ide.getArgs());
- reportError("FacetValueFromBase", new Object[]{fTypeName, facets.minInclusive,
- "minInclusive", fBase.getName()});
- }
-
- // minInclusive from base
- if (((fBase.fFacetsDefined & FACET_MININCLUSIVE) != 0)) {
- result = fDVs[fValidationDV].compare(fMinInclusive, fBase.fMinInclusive);
- if ((fBase.fFixedFacet & FACET_MININCLUSIVE) != 0 && result != 0) {
- reportError( "FixedFacetValue", new Object[]{"minInclusive", facets.minInclusive, fBase.fMinInclusive, fTypeName});
- }
- if (result == 0) {
- needCheckBase = false;
- }
- }
- if (needCheckBase) {
- try {
- fBase.validate(context, tempInfo);
- } catch (InvalidDatatypeValueException ide) {
- reportError(ide.getKey(), ide.getArgs());
- reportError("FacetValueFromBase", new Object[]{fTypeName, facets.minInclusive,
- "minInclusive", fBase.getName()});
- }
- }
- }
- }
-
- // totalDigits
- if ((presentFacet & FACET_TOTALDIGITS) != 0) {
- if ((allowedFacet & FACET_TOTALDIGITS) == 0) {
- reportError("cos-applicable-facets", new Object[]{"totalDigits", fTypeName});
- } else {
- totalDigitsAnnotation = facets.totalDigitsAnnotation;
- fTotalDigits = facets.totalDigits;
- fFacetsDefined |= FACET_TOTALDIGITS;
- if ((fixedFacet & FACET_TOTALDIGITS) != 0)
- fFixedFacet |= FACET_TOTALDIGITS;
- }
- }
- // fractionDigits
- if ((presentFacet & FACET_FRACTIONDIGITS) != 0) {
- if ((allowedFacet & FACET_FRACTIONDIGITS) == 0) {
- reportError("cos-applicable-facets", new Object[]{"fractionDigits", fTypeName});
- } else {
- fFractionDigits = facets.fractionDigits;
- fractionDigitsAnnotation = facets.fractionDigitsAnnotation;
- fFacetsDefined |= FACET_FRACTIONDIGITS;
- if ((fixedFacet & FACET_FRACTIONDIGITS) != 0)
- fFixedFacet |= FACET_FRACTIONDIGITS;
- }
- }
-
- // token type: internal use, so do less checking
- if (patternType != SPECIAL_PATTERN_NONE) {
- fPatternType = patternType;
- }
-
- // step 2: check facets against each other: length, bounds
- if(fFacetsDefined != 0) {
-
- // check 4.3.1.c1 error: length & (maxLength | minLength)
- if((fFacetsDefined & FACET_LENGTH) != 0 ){
- if ((fFacetsDefined & FACET_MINLENGTH) != 0) {
- if ((fFacetsDefined & FACET_MAXLENGTH) != 0) {
- // length, minLength and maxLength defined
- reportError("length-minLength-maxLength.a", new Object[]{fTypeName, Integer.toString(fLength), Integer.toString(fMinLength), Integer.toString(fMaxLength)});
- }
- else {
- // length and minLength defined
- reportError("length-minLength-maxLength.b", new Object[]{fTypeName, Integer.toString(fLength), Integer.toString(fMinLength)});
- }
- }
- else if ((fFacetsDefined & FACET_MAXLENGTH) != 0) {
- // length and maxLength defined
- reportError("length-minLength-maxLength.c", new Object[]{fTypeName, Integer.toString(fLength), Integer.toString(fMaxLength)});
- }
- }
-
- // check 4.3.2.c1 must: minLength <= maxLength
- if(((fFacetsDefined & FACET_MINLENGTH ) != 0 ) && ((fFacetsDefined & FACET_MAXLENGTH) != 0))
- {
- if(fMinLength > fMaxLength)
- reportError("minLength-less-than-equal-to-maxLength", new Object[]{Integer.toString(fMinLength), Integer.toString(fMaxLength), fTypeName});
- }
-
- // check 4.3.8.c1 error: maxInclusive + maxExclusive
- if (((fFacetsDefined & FACET_MAXEXCLUSIVE) != 0) && ((fFacetsDefined & FACET_MAXINCLUSIVE) != 0)) {
- reportError( "maxInclusive-maxExclusive", new Object[]{fMaxInclusive, fMaxExclusive, fTypeName});
- }
-
- // check 4.3.9.c1 error: minInclusive + minExclusive
- if (((fFacetsDefined & FACET_MINEXCLUSIVE) != 0) && ((fFacetsDefined & FACET_MININCLUSIVE) != 0)) {
- reportError("minInclusive-minExclusive", new Object[]{fMinInclusive, fMinExclusive, fTypeName});
- }
-
- // check 4.3.7.c1 must: minInclusive <= maxInclusive
- if (((fFacetsDefined & FACET_MAXINCLUSIVE) != 0) && ((fFacetsDefined & FACET_MININCLUSIVE) != 0)) {
- result = fDVs[fValidationDV].compare(fMinInclusive, fMaxInclusive);
- if (result != -1 && result != 0)
- reportError("minInclusive-less-than-equal-to-maxInclusive", new Object[]{fMinInclusive, fMaxInclusive, fTypeName});
- }
-
- // check 4.3.8.c2 must: minExclusive <= maxExclusive ??? minExclusive < maxExclusive
- if (((fFacetsDefined & FACET_MAXEXCLUSIVE) != 0) && ((fFacetsDefined & FACET_MINEXCLUSIVE) != 0)) {
- result = fDVs[fValidationDV].compare(fMinExclusive, fMaxExclusive);
- if (result != -1 && result != 0)
- reportError( "minExclusive-less-than-equal-to-maxExclusive", new Object[]{fMinExclusive, fMaxExclusive, fTypeName});
- }
-
- // check 4.3.9.c2 must: minExclusive < maxInclusive
- if (((fFacetsDefined & FACET_MAXINCLUSIVE) != 0) && ((fFacetsDefined & FACET_MINEXCLUSIVE) != 0)) {
- if (fDVs[fValidationDV].compare(fMinExclusive, fMaxInclusive) != -1)
- reportError( "minExclusive-less-than-maxInclusive", new Object[]{fMinExclusive, fMaxInclusive, fTypeName});
- }
-
- // check 4.3.10.c1 must: minInclusive < maxExclusive
- if (((fFacetsDefined & FACET_MAXEXCLUSIVE) != 0) && ((fFacetsDefined & FACET_MININCLUSIVE) != 0)) {
- if (fDVs[fValidationDV].compare(fMinInclusive, fMaxExclusive) != -1)
- reportError( "minInclusive-less-than-maxExclusive", new Object[]{fMinInclusive, fMaxExclusive, fTypeName});
- }
-
- // check 4.3.12.c1 must: fractionDigits <= totalDigits
- if (((fFacetsDefined & FACET_FRACTIONDIGITS) != 0) &&
- ((fFacetsDefined & FACET_TOTALDIGITS) != 0)) {
- if (fFractionDigits > fTotalDigits)
- reportError( "fractionDigits-totalDigits", new Object[]{Integer.toString(fFractionDigits), Integer.toString(fTotalDigits), fTypeName});
- }
-
- // step 3: check facets against base
- // check 4.3.1.c1 error: length & (fBase.maxLength | fBase.minLength)
- if((fFacetsDefined & FACET_LENGTH) != 0 ){
- if ((fBase.fFacetsDefined & FACET_MINLENGTH) != 0 &&
- fLength < fBase.fMinLength) {
- // length, fBase.minLength and fBase.maxLength defined
- reportError("length-minLength-maxLength.d", new Object[]{fTypeName, Integer.toString(fLength), Integer.toString(fBase.fMinLength)});
- }
- if ((fBase.fFacetsDefined & FACET_MAXLENGTH) != 0 &&
- fLength > fBase.fMaxLength) {
- // length and fBase.maxLength defined
- reportError("length-minLength-maxLength.e", new Object[]{fTypeName, Integer.toString(fLength), Integer.toString(fBase.fMaxLength)});
- }
- if ( (fBase.fFacetsDefined & FACET_LENGTH) != 0 ) {
- // check 4.3.1.c2 error: length != fBase.length
- if ( fLength != fBase.fLength )
- reportError( "length-valid-restriction", new Object[]{Integer.toString(fLength), Integer.toString(fBase.fLength), fTypeName});
- }
- }
-
- // check 4.3.1.c1 error: fBase.length & (maxLength | minLength)
- else if((fBase.fFacetsDefined & FACET_LENGTH) != 0 ){
- if ((fFacetsDefined & FACET_MINLENGTH) != 0 &&
- fBase.fLength < fMinLength) {
- // fBase.length, minLength and maxLength defined
- reportError("length-minLength-maxLength.d", new Object[]{fTypeName, Integer.toString(fBase.fLength), Integer.toString(fMinLength)});
- }
- if ((fFacetsDefined & FACET_MAXLENGTH) != 0 &&
- fBase.fLength > fMaxLength) {
- // fBase.length and maxLength defined
- reportError("length-minLength-maxLength.e", new Object[]{this, Integer.toString(fBase.fLength), Integer.toString(fMaxLength)});
- }
- }
-
- // check 4.3.2.c1 must: minLength <= fBase.maxLength
- if ( ((fFacetsDefined & FACET_MINLENGTH ) != 0 ) ) {
- if ( (fBase.fFacetsDefined & FACET_MAXLENGTH ) != 0 ) {
- if ( fMinLength > fBase.fMaxLength ) {
- reportError("minLength-less-than-equal-to-maxLength", new Object[]{Integer.toString(fMinLength), Integer.toString(fBase.fMaxLength), fTypeName});
- }
- }
- else if ( (fBase.fFacetsDefined & FACET_MINLENGTH) != 0 ) {
- if ( (fBase.fFixedFacet & FACET_MINLENGTH) != 0 && fMinLength != fBase.fMinLength ) {
- reportError( "FixedFacetValue", new Object[]{"minLength", Integer.toString(fMinLength), Integer.toString(fBase.fMinLength), fTypeName});
- }
-
- // check 4.3.2.c2 error: minLength < fBase.minLength
- if ( fMinLength < fBase.fMinLength ) {
- reportError( "minLength-valid-restriction", new Object[]{Integer.toString(fMinLength), Integer.toString(fBase.fMinLength), fTypeName});
- }
- }
- }
-
-
- // check 4.3.2.c1 must: maxLength < fBase.minLength
- if ( ((fFacetsDefined & FACET_MAXLENGTH ) != 0 ) && ((fBase.fFacetsDefined & FACET_MINLENGTH ) != 0 )) {
- if ( fMaxLength < fBase.fMinLength) {
- reportError("minLength-less-than-equal-to-maxLength", new Object[]{Integer.toString(fBase.fMinLength), Integer.toString(fMaxLength)});
- }
- }
-
- // check 4.3.3.c1 error: maxLength > fBase.maxLength
- if ( (fFacetsDefined & FACET_MAXLENGTH) != 0 ) {
- if ( (fBase.fFacetsDefined & FACET_MAXLENGTH) != 0 ){
- if(( (fBase.fFixedFacet & FACET_MAXLENGTH) != 0 )&& fMaxLength != fBase.fMaxLength ) {
- reportError( "FixedFacetValue", new Object[]{"maxLength", Integer.toString(fMaxLength), Integer.toString(fBase.fMaxLength), fTypeName});
- }
- if ( fMaxLength > fBase.fMaxLength ) {
- reportError( "maxLength-valid-restriction", new Object[]{Integer.toString(fMaxLength), Integer.toString(fBase.fMaxLength), fTypeName});
- }
- }
- }
-
- /* // check 4.3.7.c2 error:
- // maxInclusive > fBase.maxInclusive
- // maxInclusive >= fBase.maxExclusive
- // maxInclusive < fBase.minInclusive
- // maxInclusive <= fBase.minExclusive
-
- if (((fFacetsDefined & FACET_MAXINCLUSIVE) != 0)) {
- if (((fBase.fFacetsDefined & FACET_MAXINCLUSIVE) != 0)) {
- result = fDVs[fValidationDV].compare(fMaxInclusive, fBase.fMaxInclusive);
- if ((fBase.fFixedFacet & FACET_MAXINCLUSIVE) != 0 && result != 0) {
- reportError( "FixedFacetValue", new Object[]{"maxInclusive", fMaxInclusive, fBase.fMaxInclusive, fTypeName});
- }
- if (result != -1 && result != 0) {
- reportError( "maxInclusive-valid-restriction.1", new Object[]{fMaxInclusive, fBase.fMaxInclusive, fTypeName});
- }
- }
- if (((fBase.fFacetsDefined & FACET_MAXEXCLUSIVE) != 0) &&
- fDVs[fValidationDV].compare(fMaxInclusive, fBase.fMaxExclusive) != -1){
- reportError( "maxInclusive-valid-restriction.1", new Object[]{fMaxInclusive, fBase.fMaxExclusive, fTypeName});
- }
-
- if ((( fBase.fFacetsDefined & FACET_MININCLUSIVE) != 0)) {
- result = fDVs[fValidationDV].compare(fMaxInclusive, fBase.fMinInclusive);
- if (result != 1 && result != 0) {
- reportError( "maxInclusive-valid-restriction.1", new Object[]{fMaxInclusive, fBase.fMinInclusive, fTypeName});
- }
- }
-
- if ((( fBase.fFacetsDefined & FACET_MINEXCLUSIVE) != 0) &&
- fDVs[fValidationDV].compare(fMaxInclusive, fBase.fMinExclusive ) != 1)
- reportError( "maxInclusive-valid-restriction.1", new Object[]{fMaxInclusive, fBase.fMinExclusive, fTypeName});
- }
-
- // check 4.3.8.c3 error:
- // maxExclusive > fBase.maxExclusive
- // maxExclusive > fBase.maxInclusive
- // maxExclusive <= fBase.minInclusive
- // maxExclusive <= fBase.minExclusive
- if (((fFacetsDefined & FACET_MAXEXCLUSIVE) != 0)) {
- if ((( fBase.fFacetsDefined & FACET_MAXEXCLUSIVE) != 0)) {
- result= fDVs[fValidationDV].compare(fMaxExclusive, fBase.fMaxExclusive);
- if ((fBase.fFixedFacet & FACET_MAXEXCLUSIVE) != 0 && result != 0) {
- reportError( "FixedFacetValue", new Object[]{"maxExclusive", fMaxExclusive, fBase.fMaxExclusive, fTypeName});
- }
- if (result != -1 && result != 0) {
- reportError( "maxExclusive-valid-restriction.1", new Object[]{fMaxExclusive, fBase.fMaxExclusive, fTypeName});
- }
- }
-
- if ((( fBase.fFacetsDefined & FACET_MAXINCLUSIVE) != 0)) {
- result= fDVs[fValidationDV].compare(fMaxExclusive, fBase.fMaxInclusive);
- if (result != -1 && result != 0) {
- reportError( "maxExclusive-valid-restriction.2", new Object[]{fMaxExclusive, fBase.fMaxInclusive, fTypeName});
- }
- }
-
- if ((( fBase.fFacetsDefined & FACET_MINEXCLUSIVE) != 0) &&
- fDVs[fValidationDV].compare(fMaxExclusive, fBase.fMinExclusive ) != 1)
- reportError( "maxExclusive-valid-restriction.3", new Object[]{fMaxExclusive, fBase.fMinExclusive, fTypeName});
-
- if ((( fBase.fFacetsDefined & FACET_MININCLUSIVE) != 0) &&
- fDVs[fValidationDV].compare(fMaxExclusive, fBase.fMinInclusive) != 1)
- reportError( "maxExclusive-valid-restriction.4", new Object[]{fMaxExclusive, fBase.fMinInclusive, fTypeName});
- }
-
- // check 4.3.9.c3 error:
- // minExclusive < fBase.minExclusive
- // minExclusive > fBase.maxInclusive
- // minExclusive < fBase.minInclusive
- // minExclusive >= fBase.maxExclusive
- if (((fFacetsDefined & FACET_MINEXCLUSIVE) != 0)) {
- if ((( fBase.fFacetsDefined & FACET_MINEXCLUSIVE) != 0)) {
- result= fDVs[fValidationDV].compare(fMinExclusive, fBase.fMinExclusive);
- if ((fBase.fFixedFacet & FACET_MINEXCLUSIVE) != 0 && result != 0) {
- reportError( "FixedFacetValue", new Object[]{"minExclusive", fMinExclusive, fBase.fMinExclusive, fTypeName});
- }
- if (result != 1 && result != 0) {
- reportError( "minExclusive-valid-restriction.1", new Object[]{fMinExclusive, fBase.fMinExclusive, fTypeName});
- }
- }
-
- if ((( fBase.fFacetsDefined & FACET_MAXINCLUSIVE) != 0)) {
- result=fDVs[fValidationDV].compare(fMinExclusive, fBase.fMaxInclusive);
-
- if (result != -1 && result != 0) {
- reportError( "minExclusive-valid-restriction.2", new Object[]{fMinExclusive, fBase.fMaxInclusive, fTypeName});
- }
- }
-
- if ((( fBase.fFacetsDefined & FACET_MININCLUSIVE) != 0)) {
- result = fDVs[fValidationDV].compare(fMinExclusive, fBase.fMinInclusive);
-
- if (result != 1 && result != 0) {
- reportError( "minExclusive-valid-restriction.3", new Object[]{fMinExclusive, fBase.fMinInclusive, fTypeName});
- }
- }
-
- if ((( fBase.fFacetsDefined & FACET_MAXEXCLUSIVE) != 0) &&
- fDVs[fValidationDV].compare(fMinExclusive, fBase.fMaxExclusive) != -1)
- reportError( "minExclusive-valid-restriction.4", new Object[]{fMinExclusive, fBase.fMaxExclusive, fTypeName});
- }
-
- // check 4.3.10.c2 error:
- // minInclusive < fBase.minInclusive
- // minInclusive > fBase.maxInclusive
- // minInclusive <= fBase.minExclusive
- // minInclusive >= fBase.maxExclusive
- if (((fFacetsDefined & FACET_MININCLUSIVE) != 0)) {
- if (((fBase.fFacetsDefined & FACET_MININCLUSIVE) != 0)) {
- result = fDVs[fValidationDV].compare(fMinInclusive, fBase.fMinInclusive);
-
- if ((fBase.fFixedFacet & FACET_MININCLUSIVE) != 0 && result != 0) {
- reportError( "FixedFacetValue", new Object[]{"minInclusive", fMinInclusive, fBase.fMinInclusive, fTypeName});
- }
- if (result != 1 && result != 0) {
- reportError( "minInclusive-valid-restriction.1", new Object[]{fMinInclusive, fBase.fMinInclusive, fTypeName});
- }
- }
- if ((( fBase.fFacetsDefined & FACET_MAXINCLUSIVE) != 0)) {
- result=fDVs[fValidationDV].compare(fMinInclusive, fBase.fMaxInclusive);
- if (result != -1 && result != 0) {
- reportError( "minInclusive-valid-restriction.2", new Object[]{fMinInclusive, fBase.fMaxInclusive, fTypeName});
- }
- }
- if ((( fBase.fFacetsDefined & FACET_MINEXCLUSIVE) != 0) &&
- fDVs[fValidationDV].compare(fMinInclusive, fBase.fMinExclusive ) != 1)
- reportError( "minInclusive-valid-restriction.3", new Object[]{fMinInclusive, fBase.fMinExclusive, fTypeName});
- if ((( fBase.fFacetsDefined & FACET_MAXEXCLUSIVE) != 0) &&
- fDVs[fValidationDV].compare(fMinInclusive, fBase.fMaxExclusive) != -1)
- reportError( "minInclusive-valid-restriction.4", new Object[]{fMinInclusive, fBase.fMaxExclusive, fTypeName});
- }
- */
- // check 4.3.11.c1 error: totalDigits > fBase.totalDigits
- if (((fFacetsDefined & FACET_TOTALDIGITS) != 0)) {
- if ((( fBase.fFacetsDefined & FACET_TOTALDIGITS) != 0)) {
- if ((fBase.fFixedFacet & FACET_TOTALDIGITS) != 0 && fTotalDigits != fBase.fTotalDigits) {
- reportError("FixedFacetValue", new Object[]{"totalDigits", Integer.toString(fTotalDigits), Integer.toString(fBase.fTotalDigits), fTypeName});
- }
- if (fTotalDigits > fBase.fTotalDigits) {
- reportError( "totalDigits-valid-restriction", new Object[]{Integer.toString(fTotalDigits), Integer.toString(fBase.fTotalDigits), fTypeName});
- }
- }
- }
-
- // check 4.3.12.c1 must: fractionDigits <= base.totalDigits
- if ((fFacetsDefined & FACET_FRACTIONDIGITS) != 0) {
- if ((fBase.fFacetsDefined & FACET_TOTALDIGITS) != 0) {
- if (fFractionDigits > fBase.fTotalDigits)
- reportError( "fractionDigits-totalDigits", new Object[]{Integer.toString(fFractionDigits), Integer.toString(fTotalDigits), fTypeName});
- }
- }
-
- // check 4.3.12.c2 error: fractionDigits > fBase.fractionDigits
- // check fixed value for fractionDigits
- if (((fFacetsDefined & FACET_FRACTIONDIGITS) != 0)) {
- if ((( fBase.fFacetsDefined & FACET_FRACTIONDIGITS) != 0)) {
- if ((fBase.fFixedFacet & FACET_FRACTIONDIGITS) != 0 && fFractionDigits != fBase.fFractionDigits) {
- reportError("FixedFacetValue", new Object[]{"fractionDigits", Integer.toString(fFractionDigits), Integer.toString(fBase.fFractionDigits), fTypeName});
- }
- if (fFractionDigits > fBase.fFractionDigits) {
- reportError( "fractionDigits-valid-restriction", new Object[]{Integer.toString(fFractionDigits), Integer.toString(fBase.fFractionDigits), fTypeName});
- }
- }
- }
-
- // check 4.3.6.c1 error:
- // (whiteSpace = preserve || whiteSpace = replace) && fBase.whiteSpace = collapese or
- // whiteSpace = preserve && fBase.whiteSpace = replace
-
- if ( (fFacetsDefined & FACET_WHITESPACE) != 0 && (fBase.fFacetsDefined & FACET_WHITESPACE) != 0 ){
- if ( (fBase.fFixedFacet & FACET_WHITESPACE) != 0 && fWhiteSpace != fBase.fWhiteSpace ) {
- reportError( "FixedFacetValue", new Object[]{"whiteSpace", whiteSpaceValue(fWhiteSpace), whiteSpaceValue(fBase.fWhiteSpace), fTypeName});
- }
-
- if ( fWhiteSpace == WS_PRESERVE && fBase.fWhiteSpace == WS_COLLAPSE ){
- reportError( "whiteSpace-valid-restriction.1", new Object[]{fTypeName, "preserve"});
- }
- if ( fWhiteSpace == WS_REPLACE && fBase.fWhiteSpace == WS_COLLAPSE ){
- reportError( "whiteSpace-valid-restriction.1", new Object[]{fTypeName, "replace"});
- }
- if ( fWhiteSpace == WS_PRESERVE && fBase.fWhiteSpace == WS_REPLACE ){
- reportError( "whiteSpace-valid-restriction.2", new Object[]{fTypeName});
- }
- }
- }//fFacetsDefined != null
-
- // step 4: inherit other facets from base (including fTokeyType)
-
- // inherit length
- if ( (fFacetsDefined & FACET_LENGTH) == 0 && (fBase.fFacetsDefined & FACET_LENGTH) != 0 ) {
- fFacetsDefined |= FACET_LENGTH;
- fLength = fBase.fLength;
- lengthAnnotation = fBase.lengthAnnotation;
- }
- // inherit minLength
- if ( (fFacetsDefined & FACET_MINLENGTH) == 0 && (fBase.fFacetsDefined & FACET_MINLENGTH) != 0 ) {
- fFacetsDefined |= FACET_MINLENGTH;
- fMinLength = fBase.fMinLength;
- minLengthAnnotation = fBase.minLengthAnnotation;
- }
- // inherit maxLength
- if ((fFacetsDefined & FACET_MAXLENGTH) == 0 && (fBase.fFacetsDefined & FACET_MAXLENGTH) != 0 ) {
- fFacetsDefined |= FACET_MAXLENGTH;
- fMaxLength = fBase.fMaxLength;
- maxLengthAnnotation = fBase.maxLengthAnnotation;
- }
- // inherit pattern
- if ( (fBase.fFacetsDefined & FACET_PATTERN) != 0 ) {
- if ((fFacetsDefined & FACET_PATTERN) == 0) {
- fPattern = fBase.fPattern;
- fPatternStr = fBase.fPatternStr;
- fFacetsDefined |= FACET_PATTERN;
- }
- else {
- for (int i = fBase.fPattern.size()-1; i >= 0; i--) {
- fPattern.addElement(fBase.fPattern.elementAt(i));
- fPatternStr.addElement(fBase.fPatternStr.elementAt(i));
- }
- if (fBase.patternAnnotations != null){
- for (int i = fBase.patternAnnotations.getLength()-1;i>=0;i--){
- patternAnnotations.add(fBase.patternAnnotations.item(i));
- }
- }
- }
- }
- // inherit whiteSpace
- if ( (fFacetsDefined & FACET_WHITESPACE) == 0 && (fBase.fFacetsDefined & FACET_WHITESPACE) != 0 ) {
- fFacetsDefined |= FACET_WHITESPACE;
- fWhiteSpace = fBase.fWhiteSpace;
- whiteSpaceAnnotation = fBase.whiteSpaceAnnotation;
- }
- // inherit enumeration
- if ((fFacetsDefined & FACET_ENUMERATION) == 0 && (fBase.fFacetsDefined & FACET_ENUMERATION) != 0) {
- fFacetsDefined |= FACET_ENUMERATION;
- fEnumeration = fBase.fEnumeration;
- enumerationAnnotations = fBase.enumerationAnnotations;
- }
- // inherit maxExclusive
- if ((( fBase.fFacetsDefined & FACET_MAXEXCLUSIVE) != 0) &&
- !((fFacetsDefined & FACET_MAXEXCLUSIVE) != 0) && !((fFacetsDefined & FACET_MAXINCLUSIVE) != 0)) {
- fFacetsDefined |= FACET_MAXEXCLUSIVE;
- fMaxExclusive = fBase.fMaxExclusive;
- maxExclusiveAnnotation = fBase.maxExclusiveAnnotation;
- }
- // inherit maxInclusive
- if ((( fBase.fFacetsDefined & FACET_MAXINCLUSIVE) != 0) &&
- !((fFacetsDefined & FACET_MAXEXCLUSIVE) != 0) && !((fFacetsDefined & FACET_MAXINCLUSIVE) != 0)) {
- fFacetsDefined |= FACET_MAXINCLUSIVE;
- fMaxInclusive = fBase.fMaxInclusive;
- maxInclusiveAnnotation = fBase.maxInclusiveAnnotation;
- }
- // inherit minExclusive
- if ((( fBase.fFacetsDefined & FACET_MINEXCLUSIVE) != 0) &&
- !((fFacetsDefined & FACET_MINEXCLUSIVE) != 0) && !((fFacetsDefined & FACET_MININCLUSIVE) != 0)) {
- fFacetsDefined |= FACET_MINEXCLUSIVE;
- fMinExclusive = fBase.fMinExclusive;
- minExclusiveAnnotation = fBase.minExclusiveAnnotation;
- }
- // inherit minExclusive
- if ((( fBase.fFacetsDefined & FACET_MININCLUSIVE) != 0) &&
- !((fFacetsDefined & FACET_MINEXCLUSIVE) != 0) && !((fFacetsDefined & FACET_MININCLUSIVE) != 0)) {
- fFacetsDefined |= FACET_MININCLUSIVE;
- fMinInclusive = fBase.fMinInclusive;
- minInclusiveAnnotation = fBase.minInclusiveAnnotation;
- }
- // inherit totalDigits
- if ((( fBase.fFacetsDefined & FACET_TOTALDIGITS) != 0) &&
- !((fFacetsDefined & FACET_TOTALDIGITS) != 0)) {
- fFacetsDefined |= FACET_TOTALDIGITS;
- fTotalDigits = fBase.fTotalDigits;
- totalDigitsAnnotation = fBase.totalDigitsAnnotation;
- }
- // inherit fractionDigits
- if ((( fBase.fFacetsDefined & FACET_FRACTIONDIGITS) != 0)
- && !((fFacetsDefined & FACET_FRACTIONDIGITS) != 0)) {
- fFacetsDefined |= FACET_FRACTIONDIGITS;
- fFractionDigits = fBase.fFractionDigits;
- fractionDigitsAnnotation = fBase.fractionDigitsAnnotation;
- }
- //inherit tokeytype
- if ((fPatternType == SPECIAL_PATTERN_NONE ) && (fBase.fPatternType != SPECIAL_PATTERN_NONE)) {
- fPatternType = fBase.fPatternType ;
- }
-
- // step 5: mark fixed values
- fFixedFacet |= fBase.fFixedFacet;
-
- //step 6: setting fundamental facets
- caclFundamentalFacets();
-
- } //applyFacets()
-
- /**
- * validate a value, and return the compiled form
- */
- public Object validate(String content, ValidationContext context, ValidatedInfo validatedInfo) throws InvalidDatatypeValueException {
-
- if (context == null)
- context = fEmptyContext;
-
- if (validatedInfo == null)
- validatedInfo = new ValidatedInfo();
- else
- validatedInfo.memberType = null;
-
- // first normalize string value, and convert it to actual value
- boolean needNormalize = context==null||context.needToNormalize();
- Object ob = getActualValue(content, context, validatedInfo, needNormalize);
-
- validate(context, validatedInfo);
-
- return ob;
-
- }
-
- /**
- * validate a value, and return the compiled form
- */
- public Object validate(Object content, ValidationContext context, ValidatedInfo validatedInfo) throws InvalidDatatypeValueException {
-
- if (context == null)
- context = fEmptyContext;
-
- if (validatedInfo == null)
- validatedInfo = new ValidatedInfo();
- else
- validatedInfo.memberType = null;
-
- // first normalize string value, and convert it to actual value
- boolean needNormalize = context==null||context.needToNormalize();
- Object ob = getActualValue(content, context, validatedInfo, needNormalize);
-
- validate(context, validatedInfo);
-
- return ob;
-
- }
-
- /**
- * validate an actual value against this DV
- *
- * @param value the actual value that needs to be validated
- * @param context the validation context
- * @param validatedInfo used to provide the actual value and member types
- */
- public void validate(ValidationContext context, ValidatedInfo validatedInfo)
- throws InvalidDatatypeValueException {
-
- if (context == null)
- context = fEmptyContext;
-
- // then validate the actual value against the facets
- if (context.needFacetChecking() &&
- (fFacetsDefined != 0 && fFacetsDefined != FACET_WHITESPACE)) {
- checkFacets(validatedInfo);
- }
-
- // now check extra rules: for ID/IDREF/ENTITY
- if (context.needExtraChecking()) {
- checkExtraRules(context, validatedInfo);
- }
-
- }
-
- private void checkFacets(ValidatedInfo validatedInfo) throws InvalidDatatypeValueException {
-
- Object ob = validatedInfo.actualValue;
- String content = validatedInfo.normalizedValue;
-
- // For QName and NOTATION types, we don't check length facets
- if (fValidationDV != DV_QNAME && fValidationDV != DV_NOTATION) {
- int length = fDVs[fValidationDV].getDataLength(ob);
-
- // maxLength
- if ( (fFacetsDefined & FACET_MAXLENGTH) != 0 ) {
- if ( length > fMaxLength ) {
- throw new InvalidDatatypeValueException("cvc-maxLength-valid",
- new Object[]{content, Integer.toString(length), Integer.toString(fMaxLength), fTypeName});
- }
- }
-
- //minLength
- if ( (fFacetsDefined & FACET_MINLENGTH) != 0 ) {
- if ( length < fMinLength ) {
- throw new InvalidDatatypeValueException("cvc-minLength-valid",
- new Object[]{content, Integer.toString(length), Integer.toString(fMinLength), fTypeName});
- }
- }
-
- //length
- if ( (fFacetsDefined & FACET_LENGTH) != 0 ) {
- if ( length != fLength ) {
- throw new InvalidDatatypeValueException("cvc-length-valid",
- new Object[]{content, Integer.toString(length), Integer.toString(fLength), fTypeName});
- }
- }
- }
-
- //enumeration
- if ( ((fFacetsDefined & FACET_ENUMERATION) != 0 ) ) {
- boolean present = false;
- for (int i = 0; i < fEnumeration.size(); i++) {
- if (fEnumeration.elementAt(i).equals(ob)) {
- present = true;
- break;
- }
- }
- if(!present){
- throw new InvalidDatatypeValueException("cvc-enumeration-valid",
- new Object [] {content, fEnumeration.toString()});
- }
- }
-
- //fractionDigits
- if ((fFacetsDefined & FACET_FRACTIONDIGITS) != 0) {
- int scale = fDVs[fValidationDV].getFractionDigits(ob);
- if (scale > fFractionDigits) {
- throw new InvalidDatatypeValueException("cvc-fractionDigits-valid",
- new Object[] {content, Integer.toString(scale), Integer.toString(fFractionDigits)});
- }
- }
-
- //totalDigits
- if ((fFacetsDefined & FACET_TOTALDIGITS)!=0) {
- int totalDigits = fDVs[fValidationDV].getTotalDigits(ob);
- if (totalDigits > fTotalDigits) {
- throw new InvalidDatatypeValueException("cvc-totalDigits-valid",
- new Object[] {content, Integer.toString(totalDigits), Integer.toString(fTotalDigits)});
- }
- }
-
- int compare;
-
- //maxinclusive
- if ( (fFacetsDefined & FACET_MAXINCLUSIVE) != 0 ) {
- compare = fDVs[fValidationDV].compare(ob, fMaxInclusive);
- if (compare != -1 && compare != 0) {
- throw new InvalidDatatypeValueException("cvc-maxInclusive-valid",
- new Object[] {content, fMaxInclusive, fTypeName});
- }
- }
-
- //maxExclusive
- if ( (fFacetsDefined & FACET_MAXEXCLUSIVE) != 0 ) {
- compare = fDVs[fValidationDV].compare(ob, fMaxExclusive );
- if (compare != -1) {
- throw new InvalidDatatypeValueException("cvc-maxExclusive-valid",
- new Object[] {content, fMaxExclusive, fTypeName});
- }
- }
-
- //minInclusive
- if ( (fFacetsDefined & FACET_MININCLUSIVE) != 0 ) {
- compare = fDVs[fValidationDV].compare(ob, fMinInclusive);
- if (compare != 1 && compare != 0) {
- throw new InvalidDatatypeValueException("cvc-minInclusive-valid",
- new Object[] {content, fMinInclusive, fTypeName});
- }
- }
-
- //minExclusive
- if ( (fFacetsDefined & FACET_MINEXCLUSIVE) != 0 ) {
- compare = fDVs[fValidationDV].compare(ob, fMinExclusive);
- if (compare != 1) {
- throw new InvalidDatatypeValueException("cvc-minExclusive-valid",
- new Object[] {content, fMinExclusive, fTypeName});
- }
- }
-
- }
-
- private void checkExtraRules(ValidationContext context, ValidatedInfo validatedInfo) throws InvalidDatatypeValueException {
-
- Object ob = validatedInfo.actualValue;
-
- if (fVariety == VARIETY_ATOMIC) {
-
- fDVs[fValidationDV].checkExtraRules(ob, context);
-
- } else if (fVariety == VARIETY_LIST) {
-
- ListDV.ListData values = (ListDV.ListData)ob;
- int len = values.length();
- if (fItemType.fVariety == VARIETY_UNION) {
- XSSimpleTypeDecl[] memberTypes = (XSSimpleTypeDecl[])validatedInfo.memberTypes;
- XSSimpleType memberType = validatedInfo.memberType;
- for (int i = len-1; i >= 0; i--) {
- validatedInfo.actualValue = values.item(i);
- validatedInfo.memberType = memberTypes[i];
- fItemType.checkExtraRules(context, validatedInfo);
- }
- validatedInfo.memberType = memberType;
- } else { // (fVariety == VARIETY_ATOMIC)
- for (int i = len-1; i >= 0; i--) {
- validatedInfo.actualValue = values.item(i);
- fItemType.checkExtraRules(context, validatedInfo);
- }
- }
- validatedInfo.actualValue = values;
-
- } else { // (fVariety == VARIETY_UNION)
-
- ((XSSimpleTypeDecl)validatedInfo.memberType).checkExtraRules(context, validatedInfo);
-
- }
-
- }// checkExtraRules()
-
- //we can still return object for internal use.
- private Object getActualValue(Object content, ValidationContext context,
- ValidatedInfo validatedInfo, boolean needNormalize)
- throws InvalidDatatypeValueException{
-
- String nvalue;
- if (needNormalize) {
- nvalue = normalize(content, fWhiteSpace);
- } else {
- nvalue = content.toString();
- }
- if ( (fFacetsDefined & FACET_PATTERN ) != 0 ) {
- RegularExpression regex;
- for (int idx = fPattern.size()-1; idx >= 0; idx--) {
- regex = (RegularExpression)fPattern.elementAt(idx);
- if (!regex.matches(nvalue)){
- throw new InvalidDatatypeValueException("cvc-pattern-valid",
- new Object[]{content,
- fPatternStr.elementAt(idx),
-
- fTypeName});
- }
- }
- }
-
- if (fVariety == VARIETY_ATOMIC) {
-
- // validate special kinds of token, in place of old pattern matching
- if (fPatternType != SPECIAL_PATTERN_NONE) {
-
- boolean seenErr = false;
- if (fPatternType == SPECIAL_PATTERN_NMTOKEN) {
- // PATTERN "\\c+"
- seenErr = !XMLChar.isValidNmtoken(nvalue);
- }
- else if (fPatternType == SPECIAL_PATTERN_NAME) {
- // PATTERN "\\i\\c*"
- seenErr = !XMLChar.isValidName(nvalue);
- }
- else if (fPatternType == SPECIAL_PATTERN_NCNAME) {
- // PATTERN "[\\i-[:]][\\c-[:]]*"
- seenErr = !XMLChar.isValidNCName(nvalue);
- }
- if (seenErr) {
- throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.1",
- new Object[]{nvalue, SPECIAL_PATTERN_STRING[fPatternType]});
- }
- }
-
- validatedInfo.normalizedValue = nvalue;
- Object avalue = fDVs[fValidationDV].getActualValue(nvalue, context);
- validatedInfo.actualValue = avalue;
- validatedInfo.actualValueType = fBuiltInKind;
-
- return avalue;
-
- } else if (fVariety == VARIETY_LIST) {
-
- StringTokenizer parsedList = new StringTokenizer(nvalue, " ");
- int countOfTokens = parsedList.countTokens() ;
- Object[] avalue = new Object[countOfTokens];
- boolean isUnion = fItemType.getVariety() == VARIETY_UNION;
- short[] itemTypes = new short[isUnion ? countOfTokens : 1];
- if (!isUnion)
- itemTypes[0] = fItemType.fBuiltInKind;
- XSSimpleTypeDecl[] memberTypes = new XSSimpleTypeDecl[countOfTokens];
- for(int i = 0 ; i < countOfTokens ; i ++){
- // we can't call fItemType.validate(), otherwise checkExtraRules()
- // will be called twice: once in fItemType.validate, once in
- // validate method of this type.
- // so we take two steps to get the actual value:
- // 1. fItemType.getActualValue()
- // 2. fItemType.chekcFacets()
- avalue[i] = fItemType.getActualValue(parsedList.nextToken(), context, validatedInfo, false);
- if (context.needFacetChecking() &&
- (fItemType.fFacetsDefined != 0 && fItemType.fFacetsDefined != FACET_WHITESPACE)) {
- fItemType.checkFacets(validatedInfo);
- }
- memberTypes[i] = (XSSimpleTypeDecl)validatedInfo.memberType;
- if (isUnion)
- itemTypes[i] = memberTypes[i].fBuiltInKind;
- }
-
- ListDV.ListData v = new ListDV.ListData(avalue);
- validatedInfo.actualValue = v;
- validatedInfo.actualValueType = isUnion ? XSConstants.LISTOFUNION_DT : XSConstants.LIST_DT;
- validatedInfo.memberType = null;
- validatedInfo.memberTypes = memberTypes;
- validatedInfo.itemValueTypes = new ShortListImpl(itemTypes, itemTypes.length);
- validatedInfo.normalizedValue = nvalue;
-
- return v;
-
- } else { // (fVariety == VARIETY_UNION)
- for(int i = 0 ; i < fMemberTypes.length; i++) {
- try {
- // we can't call fMemberType[i].validate(), otherwise checkExtraRules()
- // will be called twice: once in fMemberType[i].validate, once in
- // validate method of this type.
- // so we take two steps to get the actual value:
- // 1. fMemberType[i].getActualValue()
- // 2. fMemberType[i].chekcFacets()
- Object aValue = fMemberTypes[i].getActualValue(content, context, validatedInfo, true);
- if (context.needFacetChecking() &&
- (fMemberTypes[i].fFacetsDefined != 0 && fMemberTypes[i].fFacetsDefined != FACET_WHITESPACE)) {
- fMemberTypes[i].checkFacets(validatedInfo);
- }
- validatedInfo.memberType = fMemberTypes[i];
- return aValue;
- } catch(InvalidDatatypeValueException invalidValue) {
- }
- }
-
- throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.2",
- new Object[]{content, fTypeName});
- }
-
- }//getActualValue()
-
- public boolean isEqual(Object value1, Object value2) {
- if (value1 == null)
- return false;
- return value1.equals(value2);
- }//isEqual()
-
- // normalize the string according to the whiteSpace facet
- public static String normalize(String content, short ws) {
- int len = content == null ? 0 : content.length();
- if (len == 0 || ws == WS_PRESERVE)
- return content;
-
- StringBuffer sb = new StringBuffer();
- if (ws == WS_REPLACE) {
- char ch;
- // when it's replace, just replace #x9, #xa, #xd by #x20
- for (int i = 0; i < len; i++) {
- ch = content.charAt(i);
- if (ch != 0x9 && ch != 0xa && ch != 0xd)
- sb.append(ch);
- else
- sb.append((char)0x20);
- }
- } else {
- char ch;
- int i;
- boolean isLeading = true;
- // when it's collapse
- for (i = 0; i < len; i++) {
- ch = content.charAt(i);
- // append real characters, so we passed leading ws
- if (ch != 0x9 && ch != 0xa && ch != 0xd && ch != 0x20) {
- sb.append(ch);
- isLeading = false;
- }
- else {
- // for whitespaces, we skip all following ws
- for (; i < len-1; i++) {
- ch = content.charAt(i+1);
- if (ch != 0x9 && ch != 0xa && ch != 0xd && ch != 0x20)
- break;
- }
- // if it's not a leading or tailing ws, then append a space
- if (i < len - 1 && !isLeading)
- sb.append((char)0x20);
- }
- }
- }
-
- return sb.toString();
- }
-
- // normalize the string according to the whiteSpace facet
- protected String normalize(Object content, short ws) {
- if (content == null)
- return null;
-
- // If pattern is not defined, we can skip some of the normalization.
- // Otherwise we have to normalize the data for correct result of
- // pattern validation.
- if ( (fFacetsDefined & FACET_PATTERN ) == 0 ) {
- short norm_type = fDVNormalizeType[fValidationDV];
- if (norm_type == NORMALIZE_NONE) {
- return content.toString();
- }
- else if (norm_type == NORMALIZE_TRIM) {
- return content.toString().trim();
- }
- }
-
- if (!(content instanceof StringBuffer)) {
- String strContent = content.toString();
- return normalize(strContent, ws);
- }
-
- StringBuffer sb = (StringBuffer)content;
- int len = sb.length();
- if (len == 0)
- return "";
- if (ws == WS_PRESERVE)
- return sb.toString();
-
- if (ws == WS_REPLACE) {
- char ch;
- // when it's replace, just replace #x9, #xa, #xd by #x20
- for (int i = 0; i < len; i++) {
- ch = sb.charAt(i);
- if (ch == 0x9 || ch == 0xa || ch == 0xd)
- sb.setCharAt(i, (char)0x20);
- }
- } else {
- char ch;
- int i, j = 0;
- boolean isLeading = true;
- // when it's collapse
- for (i = 0; i < len; i++) {
- ch = sb.charAt(i);
- // append real characters, so we passed leading ws
- if (ch != 0x9 && ch != 0xa && ch != 0xd && ch != 0x20) {
- sb.setCharAt(j++, ch);
- isLeading = false;
- }
- else {
- // for whitespaces, we skip all following ws
- for (; i < len-1; i++) {
- ch = sb.charAt(i+1);
- if (ch != 0x9 && ch != 0xa && ch != 0xd && ch != 0x20)
- break;
- }
- // if it's not a leading or tailing ws, then append a space
- if (i < len - 1 && !isLeading)
- sb.setCharAt(j++, (char)0x20);
- }
- }
- sb.setLength(j);
- }
-
- return sb.toString();
- }
-
- void reportError(String key, Object[] args) throws InvalidDatatypeFacetException {
- throw new InvalidDatatypeFacetException(key, args);
- }
-
-
- private String whiteSpaceValue(short ws){
- return WS_FACET_STRING[ws];
- }
-
- public short getOrdered() {
- return fOrdered;
- }
-
- public boolean getBounded(){
- return fBounded;
- }
-
- public boolean getFinite(){
- return fFinite;
- }
-
- public boolean getNumeric(){
- return fNumeric;
- }
-
- public boolean isDefinedFacet(short facetName) {
- if ((fFacetsDefined & facetName) != 0)
- return true;
- if (fPatternType != SPECIAL_PATTERN_NONE)
- return facetName == FACET_PATTERN;
- if (fValidationDV == DV_INTEGER)
- return facetName == FACET_PATTERN || facetName == FACET_FRACTIONDIGITS;
- return false;
- }
-
- public short getDefinedFacets() {
- if (fPatternType != SPECIAL_PATTERN_NONE)
- return (short)(fFacetsDefined | FACET_PATTERN);
- if (fValidationDV == DV_INTEGER)
- return (short)(fFacetsDefined | FACET_PATTERN | FACET_FRACTIONDIGITS);
- return fFacetsDefined;
- }
-
- public boolean isFixedFacet(short facetName) {
- if ((fFixedFacet & facetName) != 0)
- return true;
- if (fValidationDV == DV_INTEGER)
- return facetName == FACET_FRACTIONDIGITS;
- return false;
- }
-
- public short getFixedFacets() {
- if (fValidationDV == DV_INTEGER)
- return (short)(fFixedFacet | FACET_FRACTIONDIGITS);
- return fFixedFacet;
- }
-
- public String getLexicalFacetValue(short facetName) {
- switch (facetName) {
- case FACET_LENGTH:
- return (fLength == -1)?null:Integer.toString(fLength);
- case FACET_MINLENGTH:
- return (fMinLength == -1)?null:Integer.toString(fMinLength);
- case FACET_MAXLENGTH:
- return (fMaxLength == -1)?null:Integer.toString(fMaxLength);
- case FACET_WHITESPACE:
- return WS_FACET_STRING[fWhiteSpace];
- case FACET_MAXINCLUSIVE:
- return (fMaxInclusive == null)?null:fMaxInclusive.toString();
- case FACET_MAXEXCLUSIVE:
- return (fMaxExclusive == null)?null:fMaxExclusive.toString();
- case FACET_MINEXCLUSIVE:
- return (fMinExclusive == null)?null:fMinExclusive.toString();
- case FACET_MININCLUSIVE:
- return (fMinInclusive == null)?null:fMinInclusive.toString();
- case FACET_TOTALDIGITS:
- if (fValidationDV == DV_INTEGER)
- return "0";
- return (fTotalDigits == -1)?null:Integer.toString(fTotalDigits);
- case FACET_FRACTIONDIGITS:
- return (fFractionDigits == -1)?null:Integer.toString(fFractionDigits);
- }
- return null;
- }
-
- public StringList getLexicalEnumeration() {
- if (fLexicalEnumeration == null){
- if (fEnumeration == null)
- return null;
- int size = fEnumeration.size();
- String[] strs = new String[size];
- for (int i = 0; i < size; i++)
- strs[i] = fEnumeration.elementAt(i).toString();
- fLexicalEnumeration = new StringListImpl(strs, size);
- }
- return fLexicalEnumeration;
- }
-
- public StringList getLexicalPattern() {
- if (fPatternType == SPECIAL_PATTERN_NONE && fValidationDV != DV_INTEGER && fPatternStr == null)
- return null;
- if (fLexicalPattern == null){
- int size = fPatternStr == null ? 0 : fPatternStr.size();
- String[] strs;
- if (fPatternType == SPECIAL_PATTERN_NMTOKEN) {
- strs = new String[size+1];
- strs[size] = "\\c+";
- }
- else if (fPatternType == SPECIAL_PATTERN_NAME) {
- strs = new String[size+1];
- strs[size] = "\\i\\c*";
- }
- else if (fPatternType == SPECIAL_PATTERN_NCNAME) {
- strs = new String[size+2];
- strs[size] = "\\i\\c*";
- strs[size+1] = "[\\i-[:]][\\c-[:]]*";
- }
- else if (fValidationDV == DV_INTEGER) {
- strs = new String[size+1];
- strs[size] = "[+\\-]?[0-9]+";
- }
- else {
- strs = new String[size];
- }
- for (int i = 0; i < size; i++)
- strs[i] = (String)fPatternStr.elementAt(i);
- fLexicalPattern = new StringListImpl(strs, size);
- }
- return fLexicalPattern;
- }
-
- public XSObjectList getAnnotations() {
- return fAnnotations;
- }
-
- private void caclFundamentalFacets() {
- setOrdered();
- setNumeric();
- setBounded();
- setCardinality();
- }
-
- private void setOrdered(){
-
- // When {variety} is atomic, {value} is inherited from {value} of {base type definition}. For all "primitive" types {value} is as specified in the table in Fundamental Facets (C.1).
- if(fVariety == VARIETY_ATOMIC){
- this.fOrdered = fBase.fOrdered;
- }
-
- // When {variety} is list, {value} is false.
- else if(fVariety == VARIETY_LIST){
- this.fOrdered = ORDERED_FALSE;
- }
-
- // When {variety} is union, the {value} is partial unless one of the following:
- // 1. If every member of {member type definitions} is derived from a common ancestor other than the simple ur-type, then {value} is the same as that ancestor's ordered facet.
- // 2. If every member of {member type definitions} has a {value} of false for the ordered facet, then {value} is false.
- else if(fVariety == VARIETY_UNION){
- int length = fMemberTypes.length;
- // REVISIT: is the length possible to be 0?
- if (length == 0) {
- this.fOrdered = ORDERED_PARTIAL;
- return;
- }
- // we need to process the first member type before entering the loop
- short ancestorId = getPrimitiveDV(fMemberTypes[0].fValidationDV);
- boolean commonAnc = ancestorId != DV_ANYSIMPLETYPE;
- boolean allFalse = fMemberTypes[0].fOrdered == ORDERED_FALSE;
- // for the other member types, check whether the value is false
- // and whether they have the same ancestor as the first one
- for (int i = 1; i < fMemberTypes.length && (commonAnc || allFalse); i++) {
- if (commonAnc)
- commonAnc = ancestorId == getPrimitiveDV(fMemberTypes[i].fValidationDV);
- if (allFalse)
- allFalse = fMemberTypes[i].fOrdered == ORDERED_FALSE;
- }
- if (commonAnc) {
- // REVISIT: all member types should have the same ordered value
- // just use the first one. Can we assume this?
- this.fOrdered = fMemberTypes[0].fOrdered;
- } else if (allFalse) {
- this.fOrdered = ORDERED_FALSE;
- } else {
- this.fOrdered = ORDERED_PARTIAL;
- }
- }
-
- }//setOrdered
-
- private void setNumeric(){
- if(fVariety == VARIETY_ATOMIC){
- this.fNumeric = fBase.fNumeric;
- }
- else if(fVariety == VARIETY_LIST){
- this.fNumeric = false;
- }
- else if(fVariety == VARIETY_UNION){
- XSSimpleType[] memberTypes = fMemberTypes;
- for(int i = 0 ; i < memberTypes.length ; i++){
- if(!memberTypes[i].getNumeric() ){
- this.fNumeric = false;
- return;
- }
- }
- this.fNumeric = true;
- }
-
- }//setNumeric
-
- private void setBounded(){
- if(fVariety == VARIETY_ATOMIC){
- if( (((this.fFacetsDefined & FACET_MININCLUSIVE) != 0) || ((this.fFacetsDefined & FACET_MINEXCLUSIVE) != 0))
- && (((this.fFacetsDefined & FACET_MAXINCLUSIVE) != 0) || ((this.fFacetsDefined & FACET_MAXEXCLUSIVE) != 0)) ){
- this.fBounded = true;
- }
- else{
- this.fBounded = false;
- }
- }
- else if(fVariety == VARIETY_LIST){
- if( ((this.fFacetsDefined & FACET_LENGTH) != 0 ) || ( ((this.fFacetsDefined & FACET_MINLENGTH) != 0 )
- && ((this.fFacetsDefined & FACET_MAXLENGTH) != 0 )) ){
- this.fBounded = true;
- }
- else{
- this.fBounded = false;
- }
-
- }
- else if(fVariety == VARIETY_UNION){
-
- XSSimpleTypeDecl [] memberTypes = this.fMemberTypes;
- short ancestorId = 0 ;
-
- if(memberTypes.length > 0){
- ancestorId = getPrimitiveDV(memberTypes[0].fValidationDV);
- }
-
- for(int i = 0 ; i < memberTypes.length ; i++){
- if(!memberTypes[i].getBounded() || (ancestorId != getPrimitiveDV(memberTypes[i].fValidationDV)) ){
- this.fBounded = false;
- return;
- }
- }
- this.fBounded = true;
- }
-
- }//setBounded
-
- private boolean specialCardinalityCheck(){
- if( (fBase.fValidationDV == XSSimpleTypeDecl.DV_DATE) || (fBase.fValidationDV == XSSimpleTypeDecl.DV_GYEARMONTH)
- || (fBase.fValidationDV == XSSimpleTypeDecl.DV_GYEAR) || (fBase.fValidationDV == XSSimpleTypeDecl.DV_GMONTHDAY)
- || (fBase.fValidationDV == XSSimpleTypeDecl.DV_GDAY) || (fBase.fValidationDV == XSSimpleTypeDecl.DV_GMONTH) ){
- return true;
- }
- return false;
-
- } //specialCardinalityCheck()
-
- private void setCardinality(){
- if(fVariety == VARIETY_ATOMIC){
- if(fBase.fFinite){
- this.fFinite = true;
- }
- else {// (!fBase.fFinite)
- if ( ((this.fFacetsDefined & FACET_LENGTH) != 0 ) || ((this.fFacetsDefined & FACET_MAXLENGTH) != 0 )
- || ((this.fFacetsDefined & FACET_TOTALDIGITS) != 0 ) ){
- this.fFinite = true;
- }
- else if( (((this.fFacetsDefined & FACET_MININCLUSIVE) != 0 ) || ((this.fFacetsDefined & FACET_MINEXCLUSIVE) != 0 ))
- && (((this.fFacetsDefined & FACET_MAXINCLUSIVE) != 0 ) || ((this.fFacetsDefined & FACET_MAXEXCLUSIVE) != 0 )) ){
- if( ((this.fFacetsDefined & FACET_FRACTIONDIGITS) != 0 ) || specialCardinalityCheck()){
- this.fFinite = true;
- }
- else{
- this.fFinite = false;
- }
- }
- else{
- this.fFinite = false;
- }
- }
- }
- else if(fVariety == VARIETY_LIST){
- if( ((this.fFacetsDefined & FACET_LENGTH) != 0 ) || ( ((this.fFacetsDefined & FACET_MINLENGTH) != 0 )
- && ((this.fFacetsDefined & FACET_MAXLENGTH) != 0 )) ){
- this.fFinite = true;
- }
- else{
- this.fFinite = false;
- }
-
- }
- else if(fVariety == VARIETY_UNION){
- XSSimpleType [] memberTypes = fMemberTypes;
- for(int i = 0 ; i < memberTypes.length ; i++){
- if(!(memberTypes[i].getFinite()) ){
- this.fFinite = false;
- return;
- }
- }
- this.fFinite = true;
- }
-
- }//setCardinality
-
- private short getPrimitiveDV(short validationDV){
-
- if (validationDV == DV_ID || validationDV == DV_IDREF || validationDV == DV_ENTITY){
- return DV_STRING;
- }
- else if (validationDV == DV_INTEGER) {
- return DV_DECIMAL;
- }
- else {
- return validationDV;
- }
-
- }//getPrimitiveDV()
-
- public boolean derivedFromType(XSTypeDefinition ancestor, short derivation) {
- // REVISIT: implement according to derivation
-
- // ancestor is null, retur false
- if (ancestor == null)
- return false;
- // ancestor is anyType, return true
- // anyType is the only type whose base type is itself
- if (ancestor.getBaseType() == ancestor)
- return true;
- // recursively get base, and compare it with ancestor
- XSTypeDefinition type = this;
- while (type != ancestor && // compare with ancestor
- type != fAnySimpleType) { // reached anySimpleType
- type = type.getBaseType();
- }
-
- return type == ancestor;
- }
-
- public boolean derivedFrom(String ancestorNS, String ancestorName, short derivation) {
- // REVISIT: implement according to derivation
-
- // ancestor is null, retur false
- if (ancestorName == null)
- return false;
- // ancestor is anyType, return true
- if (URI_SCHEMAFORSCHEMA.equals(ancestorNS) &&
- ANY_TYPE.equals(ancestorName)) {
- return true;
- }
-
- // recursively get base, and compare it with ancestor
- XSTypeDefinition type = this;
- while (!(ancestorName.equals(type.getName()) &&
- ((ancestorNS == null && type.getNamespace() == null) ||
- (ancestorNS != null && ancestorNS.equals(type.getNamespace())))) && // compare with ancestor
- type != fAnySimpleType) { // reached anySimpleType
- type = (XSTypeDefinition)type.getBaseType();
- }
-
- return type != fAnySimpleType;
- }
-
- static final XSSimpleTypeDecl fAnySimpleType = new XSSimpleTypeDecl(null, "anySimpleType", DV_ANYSIMPLETYPE, ORDERED_FALSE, false, true, false, true, XSConstants.ANYSIMPLETYPE_DT);
-
- /**
- * Validation context used to validate facet values.
- */
- static final ValidationContext fDummyContext = new ValidationContext() {
- public boolean needFacetChecking() {
- return true;
- }
-
- public boolean needExtraChecking() {
- return false;
- }
- public boolean needToNormalize() {
- return false;
- }
- public boolean useNamespaces() {
- return true;
- }
-
- public boolean isEntityDeclared(String name) {
- return false;
- }
-
- public boolean isEntityUnparsed(String name) {
- return false;
- }
-
- public boolean isIdDeclared(String name) {
- return false;
- }
-
- public void addId(String name) {
- }
-
- public void addIdRef(String name) {
- }
-
- public String getSymbol (String symbol) {
- return null;
- }
-
- public String getURI(String prefix) {
- return null;
- }
- };
-
- /**
- * A wrapper of ValidationContext, to provide a way of switching to a
- * different Namespace declaration context.
- */
- class ValidationContextImpl implements ValidationContext {
- ValidationContext fExternal;
- ValidationContextImpl(ValidationContext external) {
- fExternal = external;
- }
-
- NamespaceContext fNSContext;
- void setNSContext(NamespaceContext nsContext) {
- fNSContext = nsContext;
- }
-
- public boolean needFacetChecking() {
- return fExternal.needFacetChecking();
- }
-
- public boolean needExtraChecking() {
- return fExternal.needExtraChecking();
- }
- public boolean needToNormalize() {
- return fExternal.needToNormalize();
- }
- // schema validation is predicated upon namespaces
- public boolean useNamespaces() {
- return true;
- }
-
- public boolean isEntityDeclared (String name) {
- return fExternal.isEntityDeclared(name);
- }
-
- public boolean isEntityUnparsed (String name) {
- return fExternal.isEntityUnparsed(name);
- }
-
- public boolean isIdDeclared (String name) {
- return fExternal.isIdDeclared(name);
- }
-
- public void addId(String name) {
- fExternal.addId(name);
- }
-
- public void addIdRef(String name) {
- fExternal.addIdRef(name);
- }
-
- public String getSymbol (String symbol) {
- return fExternal.getSymbol(symbol);
- }
-
- public String getURI(String prefix) {
- if (fNSContext == null)
- return fExternal.getURI(prefix);
- else
- return fNSContext.getURI(prefix);
- }
- }
-
- public void reset(){
-
- // if it's immutable, can't be reset:
- if (fIsImmutable) return;
- fItemType = null;
- fMemberTypes = null;
-
- fTypeName = null;
- fTargetNamespace = null;
- fFinalSet = 0;
- fBase = null;
- fVariety = -1;
- fValidationDV = -1;
-
- fFacetsDefined = 0;
- fFixedFacet = 0;
-
- //for constraining facets
- fWhiteSpace = 0;
- fLength = -1;
- fMinLength = -1;
- fMaxLength = -1;
- fTotalDigits = -1;
- fFractionDigits = -1;
- fPattern = null;
- fPatternStr = null;
- fEnumeration = null;
- fLexicalPattern = null;
- fLexicalEnumeration = null;
- fMaxInclusive = null;
- fMaxExclusive = null;
- fMinExclusive = null;
- fMinInclusive = null;
- lengthAnnotation = null;
- minLengthAnnotation = null;
- maxLengthAnnotation = null;
- whiteSpaceAnnotation = null;
- totalDigitsAnnotation = null;
- fractionDigitsAnnotation = null;
- patternAnnotations = null;
- enumerationAnnotations = null;
- maxInclusiveAnnotation = null;
- maxExclusiveAnnotation = null;
- minInclusiveAnnotation = null;
- minExclusiveAnnotation = null;
-
- fPatternType = SPECIAL_PATTERN_NONE;
- fAnnotations = null;
- fFacets = null;
-
- // REVISIT: reset for fundamental facets
- }
- /**
- * @see com.sun.org.apache.xerces.internal.xs.XSObject#getNamespaceItem()
- */
- public XSNamespaceItem getNamespaceItem() {
- // REVISIT: implement
- return null;
- }
-
- /**
- * @see java.lang.Object#toString()
- */
- public String toString() {
- return this.fTargetNamespace+"," +this.fTypeName;
- }
-
- /* (non-Javadoc)
- * @see com.sun.org.apache.xerces.internal.xs.XSSimpleTypeDefinition#getFacets()
- */
- public XSObjectList getFacets() {
- if (fFacets == null &&
- (fFacetsDefined != 0 || fValidationDV == DV_INTEGER)) {
-
- XSFacetImpl[] facets = new XSFacetImpl[10];
- int count = 0;
- if ((fFacetsDefined & FACET_WHITESPACE) != 0) {
- facets[count] =
- new XSFacetImpl(
- FACET_WHITESPACE,
- WS_FACET_STRING[fWhiteSpace],
- (fFixedFacet & FACET_WHITESPACE) != 0,
- whiteSpaceAnnotation);
- count++;
- }
- if (fLength != -1) {
- facets[count] =
- new XSFacetImpl(
- FACET_LENGTH,
- Integer.toString(fLength),
- (fFixedFacet & FACET_LENGTH) != 0,
- lengthAnnotation);
- count++;
- }
- if (fMinLength != -1) {
- facets[count] =
- new XSFacetImpl(
- FACET_MINLENGTH,
- Integer.toString(fMinLength),
- (fFixedFacet & FACET_MINLENGTH) != 0,
- minLengthAnnotation);
- count++;
- }
- if (fMaxLength != -1) {
- facets[count] =
- new XSFacetImpl(
- FACET_MAXLENGTH,
- Integer.toString(fMaxLength),
- (fFixedFacet & FACET_MAXLENGTH) != 0,
- maxLengthAnnotation);
- count++;
- }
- if (fTotalDigits != -1) {
- facets[count] =
- new XSFacetImpl(
- FACET_TOTALDIGITS,
- Integer.toString(fTotalDigits),
- (fFixedFacet & FACET_TOTALDIGITS) != 0,
- totalDigitsAnnotation);
- count++;
- }
- if (fValidationDV == DV_INTEGER) {
- facets[count] =
- new XSFacetImpl(
- FACET_FRACTIONDIGITS,
- "0",
- true,
- null);
- count++;
- }
- if (fFractionDigits != -1) {
- facets[count] =
- new XSFacetImpl(
- FACET_FRACTIONDIGITS,
- Integer.toString(fFractionDigits),
- (fFixedFacet & FACET_FRACTIONDIGITS) != 0,
- fractionDigitsAnnotation);
- count++;
- }
- if (fMaxInclusive != null) {
- facets[count] =
- new XSFacetImpl(
- FACET_MAXINCLUSIVE,
- fMaxInclusive.toString(),
- (fFixedFacet & FACET_MAXINCLUSIVE) != 0,
- maxInclusiveAnnotation);
- count++;
- }
- if (fMaxExclusive != null) {
- facets[count] =
- new XSFacetImpl(
- FACET_MAXEXCLUSIVE,
- fMaxExclusive.toString(),
- (fFixedFacet & FACET_MAXEXCLUSIVE) != 0,
- maxExclusiveAnnotation);
- count++;
- }
- if (fMinExclusive != null) {
- facets[count] =
- new XSFacetImpl(
- FACET_MINEXCLUSIVE,
- fMinExclusive.toString(),
- (fFixedFacet & FACET_MINEXCLUSIVE) != 0,
- minExclusiveAnnotation);
- count++;
- }
- if (fMinInclusive != null) {
- facets[count] =
- new XSFacetImpl(
- FACET_MININCLUSIVE,
- fMinInclusive.toString(),
- (fFixedFacet & FACET_MININCLUSIVE) != 0,
- minInclusiveAnnotation);
- count++;
- }
- fFacets = new XSObjectListImpl(facets, count);
- }
- return fFacets;
- }
-
- public XSObjectList getMultiValueFacets(){
- if (fMultiValueFacets == null &&
- ((fFacetsDefined & FACET_ENUMERATION) != 0 ||
- (fFacetsDefined & FACET_PATTERN) != 0 ||
- fPatternType != SPECIAL_PATTERN_NONE ||
- fValidationDV == DV_INTEGER)) {
-
- XSMVFacetImpl[] facets = new XSMVFacetImpl[2];
- int count = 0;
- if ((fFacetsDefined & FACET_PATTERN) != 0 ||
- fPatternType != SPECIAL_PATTERN_NONE ||
- fValidationDV == DV_INTEGER) {
- facets[count] =
- new XSMVFacetImpl(
- FACET_PATTERN,
- this.getLexicalPattern(),
- patternAnnotations);
- count++;
- }
- if (fEnumeration != null) {
- facets[count] =
- new XSMVFacetImpl(
- FACET_ENUMERATION,
- this.getLexicalEnumeration(),
- enumerationAnnotations);
- count++;
- }
- fMultiValueFacets = new XSObjectListImpl(facets, count);
- }
- return fMultiValueFacets;
- }
-
- private static final class XSFacetImpl implements XSFacet {
- final short kind;
- final String value;
- final boolean fixed;
- final XSAnnotation annotation;
-
- public XSFacetImpl(short kind, String value, boolean fixed, XSAnnotation annotation) {
- this.kind = kind;
- this.value = value;
- this.fixed = fixed;
- this.annotation = annotation;
- }
- /* (non-Javadoc)
- * @see com.sun.org.apache.xerces.internal.xs.XSFacet#getAnnotation()
- */
- public XSAnnotation getAnnotation() {
- return annotation;
- }
-
- /* (non-Javadoc)
- * @see com.sun.org.apache.xerces.internal.xs.XSFacet#getFacetKind()
- */
- public short getFacetKind() {
- return kind;
- }
-
- /* (non-Javadoc)
- * @see com.sun.org.apache.xerces.internal.xs.XSFacet#getLexicalFacetValue()
- */
- public String getLexicalFacetValue() {
- return value;
- }
-
- /* (non-Javadoc)
- * @see com.sun.org.apache.xerces.internal.xs.XSFacet#isFixed()
- */
- public boolean getFixed() {
- return fixed;
- }
-
- /* (non-Javadoc)
- * @see com.sun.org.apache.xerces.internal.xs.XSObject#getName()
- */
- public String getName() {
- return null;
- }
-
- /* (non-Javadoc)
- * @see com.sun.org.apache.xerces.internal.xs.XSObject#getNamespace()
- */
- public String getNamespace() {
- return null;
- }
-
- /* (non-Javadoc)
- * @see com.sun.org.apache.xerces.internal.xs.XSObject#getNamespaceItem()
- */
- public XSNamespaceItem getNamespaceItem() {
- // REVISIT: implement
- return null;
- }
-
- /* (non-Javadoc)
- * @see com.sun.org.apache.xerces.internal.xs.XSObject#getType()
- */
- public short getType() {
- return XSConstants.FACET;
- }
-
- }
-
- private static final class XSMVFacetImpl implements XSMultiValueFacet {
- final short kind;
- XSObjectList annotations;
- StringList values;
-
- public XSMVFacetImpl(short kind, StringList values, XSObjectList annotations) {
- this.kind = kind;
- this.values = values;
- this.annotations = annotations;
- }
-
-
- /* (non-Javadoc)
- * @see com.sun.org.apache.xerces.internal.xs.XSFacet#getFacetKind()
- */
- public short getFacetKind() {
- return kind;
- }
-
-
- /* (non-Javadoc)
- * @see com.sun.org.apache.xerces.internal.xs.XSMultiValueFacet#getAnnotations()
- */
- public XSObjectList getAnnotations() {
- return annotations;
- }
-
- /* (non-Javadoc)
- * @see com.sun.org.apache.xerces.internal.xs.XSMultiValueFacet#getLexicalFacetValues()
- */
- public StringList getLexicalFacetValues() {
- return values;
- }
-
- /* (non-Javadoc)
- * @see com.sun.org.apache.xerces.internal.xs.XSObject#getName()
- */
- public String getName() {
- return null;
- }
-
- /* (non-Javadoc)
- * @see com.sun.org.apache.xerces.internal.xs.XSObject#getNamespace()
- */
- public String getNamespace() {
- return null;
- }
-
- /* (non-Javadoc)
- * @see com.sun.org.apache.xerces.internal.xs.XSObject#getNamespaceItem()
- */
- public XSNamespaceItem getNamespaceItem() {
- // REVISIT: implement
- return null;
- }
-
- /* (non-Javadoc)
- * @see com.sun.org.apache.xerces.internal.xs.XSObject#getType()
- */
- public short getType() {
- return XSConstants.MULTIVALUE_FACET;
- }
- }
-
- /**
- * @see org.w3c.dom.TypeInfo#getTypeName()
- */
- public String getTypeName() {
- if(getAnonymous())
- return "anonymousSimpleType"+fUniqueId;
- else
- return getName();
- }
-
- /**
- * @see org.w3c.dom.TypeInfo#getTypeNamespace()
- */
- public String getTypeNamespace() {
- return getNamespace();
- }
-
- public boolean isDerivedFrom(String typeNamespaceArg, String typeNameArg, int derivationMethod) {
- return derivedFrom(typeNamespaceArg,typeNameArg,(short)derivationMethod);
- }
-
-
- } // class XSSimpleTypeDecl
-