neilg 2003/01/21 15:43:36 Modified: java/src/org/apache/xerces/parsers AbstractSAXParser.java Log: The SAX DeclHandler#attrDecl method requires no callback to be made for the second and subsequent declarations of attributes. This patch fixes the parser so that it correctly implements that behaviour. Revision Changes Path 1.38 +25 -2 xml-xerces/java/src/org/apache/xerces/parsers/AbstractSAXParser.java Index: AbstractSAXParser.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/parsers/AbstractSAXParser.java,v retrieving revision 1.37 retrieving revision 1.38 diff -u -r1.37 -r1.38 --- AbstractSAXParser.java 7 Jan 2003 22:23:47 -0000 1.37 +++ AbstractSAXParser.java 21 Jan 2003 23:43:36 -0000 1.38 @@ -68,6 +68,7 @@ import org.apache.xerces.impl.xs.psvi.PSVIProvider; import org.apache.xerces.util.EntityResolverWrapper; import org.apache.xerces.util.ErrorHandlerWrapper; +import org.apache.xerces.util.SymbolHash; import org.apache.xerces.xni.NamespaceContext; import org.apache.xerces.xni.Augmentations; @@ -220,6 +221,11 @@ private static final int BUFFER_SIZE = 20; private char[] fCharBuffer = new char[BUFFER_SIZE]; + // allows us to keep track of whether an attribute has + // been declared twice, so that we can avoid exposing the + // second declaration to any registered DeclHandler + protected SymbolHash fDeclaredAttrs = null; + // // Constructors // @@ -318,6 +324,11 @@ throw new XNIException(e); } + // is there a DeclHandler? + if(fDeclHandler != null) { + fDeclaredAttrs = new SymbolHash(); + } + } // doctypeDecl(String,String,String) /** @@ -804,7 +815,7 @@ throw new XNIException(e); } - } // elementDecl(String,String) + } // elementDecl(String,String, Augmentations) /** * An attribute declaration. @@ -840,6 +851,13 @@ try { // SAX2 extension if (fDeclHandler != null) { + // used as a key to detect duplicate attribute definitions. + String elemAttr = new StringBuffer(elementName).append("<").append(attributeName).toString(); + if(fDeclaredAttrs.get(elemAttr) != null) { + // we aren't permitted to return duplicate attribute definitions + return; + } + fDeclaredAttrs.put(elemAttr, Boolean.TRUE); if (type.equals("NOTATION") || type.equals("ENUMERATION")) { @@ -1014,6 +1032,10 @@ catch (SAXException e) { throw new XNIException(e); } + if(fDeclaredAttrs != null) { + // help out the GC + fDeclaredAttrs.clear(); + } } // endDTD() @@ -1863,6 +1885,7 @@ fNamespaces = fConfiguration.getFeature(NAMESPACES); fNamespacePrefixes = fConfiguration.getFeature(NAMESPACE_PREFIXES); fAugmentations = null; + fDeclaredAttrs = null; } // reset()
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]