You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ge...@apache.org on 2010/11/10 05:26:38 UTC

svn commit: r1033345 - /geronimo/external/trunk/tomcat-parent-7.0.0/jasper/src/main/java/org/apache/jasper/util/UniqueAttributesImpl.java

Author: genspring
Date: Wed Nov 10 04:26:38 2010
New Revision: 1033345

URL: http://svn.apache.org/viewvc?rev=1033345&view=rev
Log:
https://issues.apache.org/bugzilla/show_bug.cgi?id=49297, Fix the spec broken code in related code of this bug.

Modified:
    geronimo/external/trunk/tomcat-parent-7.0.0/jasper/src/main/java/org/apache/jasper/util/UniqueAttributesImpl.java

Modified: geronimo/external/trunk/tomcat-parent-7.0.0/jasper/src/main/java/org/apache/jasper/util/UniqueAttributesImpl.java
URL: http://svn.apache.org/viewvc/geronimo/external/trunk/tomcat-parent-7.0.0/jasper/src/main/java/org/apache/jasper/util/UniqueAttributesImpl.java?rev=1033345&r1=1033344&r2=1033345&view=diff
==============================================================================
--- geronimo/external/trunk/tomcat-parent-7.0.0/jasper/src/main/java/org/apache/jasper/util/UniqueAttributesImpl.java (original)
+++ geronimo/external/trunk/tomcat-parent-7.0.0/jasper/src/main/java/org/apache/jasper/util/UniqueAttributesImpl.java Wed Nov 10 04:26:38 2010
@@ -16,8 +16,8 @@
  */
 package org.apache.jasper.util;
 
-import java.util.HashSet;
-import java.util.Set;
+import java.util.HashMap;
+import java.util.Map;
 
 import org.apache.jasper.compiler.Localizer;
 import org.xml.sax.Attributes;
@@ -29,54 +29,106 @@ import org.xml.sax.helpers.AttributesImp
  */
 public class UniqueAttributesImpl extends AttributesImpl {
 
-    private Set<String> qNames = new HashSet<String>();
+    private Map<String,String> attributes = new HashMap<String,String>();
 
     @Override
     public void clear() {
-        qNames.clear();
+        attributes.clear();
         super.clear();
     }
 
     @Override
     public void setAttributes(Attributes atts) {
+        
         for (int i = 0; i < atts.getLength(); i++) {
-            if (!qNames.add(atts.getQName(i))) {
-                handleDuplicate(atts.getQName(i));
+            
+            String qName = atts.getQName(i);
+            String value = atts.getValue(i);
+
+            /*
+             * A translation error will occur if the page directive defines duplicate attribute/values within a given
+             * translation unit, unless the values for the duplicate attributes are identical for all occurrences. The
+             * import and pageEncoding attributes are exempt from this rule and can appear multiple times.
+             */
+            if (attributes.keySet().contains(qName)) {
+
+                if (qName.equals("import")) {
+
+                    StringBuffer sb = new StringBuffer(3);
+                    sb.append(attributes.get(qName));
+                    sb.append(",");
+                    sb.append(value);
+                    attributes.put(qName, sb.toString());
+
+                } else
+                    if (qName.equals("pageEncoding")) {
+
+                    // It's not clear in the spec how would we handle multiple pageEncoding attributes.
+                    
+                } else if (!attributes.get(qName).equals(value)) {
+
+                    handleDuplicate(qName);
+                } 
+
+            } else {
+                attributes.put(qName, value);
             }
+            
         }
+        
         super.setAttributes(atts);
     }
 
     @Override
     public void addAttribute(String uri, String localName, String qName,
             String type, String value) {
-        if (qNames.add(qName)) {
-            super.addAttribute(uri, localName, qName, type, value);
+        
+        if (attributes.keySet().contains(qName)) {
+
+            if (qName.equals("import")) {
+
+                StringBuffer sb = new StringBuffer(3);
+                sb.append(attributes.get(qName));
+                sb.append(",");
+                sb.append(value);
+                attributes.put(qName, sb.toString());
+                super.addAttribute(uri, localName, qName, type, sb.toString());
+
+            } else if (qName.equals("pageEncoding")) {
+
+                // It's not clear in the spec on how to handle multiple pageEncoding attributes.
+                
+            } else if (!attributes.get(qName).equals(value)) {
+
+                handleDuplicate(qName);
+            } 
+
         } else {
-            handleDuplicate(qName);
+            attributes.put(qName, value);
+            super.addAttribute(uri, localName, qName, type, value);
         }
+       
     }
 
     @Override
     public void setAttribute(int index, String uri, String localName,
             String qName, String type, String value) {
-        qNames.remove(super.getQName(index));
-        if (qNames.add(qName)) {
-            super.setAttribute(index, uri, localName, qName, type, value);
-        } else {
-            handleDuplicate(qName);
-        }
+        
+        attributes.remove(super.getQName(index));
+        attributes.put(qName, value);
+        super.setAttribute(index, uri, localName, qName, type, value);
+
     }
 
     @Override
     public void removeAttribute(int index) {
-        qNames.remove(super.getQName(index));
+        attributes.remove(super.getQName(index));
         super.removeAttribute(index);
     }
 
     @Override
     public void setQName(int index, String qName) {
-        qNames.remove(super.getQName(index));
+        attributes.remove(super.getQName(index));
         super.setQName(index, qName);
     }