Author: olegk
Date: Wed Apr 26 02:26:13 2006
New Revision: 397155

URL: http://svn.apache.org/viewcvs?rev=397155&view=rev
Log:
Refactored the internal management of the cookie attribute handlers

Modified:
    
jakarta/commons/proper/httpclient/branches/COOKIE_2_BRANCH/src/java/org/apache/commons/httpclient/cookie/RFC2965Spec.java

Modified: 
jakarta/commons/proper/httpclient/branches/COOKIE_2_BRANCH/src/java/org/apache/commons/httpclient/cookie/RFC2965Spec.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/httpclient/branches/COOKIE_2_BRANCH/src/java/org/apache/commons/httpclient/cookie/RFC2965Spec.java?rev=397155&r1=397154&r2=397155&view=diff
==============================================================================
--- 
jakarta/commons/proper/httpclient/branches/COOKIE_2_BRANCH/src/java/org/apache/commons/httpclient/cookie/RFC2965Spec.java
 (original)
+++ 
jakarta/commons/proper/httpclient/branches/COOKIE_2_BRANCH/src/java/org/apache/commons/httpclient/cookie/RFC2965Spec.java
 Wed Apr 26 02:26:13 2006
@@ -58,10 +58,15 @@
     private final ParameterFormatter formatter;
      
     /**
+     * Stores the list of attribute handlers
+     */
+    private final List attribHandlerList;
+    
+    /**
     * Stores attribute name -> attribute handler mappings
     */
-    private static Map attributeHandlerMap = null;
-    
+    private final Map attribHandlerMap;
+
     /** 
      * Default constructor 
      * */
@@ -69,24 +74,64 @@
         super();
         this.formatter = new ParameterFormatter();
         this.formatter.setAlwaysUseQuotes(true);
-        initializeAttributeHandlerMap();        
+        this.attribHandlerMap = new HashMap(10);        
+        this.attribHandlerList = new ArrayList(10);
+        
+        registerAttribHandler(Cookie2.COOKIE_NAME_KEY, new 
Cookie2NameAttributeHandler());
+        registerAttribHandler(Cookie2.PATH, new Cookie2PathAttributeHandler());
+        registerAttribHandler(Cookie2.DOMAIN, new 
Cookie2DomainAttributeHandler());
+        registerAttribHandler(Cookie2.PORT, new Cookie2PortAttributeHandler());
+        registerAttribHandler(Cookie2.VERSION, new 
Cookie2VersionAttributeHandler());
+        registerAttribHandler(Cookie2.MAXAGE, new 
Cookie2MaxageAttributeHandler());
     }
 
