You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by dk...@apache.org on 2014/07/15 20:00:20 UTC

svn commit: r1610783 - in /webservices/xmlschema/trunk: .gitignore xmlschema-core/src/main/java/org/apache/ws/commons/schema/XmlSchemaCollection.java xmlschema-core/src/test/java/tests/FacetsTest.java

Author: dkulp
Date: Tue Jul 15 18:00:19 2014
New Revision: 1610783

URL: http://svn.apache.org/r1610783
Log:
[XMLSCHEMA-33] Define facets for the built in types
Patch from Michael Pigott applied

Modified:
    webservices/xmlschema/trunk/.gitignore
    webservices/xmlschema/trunk/xmlschema-core/src/main/java/org/apache/ws/commons/schema/XmlSchemaCollection.java
    webservices/xmlschema/trunk/xmlschema-core/src/test/java/tests/FacetsTest.java

Modified: webservices/xmlschema/trunk/.gitignore
URL: http://svn.apache.org/viewvc/webservices/xmlschema/trunk/.gitignore?rev=1610783&r1=1610782&r2=1610783&view=diff
==============================================================================
--- webservices/xmlschema/trunk/.gitignore (original)
+++ webservices/xmlschema/trunk/.gitignore Tue Jul 15 18:00:19 2014
@@ -29,3 +29,4 @@ xmlschema-eclipse/.settings/
 xmlschema-eclipse/target/
 .project
 .settings/
+.svn*
\ No newline at end of file

Modified: webservices/xmlschema/trunk/xmlschema-core/src/main/java/org/apache/ws/commons/schema/XmlSchemaCollection.java
URL: http://svn.apache.org/viewvc/webservices/xmlschema/trunk/xmlschema-core/src/main/java/org/apache/ws/commons/schema/XmlSchemaCollection.java?rev=1610783&r1=1610782&r2=1610783&view=diff
==============================================================================
--- webservices/xmlschema/trunk/xmlschema-core/src/main/java/org/apache/ws/commons/schema/XmlSchemaCollection.java (original)
+++ webservices/xmlschema/trunk/xmlschema-core/src/main/java/org/apache/ws/commons/schema/XmlSchemaCollection.java Tue Jul 15 18:00:19 2014
@@ -21,6 +21,7 @@ package org.apache.ws.commons.schema;
 
 import java.io.IOException;
 import java.io.Reader;
