mrglavas 2004/05/15 16:29:20
Modified: java/src/org/apache/xerces/impl/dv/xs XSSimpleTypeDecl.java
java/src/org/apache/xerces/impl/xs/util StringListImpl.java
XSObjectListImpl.java
Log:
XSSimpleTypeDefinition [1] specifies that empty lists (XSObjectList & StringList)
are returned when no list for a requested item exists. Our implementation got
out of synch with the spec. We were returning null instead. This is now fixed.
[1]
http://www.w3.org/Submission/2004/SUBM-xmlschema-api-20040309/xml-schema-api.html#Interface-XSSimpleType
Revision Changes Path
1.51 +93 -11
xml-xerces/java/src/org/apache/xerces/impl/dv/xs/XSSimpleTypeDecl.java
Index: XSSimpleTypeDecl.java
===================================================================
RCS file:
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/XSSimpleTypeDecl.java,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -r1.50 -r1.51
--- XSSimpleTypeDecl.java 26 Feb 2004 19:50:09 -0000 1.50
+++ XSSimpleTypeDecl.java 15 May 2004 23:29:20 -0000 1.51
@@ -569,10 +569,20 @@
}
}
+ /**
+ * Returns the closest built-in type category this type represents or
+ * derived from. For example, if this simple type is a built-in derived
+ * type integer the <code>INTEGER_DV</code> is returned.
+ */
public short getBuiltInKind() {
return this.fBuiltInKind;
}
+ /**
+ * If variety is <code>atomic</code> the primitive type definition (a
+ * built-in primitive datatype definition or the simple ur-type
+ * definition) is available, otherwise <code>null</code>.
+ */
public XSSimpleTypeDefinition getPrimitiveType() {
if (fVariety == VARIETY_ATOMIC && fValidationDV != DV_ANYSIMPLETYPE) {
XSSimpleTypeDecl pri = this;
@@ -587,6 +597,11 @@
}
}
+ /**
+ * If variety is <code>list</code> the item type definition (an atomic or
+ * union simple type definition) is available, otherwise
+ * <code>null</code>.
+ */
public XSSimpleTypeDefinition getItemType() {
if (fVariety == VARIETY_LIST) {
return fItemType;
@@ -597,13 +612,17 @@
}
}
+ /**
+ * If variety is <code>union</code> the list of member type definitions (a
+ * non-empty sequence of simple type definitions) is available,
+ * otherwise an empty <code>XSObjectList</code>.
+ */
public XSObjectList getMemberTypes() {
if (fVariety == VARIETY_UNION) {
return new XSObjectListImpl(fMemberTypes, fMemberTypes.length);
}
else {
- // REVISIT: error situation. runtime exception?
- return null;
+ return XSObjectListImpl.EMPTY_LIST;
}
}
@@ -1856,22 +1875,40 @@
return WS_FACET_STRING[ws];
}
+ /**
+ * Fundamental Facet: ordered.
+ */
public short getOrdered() {
return fOrdered;
}
+ /**
+ * Fundamental Facet: bounded.
+ */
public boolean getBounded(){
return fBounded;
}
+ /**
+ * Fundamental Facet: cardinality.
+ */
public boolean getFinite(){
return fFinite;
}
+ /**
+ * Fundamental Facet: numeric.
+ */
public boolean getNumeric(){
return fNumeric;
}
+ /**
+ * Convenience method. [Facets]: check whether a facet is defined on this
+ * type.
+ * @param facetName The name of the facet.
+ * @return True if the facet is defined, false otherwise.
+ */
public boolean isDefinedFacet(short facetName) {
if ((fFacetsDefined & facetName) != 0)
return true;
@@ -1882,6 +1919,10 @@
return false;
}
+ /**
+ * [facets]: all facets defined on this type. The value is a bit
+ * combination of FACET_XXX constants of all defined facets.
+ */
public short getDefinedFacets() {
if (fPatternType != SPECIAL_PATTERN_NONE)
return (short)(fFacetsDefined | FACET_PATTERN);
@@ -1890,6 +1931,12 @@
return fFacetsDefined;
}
+ /**
+ * Convenience method. [Facets]: check whether a facet is defined and
+ * fixed on this type.
+ * @param facetName The name of the facet.
+ * @return True if the facet is fixed, false otherwise.
+ */
public boolean isFixedFacet(short facetName) {
if ((fFixedFacet & facetName) != 0)
return true;
@@ -1898,12 +1945,27 @@
return false;
}
+ /**
+ * [facets]: all defined facets for this type which are fixed.
+ */
public short getFixedFacets() {
if (fValidationDV == DV_INTEGER)
return (short)(fFixedFacet | FACET_FRACTIONDIGITS);
return fFixedFacet;
}
+ /**
+ * Convenience method. Returns a value of a single constraining facet for
+ * this simple type definition. This method must not be used to retrieve
+ * values for <code>enumeration</code> and <code>pattern</code> facets.
+ * @param facetName The name of the facet, i.e.
+ * <code>FACET_LENGTH, FACET_TOTALDIGITS </code> (see
+ * <code>XSConstants</code>). To retrieve the value for a pattern or
+ * an enumeration, see <code>enumeration</code> and
+ * <code>pattern</code>.
+ * @return A value of the facet specified in <code>facetName</code> for
+ * this simple type definition or <code>null</code>.
+ */
public String getLexicalFacetValue(short facetName) {
switch (facetName) {
case FACET_LENGTH:
@@ -1932,10 +1994,14 @@
return null;
}
+ /**
+ * A list of enumeration values if it exists, otherwise an empty
+ * <code>StringList</code>.
+ */
public StringList getLexicalEnumeration() {
if (fLexicalEnumeration == null){
if (fEnumeration == null)
- return null;
+ return StringListImpl.EMPTY_LIST;
int size = fEnumeration.size();
String[] strs = new String[size];
for (int i = 0; i < size; i++)
@@ -1945,9 +2011,13 @@
return fLexicalEnumeration;
}
+ /**
+ * A list of pattern values if it exists, otherwise an empty
+ * <code>StringList</code>.
+ */
public StringList getLexicalPattern() {
if (fPatternType == SPECIAL_PATTERN_NONE && fValidationDV != DV_INTEGER &&
fPatternStr == null)
- return null;
+ return StringListImpl.EMPTY_LIST;
if (fLexicalPattern == null){
int size = fPatternStr == null ? 0 : fPatternStr.size();
String[] strs;
@@ -1978,8 +2048,12 @@
return fLexicalPattern;
}
+ /**
+ * [annotations]: a set of annotations for this simple type component if
+ * it exists, otherwise an empty <code>XSObjectList</code>.
+ */
public XSObjectList getAnnotations() {
- return fAnnotations;
+ return (fAnnotations != null) ? fAnnotations : XSObjectListImpl.EMPTY_LIST;
}
private void caclFundamentalFacets() {
@@ -2387,8 +2461,11 @@
return this.fTargetNamespace+"," +this.fTypeName;
}
- /* (non-Javadoc)
- * @see org.apache.xerces.xs.XSSimpleTypeDefinition#getFacets()
+ /**
+ * A list of constraining facets if it exists, otherwise an empty
+ * <code>XSObjectList</code>. Note: This method must not be used to
+ * retrieve values for <code>enumeration</code> and <code>pattern</code>
+ * facets.
*/
public XSObjectList getFacets() {
if (fFacets == null &&
@@ -2497,10 +2574,14 @@
}
fFacets = new XSObjectListImpl(facets, count);
}
- return fFacets;
+ return (fFacets != null) ? fFacets : XSObjectListImpl.EMPTY_LIST;
}
- public XSObjectList getMultiValueFacets(){
+ /**
+ * A list of enumeration and pattern constraining facets if it exists,
+ * otherwise an empty <code>XSObjectList</code>.
+ */
+ public XSObjectList getMultiValueFacets() {
if (fMultiValueFacets == null &&
((fFacetsDefined & FACET_ENUMERATION) != 0 ||
(fFacetsDefined & FACET_PATTERN) != 0 ||
@@ -2529,7 +2610,8 @@
}
fMultiValueFacets = new XSObjectListImpl(facets, count);
}
- return fMultiValueFacets;
+ return (fMultiValueFacets != null) ?
+ fMultiValueFacets : XSObjectListImpl.EMPTY_LIST;
}
private static final class XSFacetImpl implements XSFacet {
1.7 +16 -1
xml-xerces/java/src/org/apache/xerces/impl/xs/util/StringListImpl.java
Index: StringListImpl.java
===================================================================
RCS file:
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/util/StringListImpl.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- StringListImpl.java 24 Feb 2004 22:59:13 -0000 1.6
+++ StringListImpl.java 15 May 2004 23:29:20 -0000 1.7
@@ -27,6 +27,21 @@
*/
public class StringListImpl implements StringList {
+ /**
+ * An immutable empty list.
+ */
+ public static final StringList EMPTY_LIST = new StringList () {
+ public int getLength() {
+ return 0;
+ }
+ public boolean contains(String item) {
+ return false;
+ }
+ public String item(int index) {
+ return null;
+ }
+ };
+
// The array to hold all data
private String[] fArray = null;
// Number of elements in this list
1.9 +13 -1
xml-xerces/java/src/org/apache/xerces/impl/xs/util/XSObjectListImpl.java
Index: XSObjectListImpl.java
===================================================================
RCS file:
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/util/XSObjectListImpl.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- XSObjectListImpl.java 24 Feb 2004 22:59:13 -0000 1.8
+++ XSObjectListImpl.java 15 May 2004 23:29:20 -0000 1.9
@@ -28,6 +28,18 @@
*/
public class XSObjectListImpl implements XSObjectList {
+ /**
+ * An immutable empty list.
+ */
+ public static final XSObjectList EMPTY_LIST = new XSObjectList () {
+ public int getLength() {
+ return 0;
+ }
+ public XSObject item(int index) {
+ return null;
+ }
+ };
+
private final int DEFAULT_SIZE = 4;
// The array to hold all data
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]