+    protected void registerAttribHandler(
+            final String name, final CookieAttributeHandler handler) {
+        if (name == null) {
+            throw new IllegalArgumentException("Attribute name may not be 
null");
+        }
+        if (handler == null) {
+            throw new IllegalArgumentException("Attribute handler may not be 
null");
+        }
+        if (!this.attribHandlerList.contains(handler)) {
+            this.attribHandlerList.add(handler);
+        }
+        this.attribHandlerMap.put(name, handler);
+    }
+    
     /**
-    * initializes attribute name -> attribute handler mappings.
-    * Called from constructor.
-    */
-    private void initializeAttributeHandlerMap() {
-        if (attributeHandlerMap == null) {
-            attributeHandlerMap = new HashMap();
-            attributeHandlerMap.put(Cookie2.COOKIE_NAME_KEY, new 
Cookie2NameAttributeHandler());
-            attributeHandlerMap.put(Cookie2.PATH, new 
Cookie2PathAttributeHandler());
-            attributeHandlerMap.put(Cookie2.DOMAIN, new 
Cookie2DomainAttributeHandler());
-            attributeHandlerMap.put(Cookie2.PORT, new 
Cookie2PortAttributeHandler());
-            attributeHandlerMap.put(Cookie2.VERSION, new 
Cookie2VersionAttributeHandler());
-            attributeHandlerMap.put(Cookie2.MAXAGE, new 
Cookie2MaxageAttributeHandler());
+     * Finds an attribute handler [EMAIL PROTECTED] CookieAttributeHandler} 
for the
+     * given attribute. Returns <tt>null</tt> if no attribute handler is
+     * found for the specified attribute.
+     *
+     * @param name attribute name. e.g. Domain, Path, etc.
+     * @return an attribute handler or <tt>null</tt>
+     */
+    protected CookieAttributeHandler findAttribHandler(final String name) {
+        return (CookieAttributeHandler) this.attribHandlerMap.get(name);
+    }
+    
+    /**
+     * Gets attribute handler [EMAIL PROTECTED] CookieAttributeHandler} for the
+     * given attribute.
+     *
+     * @param name attribute name. e.g. Domain, Path, etc.
+     * @throws IllegalStateException if handler not found for the
+     *          specified attribute.
+     */
+    protected CookieAttributeHandler getAttribHandler(final String name) {
+        CookieAttributeHandler handler = findAttribHandler(name);
+        if (handler == null) {
+            throw new IllegalStateException("Handler not registered for " +
+                                            name + " attribute.");
+        } else {
+            return handler;
         }
     }
+
+    protected Iterator getAttribHandlerIterator() {
+        return this.attribHandlerList.iterator();
+    }
     
     /**
      * Parses the Set-Cookie2 value into an array of <tt>Cookie</tt>s.
@@ -251,11 +296,9 @@
         final String paramName = attribute.getName().toLowerCase();
         final String paramValue = attribute.getValue();
 
-        try {
-            CookieAttributeHandler handler = getAttributeHandler(paramName);
+        CookieAttributeHandler handler = findAttribHandler(paramName);
+        if (handler != null) {
             handler.parse(cookie, paramValue);
-        } catch (IllegalStateException canIgnore) {
-            // handler not registered for this paramName
         }
 
         // handle other cookie attributes
@@ -303,7 +346,7 @@
             return;
         }
         CookieSource cookiesource = new CookieSource(host, port, path, 
secure); 
-        for (Iterator i = attributeHandlerMap.values().iterator(); 
i.hasNext(); ) {
+        for (Iterator i = getAttribHandlerIterator(); i.hasNext(); ) {
                CookieAttributeHandler handler = (CookieAttributeHandler) 
i.next();
                handler.validate(cookie, cookiesource);
         }
@@ -335,7 +378,7 @@
             return rfc2109Spec.match(host, port, path, secure, cookie);
         }
         CookieSource cookiesource = new CookieSource(host, port, path, 
secure); 
-        for (Iterator i = attributeHandlerMap.values().iterator(); 
i.hasNext(); ) {
+        for (Iterator i = getAttribHandlerIterator(); i.hasNext(); ) {
                CookieAttributeHandler handler = (CookieAttributeHandler) 
i.next();
                if (!handler.match(cookie, cookiesource)) {
                        return false;
@@ -376,7 +419,7 @@
         Cookie2 cookie = (Cookie2) cookieParam;
         final StringBuffer buffer = new StringBuffer();
         // format cookie version
-        CookieAttributeHandler handler = getAttributeHandler(Cookie2.VERSION);
+        CookieAttributeHandler handler = getAttribHandler(Cookie2.VERSION);
         handler.format(buffer, cookie);
         // format cookie attributes
         formatCookieAttributes(buffer, cookie);
@@ -414,7 +457,7 @@
         /* format cookie2 cookies */
         final StringBuffer buffer = new StringBuffer();
         // format cookie version
-        CookieAttributeHandler handler = getAttributeHandler(Cookie2.VERSION);
+        CookieAttributeHandler handler = getAttribHandler(Cookie2.VERSION);
         handler.format(buffer, null);
 
         for (int i = 0; i < cookies.length; i++) {
@@ -433,16 +476,16 @@
      */
     private void formatCookieAttributes(final StringBuffer buffer, final 
Cookie2 cookie) {
         // format cookie name and value
-        CookieAttributeHandler handler = 
getAttributeHandler(Cookie2.COOKIE_NAME_KEY);
+        CookieAttributeHandler handler = 
getAttribHandler(Cookie2.COOKIE_NAME_KEY);
         handler.format(buffer, cookie);
         // format domain attribute
-        handler = getAttributeHandler(Cookie2.DOMAIN);
+        handler = getAttribHandler(Cookie2.DOMAIN);
         handler.format(buffer, cookie);
         // format path attribute
-        handler = getAttributeHandler(Cookie2.PATH);
+        handler = getAttribHandler(Cookie2.PATH);
         handler.format(buffer, cookie);
         // format port attribute
-        handler = getAttributeHandler(Cookie2.PORT);
+        handler = getAttribHandler(Cookie2.PORT);
         handler.format(buffer, cookie);
     }
 
@@ -490,26 +533,6 @@
                                                 + "attribute: " + 
e.getMessage());
         }
         return ports;
-    }
-
-    /**
-     * Gets attribute handler [EMAIL PROTECTED] CookieAttributeHandler} for the
-     * given attribute.
-     *
-     * @param name attribute name. e.g. Domain, Path, etc.
-     * @throws IllegalStateException if handler not found for the
-     *          specified attribute.
-     */
-    private CookieAttributeHandler getAttributeHandler(final String name)
-            throws IllegalStateException {
-        CookieAttributeHandler handler =
-                (CookieAttributeHandler)(attributeHandlerMap.get(name));
-        if (handler == null) {
-            throw new IllegalStateException("Handler not registered for " +
-                                            name + " attribute.");
-        } else {
-            return handler;
-        }
     }
 
     /**



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

Reply via email to