Author: mukulg
Date: Sat Oct 11 07:30:37 2014
New Revision: 1631026
URL: http://svn.apache.org/r1631026
Log:
committing fix for jira issue XERCESJ-1646 on trunk
Modified:
xerces/java/trunk/src/org/apache/xerces/impl/msg/XMLSchemaMessages.properties
xerces/java/trunk/src/org/apache/xerces/impl/xs/traversers/XSDAbstractTraverser.java
xerces/java/trunk/src/org/apache/xerces/impl/xs/traversers/XSDComplexTypeTraverser.java
xerces/java/trunk/src/org/apache/xerces/impl/xs/traversers/XSDSimpleTypeTraverser.java
Modified:
xerces/java/trunk/src/org/apache/xerces/impl/msg/XMLSchemaMessages.properties
URL:
http://svn.apache.org/viewvc/xerces/java/trunk/src/org/apache/xerces/impl/msg/XMLSchemaMessages.properties?rev=1631026&r1=1631025&r2=1631026&view=diff
==============================================================================
---
xerces/java/trunk/src/org/apache/xerces/impl/msg/XMLSchemaMessages.properties
(original)
+++
xerces/java/trunk/src/org/apache/xerces/impl/msg/XMLSchemaMessages.properties
Sat Oct 11 07:30:37 2014
@@ -311,6 +311,7 @@
TargetNamespace.2 = TargetNamespace.2: Expecting no namespace, but the
schema document has a target namespace of ''{1}''.
UndeclaredEntity = UndeclaredEntity: Entity ''{0}'' is not declared.
UndeclaredPrefix = UndeclaredPrefix: Cannot resolve ''{0}'' as a
QName: the prefix ''{1}'' is not declared.
+ FacetsContradict = FacetsContradict: For simpleType definition
''{2}'', the enumeration value ''{0}'' contradicts with value of ''{1}'' facet.
# JAXP 1.2 schema source property errors
Modified:
xerces/java/trunk/src/org/apache/xerces/impl/xs/traversers/XSDAbstractTraverser.java
URL:
http://svn.apache.org/viewvc/xerces/java/trunk/src/org/apache/xerces/impl/xs/traversers/XSDAbstractTraverser.java?rev=1631026&r1=1631025&r2=1631026&view=diff
==============================================================================
---
xerces/java/trunk/src/org/apache/xerces/impl/xs/traversers/XSDAbstractTraverser.java
(original)
+++
xerces/java/trunk/src/org/apache/xerces/impl/xs/traversers/XSDAbstractTraverser.java
Sat Oct 11 07:30:37 2014
@@ -23,6 +23,8 @@ import java.util.Vector;
import org.apache.xerces.impl.dv.InvalidDatatypeValueException;
import org.apache.xerces.impl.dv.XSFacets;
import org.apache.xerces.impl.dv.XSSimpleType;
+import org.apache.xerces.impl.dv.util.Base64;
+import org.apache.xerces.impl.dv.xs.XSSimpleTypeDecl;
import org.apache.xerces.impl.validation.ValidationState;
import org.apache.xerces.impl.xs.SchemaGrammar;
import org.apache.xerces.impl.xs.SchemaSymbols;
@@ -41,6 +43,7 @@ import org.apache.xerces.util.SymbolTabl
import org.apache.xerces.xni.QName;
import org.apache.xerces.xs.XSAttributeUse;
import org.apache.xerces.xs.XSObjectList;
+import org.apache.xerces.xs.XSSimpleTypeDefinition;
import org.apache.xerces.xs.XSTypeDefinition;
import org.w3c.dom.Element;
@@ -274,6 +277,7 @@ abstract class XSDAbstractTraverser {
}
FacetInfo traverseFacets(Element content,
+ XSTypeDefinition typeDef,
XSSimpleType baseValidator,
XSDocumentInfo schemaDoc) {
@@ -288,6 +292,8 @@ abstract class XSDAbstractTraverser {
int currentFacet = 0;
xsFacets.reset();
boolean seenPattern = false;
+ Element contextNode = (Element)content.getParentNode();
+ boolean hasLengthFacet = false, hasMinLengthFacet = false,
hasMaxLengthFacet = false;
while (content != null) {
// General Attribute Checking
Object[] attrs = null;
@@ -472,9 +478,11 @@ abstract class XSDAbstractTraverser {
switch (currentFacet) {
case XSSimpleType.FACET_MINLENGTH:
xsFacets.minLength =
((XInt)attrs[XSAttributeChecker.ATTIDX_VALUE]).intValue();
+ hasMinLengthFacet = true;
break;
case XSSimpleType.FACET_MAXLENGTH:
xsFacets.maxLength =
((XInt)attrs[XSAttributeChecker.ATTIDX_VALUE]).intValue();
+ hasMaxLengthFacet = true;
break;
case XSSimpleType.FACET_MAXEXCLUSIVE:
xsFacets.maxExclusive =
(String)attrs[XSAttributeChecker.ATTIDX_VALUE];
@@ -499,6 +507,7 @@ abstract class XSDAbstractTraverser {
break;
case XSSimpleType.FACET_LENGTH:
xsFacets.length =
((XInt)attrs[XSAttributeChecker.ATTIDX_VALUE]).intValue();
+ hasLengthFacet = true;
break;
}
@@ -569,9 +578,140 @@ abstract class XSDAbstractTraverser {
fPattern.setLength(0);
+ // check if length, minLength and maxLength facets contradict with
enumeration facets.
+ // currently considers the case when the baseValidator is a built-in
type.
+ if (enumData != null) {
+ if (hasLengthFacet) {
+ checkEnumerationAndLengthInconsistency(baseValidator, enumData,
contextNode, getSchemaTypeName(typeDef));
+ }
+ if (hasMinLengthFacet) {
+ checkEnumerationAndMinLengthInconsistency(baseValidator,
enumData, contextNode, getSchemaTypeName(typeDef));
+ }
+ if (hasMaxLengthFacet) {
+ checkEnumerationAndMaxLengthInconsistency(baseValidator,
enumData, contextNode, getSchemaTypeName(typeDef));
+ }
+ }
+
return new FacetInfo(xsFacets, content, facetsPresent, facetsFixed);
}
+ /*
+ * Get name of an XSD type definition as a string value (which will
typically be the value of "name" attribute of a
+ * type definition, or an internal name determined by the validator for
anonymous types).
+ */
+ public static String getSchemaTypeName(XSTypeDefinition typeDefn) {
+
+ String typeNameStr = "";
+ if (typeDefn instanceof XSSimpleTypeDefinition) {
+ typeNameStr = ((XSSimpleTypeDecl) typeDefn).getTypeName();
+ }
+ else {
+ typeNameStr = ((XSComplexTypeDecl) typeDefn).getTypeName();
+ }
+
+ return typeNameStr;
+
+ } // getSchemaTypeName
+
+ /*
+ * Check whether values of xs:maxLength and xs:enumeration are consistent.
Report a warning message if they are not.
+ */
+ private void checkEnumerationAndMaxLengthInconsistency(XSSimpleType
baseValidator, Vector enumData, Element contextNode, String typeName) {
+ if
(SchemaSymbols.URI_SCHEMAFORSCHEMA.equals(baseValidator.getNamespace()) &&
+ SchemaSymbols.ATTVAL_HEXBINARY.equals(baseValidator.getName())) {
+ for (int enumIdx = 0; enumIdx < enumData.size(); enumIdx++) {
+ String enumVal = ((String)enumData.get(enumIdx));
+ if (enumVal.length() / 2 > xsFacets.maxLength) {
+ reportSchemaWarning("FacetsContradict", new
Object[]{enumVal, SchemaSymbols.ELT_MAXLENGTH, typeName}, contextNode);
+ }
+ }
+ }
+ else if
(SchemaSymbols.URI_SCHEMAFORSCHEMA.equals(baseValidator.getNamespace()) &&
+
SchemaSymbols.ATTVAL_BASE64BINARY.equals(baseValidator.getName())) {
+ for (int enumIdx = 0; enumIdx < enumData.size(); enumIdx++) {
+ String enumVal = ((String)enumData.get(enumIdx));
+ byte[] decodedVal = Base64.decode(enumVal);
+ if (decodedVal != null && (new String(decodedVal)).length() >
xsFacets.maxLength) {
+ reportSchemaWarning("FacetsContradict", new
Object[]{enumVal, SchemaSymbols.ELT_MAXLENGTH, typeName}, contextNode);
+ }
+ }
+ }
+ else {
+ for (int enumIdx = 0; enumIdx < enumData.size(); enumIdx++) {
+ String enumVal = ((String)enumData.get(enumIdx));
+ if (enumVal.length() > xsFacets.maxLength) {
+ reportSchemaWarning("FacetsContradict", new
Object[]{enumVal, SchemaSymbols.ELT_MAXLENGTH, typeName}, contextNode);
+ }
+ }
+ }
+ } // checkEnumerationAndMaxLengthInconsistency
+
+ /*
+ * Check whether values of xs:minLength and xs:enumeration are consistent.
Report a warning message if they are not.
+ */
+ private void checkEnumerationAndMinLengthInconsistency(XSSimpleType
baseValidator, Vector enumData, Element contextNode, String typeName) {
+ if
(SchemaSymbols.URI_SCHEMAFORSCHEMA.equals(baseValidator.getNamespace()) &&
+ SchemaSymbols.ATTVAL_HEXBINARY.equals(baseValidator.getName())) {
+ for (int enumIdx = 0; enumIdx < enumData.size(); enumIdx++) {
+ String enumVal = ((String)enumData.get(enumIdx));
+ if (enumVal.length() / 2 < xsFacets.minLength) {
+ reportSchemaWarning("FacetsContradict", new
Object[]{enumVal, SchemaSymbols.ELT_MINLENGTH, typeName}, contextNode);
+ }
+ }
+ }
+ else if
(SchemaSymbols.URI_SCHEMAFORSCHEMA.equals(baseValidator.getNamespace()) &&
+
SchemaSymbols.ATTVAL_BASE64BINARY.equals(baseValidator.getName())) {
+ for (int enumIdx = 0; enumIdx < enumData.size(); enumIdx++) {
+ String enumVal = ((String)enumData.get(enumIdx));
+ byte[] decodedVal = Base64.decode(enumVal);
+ if (decodedVal != null && (new String(decodedVal)).length() <
xsFacets.minLength) {
+ reportSchemaWarning("FacetsContradict", new
Object[]{enumVal, SchemaSymbols.ELT_MINLENGTH, typeName}, contextNode);
+ }
+ }
+ }
+ else {
+ for (int enumIdx = 0; enumIdx < enumData.size(); enumIdx++) {
+ String enumVal = ((String)enumData.get(enumIdx));
+ if (enumVal.length() < xsFacets.minLength) {
+ reportSchemaWarning("FacetsContradict", new
Object[]{enumVal, SchemaSymbols.ELT_MINLENGTH, typeName}, contextNode);
+ }
+ }
+ }
+ } // checkEnumerationAndMinLengthInconsistency
+
+ /*
+ * Check whether values of xs:length and xs:enumeration are consistent.
Report a warning message if they are not.
+ */
+ private void checkEnumerationAndLengthInconsistency(XSSimpleType
baseValidator, Vector enumData, Element contextNode, String typeName) {
+ if
(SchemaSymbols.URI_SCHEMAFORSCHEMA.equals(baseValidator.getNamespace()) &&
+ SchemaSymbols.ATTVAL_HEXBINARY.equals(baseValidator.getName())) {
+ for (int enumIdx = 0; enumIdx < enumData.size(); enumIdx++) {
+ String enumVal = ((String)enumData.get(enumIdx));
+ if (enumVal.length() / 2 != xsFacets.length) {
+ reportSchemaWarning("FacetsContradict", new
Object[]{enumVal, SchemaSymbols.ELT_LENGTH, typeName}, contextNode);
+ }
+ }
+ }
+ else if
(SchemaSymbols.URI_SCHEMAFORSCHEMA.equals(baseValidator.getNamespace()) &&
+
SchemaSymbols.ATTVAL_BASE64BINARY.equals(baseValidator.getName())) {
+ for (int enumIdx = 0; enumIdx < enumData.size(); enumIdx++) {
+ String enumVal = ((String)enumData.get(enumIdx));
+ byte[] decodedVal = Base64.decode(enumVal);
+ if (decodedVal != null && (new String(decodedVal)).length() !=
xsFacets.length) {
+ reportSchemaWarning("FacetsContradict", new
Object[]{enumVal, SchemaSymbols.ELT_LENGTH, typeName}, contextNode);
+ }
+ }
+ }
+ else {
+ for (int enumIdx = 0; enumIdx < enumData.size(); enumIdx++) {
+ String enumVal = ((String)enumData.get(enumIdx));
+ if (enumVal.length() != xsFacets.length) {
+ reportSchemaWarning("FacetsContradict", new
Object[]{enumVal, SchemaSymbols.ELT_LENGTH, typeName}, contextNode);
+ }
+ }
+ }
+ } // checkEnumerationAndLengthInconsistency
+
// return whether QName/NOTATION is part of the given type
private boolean containsQName(XSSimpleType type) {
@@ -720,6 +860,10 @@ abstract class XSDAbstractTraverser {
fSchemaHandler.reportSchemaError(key, args, ele);
}
+ void reportSchemaWarning (String key, Object[] args, Element ele) {
+ fSchemaHandler.reportSchemaWarning(key, args, ele);
+ }
+
/**
* Element/Attribute traversers call this method to check whether
* the type is NOTATION without enumeration facet
Modified:
xerces/java/trunk/src/org/apache/xerces/impl/xs/traversers/XSDComplexTypeTraverser.java
URL:
http://svn.apache.org/viewvc/xerces/java/trunk/src/org/apache/xerces/impl/xs/traversers/XSDComplexTypeTraverser.java?rev=1631026&r1=1631025&r2=1631026&view=diff
==============================================================================
---
xerces/java/trunk/src/org/apache/xerces/impl/xs/traversers/XSDComplexTypeTraverser.java
(original)
+++
xerces/java/trunk/src/org/apache/xerces/impl/xs/traversers/XSDComplexTypeTraverser.java
Sat Oct 11 07:30:37 2014
@@ -17,7 +17,6 @@
package org.apache.xerces.impl.xs.traversers;
import org.apache.xerces.impl.dv.InvalidDatatypeFacetException;
-import org.apache.xerces.impl.dv.SchemaDVFactory;
import org.apache.xerces.impl.dv.XSFacets;
import org.apache.xerces.impl.dv.XSSimpleType;
import org.apache.xerces.impl.dv.xs.XSSimpleTypeDecl;
@@ -571,7 +570,7 @@ class XSDComplexTypeTraverser extends X
short fixedFacets = 0 ;
if (simpleContent!=null) {
- FacetInfo fi = traverseFacets(simpleContent, baseValidator,
schemaDoc);
+ FacetInfo fi = traverseFacets(simpleContent, fComplexTypeDecl,
baseValidator, schemaDoc);
attrNode = fi.nodeAfterFacets;
facetData = fi.facetdata;
presentFacets = fi.fPresentFacets;
Modified:
xerces/java/trunk/src/org/apache/xerces/impl/xs/traversers/XSDSimpleTypeTraverser.java
URL:
http://svn.apache.org/viewvc/xerces/java/trunk/src/org/apache/xerces/impl/xs/traversers/XSDSimpleTypeTraverser.java?rev=1631026&r1=1631025&r2=1631026&view=diff
==============================================================================
---
xerces/java/trunk/src/org/apache/xerces/impl/xs/traversers/XSDSimpleTypeTraverser.java
(original)
+++
xerces/java/trunk/src/org/apache/xerces/impl/xs/traversers/XSDSimpleTypeTraverser.java
Sat Oct 11 07:30:37 2014
@@ -391,7 +391,7 @@ class XSDSimpleTypeTraverser extends XSD
}
// now traverse facets, if it's derived by restriction
if (restriction && content != null) {
- FacetInfo fi = traverseFacets(content, baseValidator, schemaDoc);
+ FacetInfo fi = traverseFacets(content, newDecl, baseValidator,
schemaDoc);
content = fi.nodeAfterFacets;
try {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]