You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by mu...@apache.org on 2014/10/11 09:30:38 UTC
svn commit: r1631026 - in /xerces/java/trunk/src/org/apache/xerces/impl:
msg/XMLSchemaMessages.properties xs/traversers/XSDAbstractTraverser.java
xs/traversers/XSDComplexTypeTraverser.java
xs/traversers/XSDSimpleTypeTraverser.java
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: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org