Author: markt
Date: Mon Mar 24 14:30:03 2008
New Revision: 640584

URL: http://svn.apache.org/viewvc?rev=640584&view=rev
Log:
Fix bug 44611 https://issues.apache.org/bugzilla/show_bug.cgi?id=44611
DirContextURLConnection:
1) Does not implement the getHeaderFields() method
2) It's implementation of getHeaderField(String name) is case sensitive.
3) It returns an empty string "", rather than null, for header values which 
don't exist.
Patch provided by Chris Hubick.

Modified:
    tomcat/trunk/java/org/apache/naming/resources/DirContextURLConnection.java
    tomcat/trunk/java/org/apache/naming/resources/ResourceAttributes.java

Modified: 
tomcat/trunk/java/org/apache/naming/resources/DirContextURLConnection.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/naming/resources/DirContextURLConnection.java?rev=640584&r1=640583&r2=640584&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/naming/resources/DirContextURLConnection.java 
(original)
+++ tomcat/trunk/java/org/apache/naming/resources/DirContextURLConnection.java 
Mon Mar 24 14:30:03 2008
@@ -23,8 +23,12 @@
 import java.io.InputStream;
 import java.io.FileNotFoundException;
 import java.security.Permission;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Date;
 import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Vector;
 import javax.naming.NamingException;
 import javax.naming.NamingEnumeration;
@@ -217,6 +221,46 @@
         return 0;
     }
     
+
+    /**
+     * Returns an unmodifiable Map of the header fields.
+     */
+    public Map getHeaderFields() {
+
+      if (!connected) {
+          // Try to connect (silently)
+          try {
+              connect();
+          } catch (IOException e) {
+          }
+      }
+
+      if (attributes == null)
+          return (Collections.EMPTY_MAP);
+
+      HashMap headerFields = new HashMap(attributes.size());
+      NamingEnumeration attributeEnum = attributes.getIDs();
+      try {
+          while (attributeEnum.hasMore()) {
+              String attributeID = (String)attributeEnum.next();
+              Attribute attribute = attributes.get(attributeID);
+              if (attribute == null) continue;
+              ArrayList attributeValueList = new ArrayList(attribute.size());
+              NamingEnumeration attributeValues = attribute.getAll();
+              while (attributeValues.hasMore()) {
+                  attributeValueList.add(attributeValues.next().toString());
+              }
+              attributeValueList.trimToSize(); // should be a no-op if 
attribute.size() didn't lie
+              headerFields.put(attributeID, 
Collections.unmodifiableList(attributeValueList));
+          }
+      } catch (NamingException ne) {
+            // Shouldn't happen
+      }
+
+      return Collections.unmodifiableMap(headerFields);
+
+    }
+    
     
     /**
      * Returns the name of the specified header field.
@@ -234,11 +278,18 @@
         if (attributes == null)
             return (null);
 
-        Attribute attribute = attributes.get(name);
+        NamingEnumeration attributeEnum = attributes.getIDs();
         try {
-            return attribute.get().toString();
-        } catch (Exception e) {
-            // Shouldn't happen, unless the attribute has no value
+            while (attributeEnum.hasMore()) {
+                String attributeID = (String)attributeEnum.next();
+                if (attributeID.equalsIgnoreCase(name)) {
+                    Attribute attribute = attributes.get(attributeID);
+                    if (attribute == null) return null;
+                    return attribute.get(attribute.size()-1).toString();
+                }
+            }
+        } catch (NamingException ne) {
+            // Shouldn't happen
         }
 
         return (null);

Modified: tomcat/trunk/java/org/apache/naming/resources/ResourceAttributes.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/naming/resources/ResourceAttributes.java?rev=640584&r1=640583&r2=640584&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/naming/resources/ResourceAttributes.java 
(original)
+++ tomcat/trunk/java/org/apache/naming/resources/ResourceAttributes.java Mon 
Mar 24 14:30:03 2008
@@ -263,7 +263,7 @@
      */
     public boolean isCollection() {
         if (attributes != null) {
-            return (getResourceType().equals(COLLECTION_TYPE));
+            return (COLLECTION_TYPE.equals(getResourceType()));
         } else {
             return (collection);
         }
@@ -683,7 +683,7 @@
             if (collection)
                 result = COLLECTION_TYPE;
             else
-                result = "";
+                result = null;
         }
         return result;
     }