+import java.math.BigInteger;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.security.PrivilegedActionException;
@@ -385,47 +386,46 @@ public final class XmlSchemaCollection {
     private void setupBuiltinDatatypeHierarchy(XmlSchema xsd) {
 
         setDerivationByRestriction(xsd, Constants.XSD_ANYSIMPLETYPE, Constants.XSD_ANYTYPE);
-        setDerivationByRestriction(xsd, Constants.XSD_DURATION, Constants.XSD_ANYSIMPLETYPE);
-        setDerivationByRestriction(xsd, Constants.XSD_DATETIME, Constants.XSD_ANYSIMPLETYPE);
-        setDerivationByRestriction(xsd, Constants.XSD_TIME, Constants.XSD_ANYSIMPLETYPE);
-        setDerivationByRestriction(xsd, Constants.XSD_DATE, Constants.XSD_ANYSIMPLETYPE);
-        setDerivationByRestriction(xsd, Constants.XSD_YEARMONTH, Constants.XSD_ANYSIMPLETYPE);
-        setDerivationByRestriction(xsd, Constants.XSD_YEAR, Constants.XSD_ANYSIMPLETYPE);
-        setDerivationByRestriction(xsd, Constants.XSD_MONTHDAY, Constants.XSD_ANYSIMPLETYPE);
-        setDerivationByRestriction(xsd, Constants.XSD_DAY, Constants.XSD_ANYSIMPLETYPE);
-        setDerivationByRestriction(xsd, Constants.XSD_MONTH, Constants.XSD_ANYSIMPLETYPE);
-        setDerivationByRestriction(xsd, Constants.XSD_BOOLEAN, Constants.XSD_ANYSIMPLETYPE);
-        setDerivationByRestriction(xsd, Constants.XSD_BASE64, Constants.XSD_ANYSIMPLETYPE);
-        setDerivationByRestriction(xsd, Constants.XSD_HEXBIN, Constants.XSD_ANYSIMPLETYPE);
-        setDerivationByRestriction(xsd, Constants.XSD_FLOAT, Constants.XSD_ANYSIMPLETYPE);
-        setDerivationByRestriction(xsd, Constants.XSD_DOUBLE, Constants.XSD_ANYSIMPLETYPE);
-        setDerivationByRestriction(xsd, Constants.XSD_ANYURI, Constants.XSD_ANYSIMPLETYPE);
-        setDerivationByRestriction(xsd, Constants.XSD_QNAME, Constants.XSD_ANYSIMPLETYPE);
-        setDerivationByRestriction(xsd, Constants.XSD_NOTATION, Constants.XSD_ANYSIMPLETYPE);
-        setDerivationByRestriction(xsd, Constants.XSD_NOTATION, Constants.XSD_ANYSIMPLETYPE);
-        setDerivationByRestriction(xsd, Constants.XSD_DECIMAL, Constants.XSD_ANYSIMPLETYPE);
-
-        setDerivationByRestriction(xsd, Constants.XSD_INTEGER, Constants.XSD_DECIMAL);
-        setDerivationByRestriction(xsd, Constants.XSD_NONPOSITIVEINTEGER, Constants.XSD_INTEGER);
-        setDerivationByRestriction(xsd, Constants.XSD_NEGATIVEINTEGER, Constants.XSD_NONPOSITIVEINTEGER);
-        setDerivationByRestriction(xsd, Constants.XSD_LONG, Constants.XSD_INTEGER);
-        setDerivationByRestriction(xsd, Constants.XSD_INT, Constants.XSD_LONG);
-        setDerivationByRestriction(xsd, Constants.XSD_SHORT, Constants.XSD_INT);
-        setDerivationByRestriction(xsd, Constants.XSD_BYTE, Constants.XSD_SHORT);
-        setDerivationByRestriction(xsd, Constants.XSD_NONNEGATIVEINTEGER, Constants.XSD_INTEGER);
-        setDerivationByRestriction(xsd, Constants.XSD_POSITIVEINTEGER, Constants.XSD_NONNEGATIVEINTEGER);
-        setDerivationByRestriction(xsd, Constants.XSD_UNSIGNEDLONG, Constants.XSD_NONNEGATIVEINTEGER);
-        setDerivationByRestriction(xsd, Constants.XSD_UNSIGNEDINT, Constants.XSD_UNSIGNEDLONG);
-        setDerivationByRestriction(xsd, Constants.XSD_UNSIGNEDSHORT, Constants.XSD_UNSIGNEDINT);
-        setDerivationByRestriction(xsd, Constants.XSD_UNSIGNEDBYTE, Constants.XSD_UNSIGNEDSHORT);
-
-        setDerivationByRestriction(xsd, Constants.XSD_STRING, Constants.XSD_ANYSIMPLETYPE);
-        setDerivationByRestriction(xsd, Constants.XSD_NORMALIZEDSTRING, Constants.XSD_STRING);
-        setDerivationByRestriction(xsd, Constants.XSD_TOKEN, Constants.XSD_NORMALIZEDSTRING);
-        setDerivationByRestriction(xsd, Constants.XSD_LANGUAGE, Constants.XSD_TOKEN);
-        setDerivationByRestriction(xsd, Constants.XSD_NMTOKEN, Constants.XSD_TOKEN);
-        setDerivationByRestriction(xsd, Constants.XSD_NAME, Constants.XSD_NMTOKEN);
-        setDerivationByRestriction(xsd, Constants.XSD_NCNAME, Constants.XSD_TOKEN);
+        setDerivationByRestriction(xsd, Constants.XSD_DURATION, Constants.XSD_ANYSIMPLETYPE,  new XmlSchemaFacet[] { new XmlSchemaWhiteSpaceFacet("collapse", true) });
+        setDerivationByRestriction(xsd, Constants.XSD_DATETIME, Constants.XSD_ANYSIMPLETYPE,  new XmlSchemaFacet[] { new XmlSchemaWhiteSpaceFacet("collapse", true) });
+        setDerivationByRestriction(xsd, Constants.XSD_TIME, Constants.XSD_ANYSIMPLETYPE,      new XmlSchemaFacet[] { new XmlSchemaWhiteSpaceFacet("collapse", true) });
+        setDerivationByRestriction(xsd, Constants.XSD_DATE, Constants.XSD_ANYSIMPLETYPE,      new XmlSchemaFacet[] { new XmlSchemaWhiteSpaceFacet("collapse", true) });
+        setDerivationByRestriction(xsd, Constants.XSD_YEARMONTH, Constants.XSD_ANYSIMPLETYPE, new XmlSchemaFacet[] { new XmlSchemaWhiteSpaceFacet("collapse", true) });
+        setDerivationByRestriction(xsd, Constants.XSD_YEAR, Constants.XSD_ANYSIMPLETYPE,      new XmlSchemaFacet[] { new XmlSchemaWhiteSpaceFacet("collapse", true) });
+        setDerivationByRestriction(xsd, Constants.XSD_MONTHDAY, Constants.XSD_ANYSIMPLETYPE,  new XmlSchemaFacet[] { new XmlSchemaWhiteSpaceFacet("collapse", true) });
+        setDerivationByRestriction(xsd, Constants.XSD_DAY, Constants.XSD_ANYSIMPLETYPE,       new XmlSchemaFacet[] { new XmlSchemaWhiteSpaceFacet("collapse", true) });
+        setDerivationByRestriction(xsd, Constants.XSD_MONTH, Constants.XSD_ANYSIMPLETYPE,     new XmlSchemaFacet[] { new XmlSchemaWhiteSpaceFacet("collapse", true) });
+        setDerivationByRestriction(xsd, Constants.XSD_BOOLEAN, Constants.XSD_ANYSIMPLETYPE,   new XmlSchemaFacet[] { new XmlSchemaWhiteSpaceFacet("collapse", true) });
+        setDerivationByRestriction(xsd, Constants.XSD_BASE64, Constants.XSD_ANYSIMPLETYPE,    new XmlSchemaFacet[] { new XmlSchemaWhiteSpaceFacet("collapse", true) });
+        setDerivationByRestriction(xsd, Constants.XSD_HEXBIN, Constants.XSD_ANYSIMPLETYPE,    new XmlSchemaFacet[] { new XmlSchemaWhiteSpaceFacet("collapse", true) });
+        setDerivationByRestriction(xsd, Constants.XSD_FLOAT, Constants.XSD_ANYSIMPLETYPE,     new XmlSchemaFacet[] { new XmlSchemaWhiteSpaceFacet("collapse", true) });
+        setDerivationByRestriction(xsd, Constants.XSD_DOUBLE, Constants.XSD_ANYSIMPLETYPE,    new XmlSchemaFacet[] { new XmlSchemaWhiteSpaceFacet("collapse", true) });
+        setDerivationByRestriction(xsd, Constants.XSD_ANYURI, Constants.XSD_ANYSIMPLETYPE,    new XmlSchemaFacet[] { new XmlSchemaWhiteSpaceFacet("collapse", true) });
+        setDerivationByRestriction(xsd, Constants.XSD_QNAME, Constants.XSD_ANYSIMPLETYPE,     new XmlSchemaFacet[] { new XmlSchemaWhiteSpaceFacet("collapse", true) });
+        setDerivationByRestriction(xsd, Constants.XSD_NOTATION, Constants.XSD_ANYSIMPLETYPE,  new XmlSchemaFacet[] { new XmlSchemaWhiteSpaceFacet("collapse", true) });
+        setDerivationByRestriction(xsd, Constants.XSD_DECIMAL, Constants.XSD_ANYSIMPLETYPE,   new XmlSchemaFacet[] { new XmlSchemaWhiteSpaceFacet("collapse", true) });
+
+        setDerivationByRestriction(xsd, Constants.XSD_INTEGER, Constants.XSD_DECIMAL,                    new XmlSchemaFacet[] { new XmlSchemaFractionDigitsFacet(new Integer(0), true),                 new XmlSchemaPatternFacet("[\\-+]?[0-9]+", false)                     });
+        setDerivationByRestriction(xsd, Constants.XSD_NONPOSITIVEINTEGER, Constants.XSD_INTEGER,         new XmlSchemaFacet[] { new XmlSchemaMaxInclusiveFacet(new Integer(0), false)         });
+        setDerivationByRestriction(xsd, Constants.XSD_NEGATIVEINTEGER, Constants.XSD_NONPOSITIVEINTEGER, new XmlSchemaFacet[] { new XmlSchemaMaxInclusiveFacet(new Integer(-1), false)        });
+        setDerivationByRestriction(xsd, Constants.XSD_LONG, Constants.XSD_INTEGER,                       new XmlSchemaFacet[] { new XmlSchemaMinInclusiveFacet(new Long(-9223372036854775808L), false), new XmlSchemaMaxInclusiveFacet(new Long(9223372036854775807L), false) });
+        setDerivationByRestriction(xsd, Constants.XSD_INT, Constants.XSD_LONG,                           new XmlSchemaFacet[] { new XmlSchemaMinInclusiveFacet(new Integer(-2147483648), false),        new XmlSchemaMaxInclusiveFacet(2147483647, false)                     });
+        setDerivationByRestriction(xsd, Constants.XSD_SHORT, Constants.XSD_INT,                          new XmlSchemaFacet[] { new XmlSchemaMinInclusiveFacet(new Short((short) -32768), false),       new XmlSchemaMaxInclusiveFacet(new Short((short) 32767), false)       });
+        setDerivationByRestriction(xsd, Constants.XSD_BYTE, Constants.XSD_SHORT,                         new XmlSchemaFacet[] { new XmlSchemaMinInclusiveFacet(new Byte((byte) -128), false),           new XmlSchemaMaxInclusiveFacet(new Byte((byte) 127), false)           });
+        setDerivationByRestriction(xsd, Constants.XSD_NONNEGATIVEINTEGER, Constants.XSD_INTEGER,         new XmlSchemaFacet[] { new XmlSchemaMinInclusiveFacet(new Integer(0), false)         });
+        setDerivationByRestriction(xsd, Constants.XSD_POSITIVEINTEGER, Constants.XSD_NONNEGATIVEINTEGER, new XmlSchemaFacet[] { new XmlSchemaMinInclusiveFacet(new Integer(1), false)         });
+        setDerivationByRestriction(xsd, Constants.XSD_UNSIGNEDLONG, Constants.XSD_NONNEGATIVEINTEGER,    new XmlSchemaFacet[] { new XmlSchemaMaxInclusiveFacet(new BigInteger("18446744073709551615"), false) });
+        setDerivationByRestriction(xsd, Constants.XSD_UNSIGNEDINT, Constants.XSD_UNSIGNEDLONG,           new XmlSchemaFacet[] { new XmlSchemaMaxInclusiveFacet(new Long(4294967295L), false)  });
+        setDerivationByRestriction(xsd, Constants.XSD_UNSIGNEDSHORT, Constants.XSD_UNSIGNEDINT,          new XmlSchemaFacet[] { new XmlSchemaMaxInclusiveFacet(new Integer(65535), false)     });
+        setDerivationByRestriction(xsd, Constants.XSD_UNSIGNEDBYTE, Constants.XSD_UNSIGNEDSHORT,         new XmlSchemaFacet[] { new XmlSchemaMaxInclusiveFacet(new Short((short) 255), false) });
+
+        setDerivationByRestriction(xsd, Constants.XSD_STRING, Constants.XSD_ANYSIMPLETYPE,    new XmlSchemaFacet[] { new XmlSchemaWhiteSpaceFacet("preserve", false) });
+        setDerivationByRestriction(xsd, Constants.XSD_NORMALIZEDSTRING, Constants.XSD_STRING, new XmlSchemaFacet[] { new XmlSchemaWhiteSpaceFacet("replace", false) });
+        setDerivationByRestriction(xsd, Constants.XSD_TOKEN, Constants.XSD_NORMALIZEDSTRING,  new XmlSchemaFacet[] { new XmlSchemaWhiteSpaceFacet("collapse", false) });
+        setDerivationByRestriction(xsd, Constants.XSD_LANGUAGE, Constants.XSD_TOKEN,          new XmlSchemaFacet[] { new XmlSchemaPatternFacet("[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*", false) });
+        setDerivationByRestriction(xsd, Constants.XSD_NMTOKEN, Constants.XSD_TOKEN,           new XmlSchemaFacet[] { new XmlSchemaPatternFacet("\\c+", false) });
+        setDerivationByRestriction(xsd, Constants.XSD_NAME, Constants.XSD_NMTOKEN,            new XmlSchemaFacet[] { new XmlSchemaPatternFacet("\\i\\c*", false) });
+        setDerivationByRestriction(xsd, Constants.XSD_NCNAME, Constants.XSD_TOKEN,            new XmlSchemaFacet[] { new XmlSchemaPatternFacet("[\\i-[:]][\\c-[:]]*", false) });
         setDerivationByRestriction(xsd, Constants.XSD_ID, Constants.XSD_NCNAME);
         setDerivationByRestriction(xsd, Constants.XSD_IDREF, Constants.XSD_NCNAME);
         setDerivationByRestriction(xsd, Constants.XSD_ENTITY, Constants.XSD_NCNAME);
@@ -436,17 +436,28 @@ public final class XmlSchemaCollection {
     }
 
     private void setDerivationByRestriction(XmlSchema xsd, QName child, QName parent) {
+    	setDerivationByRestriction(xsd, child, parent, null);
+    }
+
+    private void setDerivationByRestriction(XmlSchema xsd, QName child, QName parent, XmlSchemaFacet[] facets) {
 
-        XmlSchemaSimpleType simple = (XmlSchemaSimpleType)xsd.getTypeByName(child);
+    	XmlSchemaSimpleType simple = (XmlSchemaSimpleType)xsd.getTypeByName(child);
         XmlSchemaSimpleTypeRestriction restriction = new XmlSchemaSimpleTypeRestriction();
         restriction.setBaseTypeName(parent);
         restriction.setBaseType((XmlSchemaSimpleType)xsd.getTypeByName(parent));
+
+        if (facets != null) {
+        	for (XmlSchemaFacet facet : facets) {
+        		restriction.getFacets().add(facet);
+        	}
+        }
+
         simple.setContent(restriction);
     }
 
     private void setDerivationByList(XmlSchema xsd, QName child, QName parent) {
 
-        XmlSchemaSimpleType simple = (XmlSchemaSimpleType)xsd.getTypeByName(child);
+    	XmlSchemaSimpleType simple = (XmlSchemaSimpleType)xsd.getTypeByName(child);
         XmlSchemaSimpleTypeList restriction = new XmlSchemaSimpleTypeList();
         restriction.setItemTypeName(parent);
         restriction.setItemType((XmlSchemaSimpleType)xsd.getTypeByName(parent));

Modified: webservices/xmlschema/trunk/xmlschema-core/src/test/java/tests/FacetsTest.java
URL: http://svn.apache.org/viewvc/webservices/xmlschema/trunk/xmlschema-core/src/test/java/tests/FacetsTest.java?rev=1610783&r1=1610782&r2=1610783&view=diff
==============================================================================
--- webservices/xmlschema/trunk/xmlschema-core/src/test/java/tests/FacetsTest.java (original)
+++ webservices/xmlschema/trunk/xmlschema-core/src/test/java/tests/FacetsTest.java Tue Jul 15 18:00:19 2014
@@ -20,6 +20,7 @@ package tests;
 
 import java.io.FileInputStream;
 import java.io.InputStream;
+import java.math.BigInteger;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -45,6 +46,7 @@ import org.apache.ws.commons.schema.XmlS
 import org.apache.ws.commons.schema.XmlSchemaSimpleTypeRestriction;
 import org.apache.ws.commons.schema.XmlSchemaTotalDigitsFacet;
 import org.apache.ws.commons.schema.XmlSchemaWhiteSpaceFacet;
+import org.apache.ws.commons.schema.constants.Constants;
 
 import org.junit.Assert;
 import org.junit.Test;
@@ -539,4 +541,260 @@ public class FacetsTest extends Assert {
 
     }
 
+    /**
+     * This method verifies the XML Schema's built-in
+     * types have their facets defined correctly.
+     */
+    @Test
+    public void testBuiltinFacets() {
+    	XmlSchemaCollection collection = new XmlSchemaCollection();
+
+    	// anySimpleType
+    	List<XmlSchemaFacet> anySimpleTypeFacets = getFacetsForQName(collection, Constants.XSD_ANYSIMPLETYPE);
+    	assertEquals(0, anySimpleTypeFacets.size());
+
+    	// Any-Simple-Type-Based Facets
+    	QName[] anySimpleTypeBasedQNames = {
+    			Constants.XSD_DURATION,
+    			Constants.XSD_DATETIME,
+    			Constants.XSD_TIME,
+    			Constants.XSD_DATE,
+    			Constants.XSD_YEARMONTH,
+    			Constants.XSD_YEAR,
+    			Constants.XSD_MONTHDAY,
+    			Constants.XSD_DAY,
+    			Constants.XSD_MONTH,
+    			Constants.XSD_BOOLEAN,
+    			Constants.XSD_BASE64,
+    			Constants.XSD_HEXBIN,
+    			Constants.XSD_FLOAT,
+    			Constants.XSD_DOUBLE,
+    			Constants.XSD_ANYURI,
+    			Constants.XSD_QNAME,
+    			Constants.XSD_NOTATION,
+    			Constants.XSD_DECIMAL
+    		};
+
+    	for (QName qName : anySimpleTypeBasedQNames) {
+    		testWhiteSpaceFacet(
+    				qName,
+    				getFacetsForQName(collection, qName),
+    				"collapse",
+    				true);
+    	}
+
+    	// Numeric Type Facets
+
+    	// integer
+    	List<XmlSchemaFacet> integerFacets = getFacetsForQName(collection, Constants.XSD_INTEGER);
+    	assertEquals(2, integerFacets.size());
+    	XmlSchemaFractionDigitsFacet integerFractionDigitsFacet = null;
+    	XmlSchemaPatternFacet integerPatternFacet = null;
+    	for (XmlSchemaFacet facet : integerFacets) {
+    		if (facet instanceof XmlSchemaPatternFacet) {
+    			integerPatternFacet = (XmlSchemaPatternFacet) facet;
+    		} else if (facet instanceof XmlSchemaFractionDigitsFacet) {
+    			integerFractionDigitsFacet = (XmlSchemaFractionDigitsFacet) facet;
+    		} else {
+    			fail("Simple Type " + Constants.XSD_INTEGER + " should not have a facet of type " + facet.getClass().getName());
+    		}
+    	}
+    	assertEquals(new Integer(0), integerFractionDigitsFacet.getValue());
+    	assertTrue(integerFractionDigitsFacet.isFixed());
+    	assertEquals("[\\-+]?[0-9]+", integerPatternFacet.getValue());
+    	assertFalse(integerPatternFacet.isFixed());
+
+    	// nonPositiveInteger
+    	testMaxInclusiveFacet(
+    			Constants.XSD_NONPOSITIVEINTEGER,
+    			getFacetsForQName(collection, Constants.XSD_NONPOSITIVEINTEGER),
+    			new Integer(0));
+
+    	// negativeInteger
+    	testMaxInclusiveFacet(
+    			Constants.XSD_NEGATIVEINTEGER,
+    			getFacetsForQName(collection, Constants.XSD_NEGATIVEINTEGER),
+    			new Integer(-1));
+
+    	// long
+    	testNumericRange(
+    			Constants.XSD_LONG,
+    			getFacetsForQName(collection, Constants.XSD_LONG),
+    			new Long(-9223372036854775808L),
+    			new Long(9223372036854775807L));
+
+    	// int
+    	testNumericRange(
+    			Constants.XSD_INT,
+    			getFacetsForQName(collection, Constants.XSD_INT),
+    			new Integer(-2147483648),
+    			new Integer(2147483647));
+
+    	// short
+    	testNumericRange(
+    			Constants.XSD_SHORT,
+    			getFacetsForQName(collection, Constants.XSD_SHORT),
+    			new Short((short) -32768),
+    			new Short((short)  32767));
+
+    	// byte
+    	testNumericRange(
+    			Constants.XSD_BYTE,
+    			getFacetsForQName(collection, Constants.XSD_BYTE),
+    			new Byte((byte) -128),
+    			new Byte((byte)  127));
+
+    	// nonNegativeInteger
+    	testMinInclusiveFacet(
+    			Constants.XSD_NONNEGATIVEINTEGER,
+    			getFacetsForQName(collection, Constants.XSD_NONNEGATIVEINTEGER),
+    			new Integer(0));
+
+    	// positiveInteger
+    	testMinInclusiveFacet(
+    			Constants.XSD_POSITIVEINTEGER,
+    			getFacetsForQName(collection, Constants.XSD_POSITIVEINTEGER),
+    			new Integer(1));
+
+    	// unsignedLong
+    	testMaxInclusiveFacet(
+    			Constants.XSD_UNSIGNEDLONG,
+    			getFacetsForQName(collection, Constants.XSD_UNSIGNEDLONG),
+    			new BigInteger("18446744073709551615"));
+
+    	// unsignedInt
+    	testMaxInclusiveFacet(
+    			Constants.XSD_UNSIGNEDINT,
+    			getFacetsForQName(collection, Constants.XSD_UNSIGNEDINT),
+    			new Long(4294967295L));
+
+    	// unsignedShort
+    	testMaxInclusiveFacet(
+    			Constants.XSD_UNSIGNEDSHORT,
+    			getFacetsForQName(collection, Constants.XSD_UNSIGNEDSHORT),
+    			new Integer(65535));
+
+    	// unsignedByte
+    	testMaxInclusiveFacet(
+    			Constants.XSD_UNSIGNEDBYTE,
+    			getFacetsForQName(collection, Constants.XSD_UNSIGNEDBYTE),
+    			new Short((short) 255));
+
+    	// String Type Facets
+
+    	// string
+    	testWhiteSpaceFacet(
+    			Constants.XSD_STRING,
+    			getFacetsForQName(collection, Constants.XSD_STRING),
+    			"preserve",
+    			false);
+
+    	// normalizedString
+    	testWhiteSpaceFacet(
+    			Constants.XSD_NORMALIZEDSTRING,
+    			getFacetsForQName(collection, Constants.XSD_NORMALIZEDSTRING),
+    			"replace",
+    			false);
+
+    	// token
+    	testWhiteSpaceFacet(
+    			Constants.XSD_TOKEN,
+    			getFacetsForQName(collection, Constants.XSD_TOKEN),
+    			"collapse",
+    			false);
+
+    	// language
+    	testPatternFacet(
+    			Constants.XSD_LANGUAGE,
+    			getFacetsForQName(collection, Constants.XSD_LANGUAGE),
+    			"[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*");
+
+    	// NMTOKEN
+    	testPatternFacet(
+    			Constants.XSD_NMTOKEN,
+    			getFacetsForQName(collection, Constants.XSD_NMTOKEN),
+    			"\\c+");
+
+    	// Name
+    	testPatternFacet(
+    			Constants.XSD_NAME,
+    			getFacetsForQName(collection, Constants.XSD_NAME),
+    			"\\i\\c*");
+
+    	// NCName
+    	testPatternFacet(
+    			Constants.XSD_NCNAME,
+    			getFacetsForQName(collection, Constants.XSD_NCNAME),
+    			"[\\i-[:]][\\c-[:]]*");
+
+    	// ID
+    	assertTrue(
+    			Constants.XSD_ID.toString(),
+    			getFacetsForQName(collection, Constants.XSD_ID).isEmpty());
+
+    	// IDREF
+    	assertTrue(
+    			Constants.XSD_IDREF.toString(),
+    			getFacetsForQName(collection, Constants.XSD_IDREF).isEmpty());
+
+    	// ENTITY
+    	assertTrue(
+    			Constants.XSD_ENTITY.toString(),
+    			getFacetsForQName(collection, Constants.XSD_ENTITY).isEmpty());
+    }
+
+    private List<XmlSchemaFacet> getFacetsForQName(XmlSchemaCollection collection, QName qname) {
+    	XmlSchemaSimpleType type = (XmlSchemaSimpleType) collection.getTypeByQName(qname);
+    	return ((XmlSchemaSimpleTypeRestriction) type.getContent()).getFacets();
+    }
+
+    private void testWhiteSpaceFacet(QName qName, List<XmlSchemaFacet> facets, String value, boolean isFixed) {
+    	assertEquals(qName.toString(), 1, facets.size());
+    	assertTrue(qName.toString(), facets.get(0) instanceof XmlSchemaWhiteSpaceFacet);
+    	assertEquals(qName.toString(), value, facets.get(0).getValue().toString());
+    	assertEquals(qName.toString(), isFixed, facets.get(0).isFixed());
+    }
+
+    private void testMinInclusiveFacet(QName qName, List<XmlSchemaFacet> facets, Number minInclusiveValue) {
+    	assertEquals(qName.toString(), 1, facets.size());
+    	assertTrue(qName.toString(), facets.get(0) instanceof XmlSchemaMinInclusiveFacet);
+    	assertEquals(qName.toString(), minInclusiveValue, facets.get(0).getValue());
+    	assertFalse(qName.toString(), facets.get(0).isFixed());
+    }
+
+    private void testMaxInclusiveFacet(QName qName, List<XmlSchemaFacet> facets, Number maxInclusiveValue) {
+    	assertEquals(qName.toString(), 1, facets.size());
+    	assertTrue(qName.toString(), facets.get(0) instanceof XmlSchemaMaxInclusiveFacet);
+    	assertEquals(qName.toString(), maxInclusiveValue, facets.get(0).getValue());
+    	assertFalse(qName.toString(), facets.get(0).isFixed() );
+    }
+
+    private void testNumericRange(QName qName, List<XmlSchemaFacet> facets, Number min, Number max) {
+    	XmlSchemaMinInclusiveFacet minFacet = null;
+    	XmlSchemaMaxInclusiveFacet maxFacet = null;
+
+    	assertEquals(qName.toString(), 2, facets.size());
+    	for (XmlSchemaFacet facet : facets) {
+    		if (facet instanceof XmlSchemaMinInclusiveFacet) {
+    			minFacet = (XmlSchemaMinInclusiveFacet) facet;
+    		} else if (facet instanceof XmlSchemaMaxInclusiveFacet) {
+    			maxFacet = (XmlSchemaMaxInclusiveFacet) facet;
+    		} else {
+    			fail("Numeric Simple Type " + qName + " should not have a facet of type " + facet.getClass().getName());
+    		}
+    	}
+
+    	assertEquals(qName.toString(), min, minFacet.getValue());
+    	assertEquals(qName.toString(), max, maxFacet.getValue());
+
+    	assertFalse(qName.toString(), minFacet.isFixed());
+    	assertFalse(qName.toString(), maxFacet.isFixed());
+    }
+
+    private void testPatternFacet(QName qName, List<XmlSchemaFacet> facets, String pattern) {
+    	assertEquals(qName.toString(), 1, facets.size());
+    	assertTrue(qName.toString(), facets.get(0) instanceof XmlSchemaPatternFacet);
+    	assertEquals(qName.toString(), pattern, facets.get(0).getValue());
+    	assertFalse(qName.toString(), facets.get(0).isFixed());
+    }
 }