@@ -775,28 +775,41 @@
     public Attribute get(String attrID) {
         if (attributes == null) {
             if (attrID.equals(CREATION_DATE)) {
-                return new BasicAttribute(CREATION_DATE, getCreationDate());
+                Date creationDate = getCreationDate();
+                if (creationDate == null) return null;
+                return new BasicAttribute(CREATION_DATE, creationDate);
             } else if (attrID.equals(ALTERNATE_CREATION_DATE)) {
-                return new BasicAttribute(ALTERNATE_CREATION_DATE, 
-                                          getCreationDate());
+                Date creationDate = getCreationDate();
+                if (creationDate == null) return null;
+                return new BasicAttribute(ALTERNATE_CREATION_DATE, 
creationDate);
             } else if (attrID.equals(LAST_MODIFIED)) {
-                return new BasicAttribute(LAST_MODIFIED, 
-                                          getLastModifiedDate());
+                Date lastModifiedDate = getLastModifiedDate();
+                if (lastModifiedDate == null) return null;
+                return new BasicAttribute(LAST_MODIFIED, lastModifiedDate);
             } else if (attrID.equals(ALTERNATE_LAST_MODIFIED)) {
-                return new BasicAttribute(ALTERNATE_LAST_MODIFIED,
-                                          getLastModifiedDate());
+                Date lastModifiedDate = getLastModifiedDate();
+                if (lastModifiedDate == null) return null;
+                return new BasicAttribute(ALTERNATE_LAST_MODIFIED, 
lastModifiedDate);
             } else if (attrID.equals(NAME)) {
-                return new BasicAttribute(NAME, getName());
+                String name = getName();
+                if (name == null) return null;
+                return new BasicAttribute(NAME, name);
             } else if (attrID.equals(TYPE)) {
-                return new BasicAttribute(TYPE, getResourceType());
+                String resourceType = getResourceType();
+                if (resourceType == null) return null;
+                return new BasicAttribute(TYPE, resourceType);
             } else if (attrID.equals(ALTERNATE_TYPE)) {
-                return new BasicAttribute(ALTERNATE_TYPE, getResourceType());
+                String resourceType = getResourceType();
+                if (resourceType == null) return null;
+                return new BasicAttribute(ALTERNATE_TYPE, resourceType);
             } else if (attrID.equals(CONTENT_LENGTH)) {
-                return new BasicAttribute(CONTENT_LENGTH, 
-                                          new Long(getContentLength()));
+                long contentLength = getContentLength();
+                if (contentLength < 0) return null;
+                return new BasicAttribute(CONTENT_LENGTH, new 
Long(contentLength));
             } else if (attrID.equals(ALTERNATE_CONTENT_LENGTH)) {
-                return new BasicAttribute(ALTERNATE_CONTENT_LENGTH, 
-                                          new Long(getContentLength()));
+              long contentLength = getContentLength();
+              if (contentLength < 0) return null;
+              return new BasicAttribute(ALTERNATE_CONTENT_LENGTH, new 
Long(contentLength));
             }
         } else {
             return attributes.get(attrID);
@@ -851,15 +864,35 @@
     public NamingEnumeration getAll() {
         if (attributes == null) {
             Vector attributes = new Vector();
-            attributes.addElement(new BasicAttribute
-                                  (CREATION_DATE, getCreationDate()));
-            attributes.addElement(new BasicAttribute
-                                  (LAST_MODIFIED, getLastModifiedDate()));
-            attributes.addElement(new BasicAttribute(NAME, getName()));
-            attributes.addElement(new BasicAttribute(TYPE, getResourceType()));
-            attributes.addElement
-                (new BasicAttribute(CONTENT_LENGTH, 
-                                    new Long(getContentLength())));
+            Date creationDate = getCreationDate();
+            if (creationDate != null) {
+                attributes.addElement(new BasicAttribute
+                                      (CREATION_DATE, creationDate));
+                attributes.addElement(new BasicAttribute
+                                      (ALTERNATE_CREATION_DATE, creationDate));
+            }
+            Date lastModifiedDate = getLastModifiedDate();
+            if (lastModifiedDate != null) {
+                attributes.addElement(new BasicAttribute
+                                      (LAST_MODIFIED, lastModifiedDate));
+                attributes.addElement(new BasicAttribute
+                                      (ALTERNATE_LAST_MODIFIED, 
lastModifiedDate));
+            }
+            String name = getName();
+            if (name != null) {
+                attributes.addElement(new BasicAttribute(NAME, name));
+            }
+            String resourceType = getResourceType();
+            if (resourceType != null) {
+                attributes.addElement(new BasicAttribute(TYPE, resourceType));
+                attributes.addElement(new BasicAttribute(ALTERNATE_TYPE, 
resourceType));
+            }
+            long contentLength = getContentLength();
+            if (contentLength >= 0) {
+                Long contentLengthLong = new Long(contentLength);
+                attributes.addElement(new BasicAttribute(CONTENT_LENGTH, 
contentLengthLong));
+                attributes.addElement(new 
BasicAttribute(ALTERNATE_CONTENT_LENGTH, contentLengthLong));
+            }
             return new RecyclableNamingEnumeration(attributes);
         } else {
             return attributes.getAll();
@@ -873,11 +906,29 @@
     public NamingEnumeration getIDs() {
         if (attributes == null) {
             Vector attributeIDs = new Vector();
-            attributeIDs.addElement(CREATION_DATE);
-            attributeIDs.addElement(LAST_MODIFIED);
-            attributeIDs.addElement(NAME);
-            attributeIDs.addElement(TYPE);
-            attributeIDs.addElement(CONTENT_LENGTH);
+            Date creationDate = getCreationDate();
+            if (creationDate != null) {
+                attributeIDs.addElement(CREATION_DATE);
+                attributeIDs.addElement(ALTERNATE_CREATION_DATE);
+            }
+            Date lastModifiedDate = getLastModifiedDate();
+            if (lastModifiedDate != null) {
+                attributeIDs.addElement(LAST_MODIFIED);
+                attributeIDs.addElement(ALTERNATE_LAST_MODIFIED);
+            }
+            if (getName() != null) {
+                attributeIDs.addElement(NAME);
+            }
+            String resourceType = getResourceType();
+            if (resourceType != null) {
+                attributeIDs.addElement(TYPE);
+                attributeIDs.addElement(ALTERNATE_TYPE);
+            }
+            long contentLength = getContentLength();
+            if (contentLength >= 0) {
+                attributeIDs.addElement(CONTENT_LENGTH);
+                attributeIDs.addElement(ALTERNATE_CONTENT_LENGTH);
+            }
             return new RecyclableNamingEnumeration(attributeIDs);
         } else {
             return attributes.getIDs();
@@ -890,7 +941,13 @@
      */
     public int size() {
         if (attributes == null) {
-            return 5;
+            int size = 0;
+            if (getCreationDate() != null) size += 2;
+            if (getLastModifiedDate() != null) size += 2;
+            if (getName() != null) size++;
+            if (getResourceType() != null) size += 2;
+            if (getContentLength() >= 0) size += 2;
+            return size;
         } else {
             return attributes.size();
         }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to