You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by xu...@apache.org on 2010/04/28 11:00:59 UTC

svn commit: r938824 - /geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardContext.java

Author: xuhaihong
Date: Wed Apr 28 09:00:58 2010
New Revision: 938824

URL: http://svn.apache.org/viewvc?rev=938824&view=rev
Log:
Merge Tomcat r938814 to fix the ArrayIndexOutOfBoundsException

Modified:
    geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardContext.java

Modified: geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardContext.java
URL: http://svn.apache.org/viewvc/geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardContext.java?rev=938824&r1=938823&r2=938824&view=diff
==============================================================================
--- geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardContext.java (original)
+++ geronimo/external/trunk/tomcat-parent-7.0.0/catalina/src/main/java/org/apache/catalina/core/StandardContext.java Wed Apr 28 09:00:58 2010
@@ -383,21 +383,7 @@ public class StandardContext
      * added via the {@link ServletContext} possibly both before and after those
      * defined in the deployment descriptor.
      */
-    private FilterMap filterMaps[] = new FilterMap[0];
-    
-    private final Object filterMapsLock = new Object();
-
-
-    /**
-     * Filter mappings added via {@link ServletContext} may have to be inserted
-     * before the mappings in the deployment descriptor but must be inserted in
-     * the order the {@link ServletContext} methods are called. This isn't an
-     * issue for the mappings added after the deployment descriptor - they are
-     * just added to the end - but correctly the adding mappings before the
-     * deployment descriptor mappings requires knowing where the last 'before'
-     * mapping was added.
-     */
-    private int filterMapInsertPoint = 0;
+    private final ContextFilterMaps filterMaps = new ContextFilterMaps();
 
     /**
      * Ignore annotations.
@@ -2590,15 +2576,9 @@ public class StandardContext
      *  is malformed
      */
     public void addFilterMap(FilterMap filterMap) {
-
         validateFilterMap(filterMap);
         // Add this filter mapping to our registered set
-        synchronized (filterMapsLock) {
-            FilterMap results[] = Arrays.copyOf(filterMaps,
-                    filterMaps.length + 1);
-            results[filterMaps.length] = filterMap;
-            filterMaps = results;
-        }
+        filterMaps.add(filterMap);
         fireContainerEvent("addFilterMap", filterMap);
     }
 
@@ -2614,22 +2594,9 @@ public class StandardContext
      *  is malformed
      */
     public void addFilterMapBefore(FilterMap filterMap) {
-
         validateFilterMap(filterMap);
-
         // Add this filter mapping to our registered set
-        synchronized (filterMapsLock) {
-            FilterMap results[] = new FilterMap[filterMaps.length + 1];
-            System.arraycopy(filterMaps, 0, results, 0, filterMapInsertPoint);
-            results[filterMapInsertPoint] = filterMap;
-            System.arraycopy(filterMaps, filterMapInsertPoint, results,
-                    filterMapInsertPoint + 1,
-                    filterMaps.length - filterMapInsertPoint);
-            
-            filterMapInsertPoint++;
-
-            filterMaps = results;
-        }
+        filterMaps.addBefore(filterMap);
         fireContainerEvent("addFilterMap", filterMap);
     }
 
@@ -3139,9 +3106,7 @@ public class StandardContext
      * Return the set of filter mappings for this Context.
      */
     public FilterMap[] findFilterMaps() {
-
-        return (filterMaps);
-
+        return filterMaps.asArray();
     }
 
 
@@ -3711,35 +3676,9 @@ public class StandardContext
      * @param filterMap The filter mapping to be removed
      */
     public void removeFilterMap(FilterMap filterMap) {
-
-        synchronized (filterMapsLock) {
-
-            // Make sure this filter mapping is currently present
-            int n = -1;
-            for (int i = 0; i < filterMaps.length; i++) {
-                if (filterMaps[i] == filterMap) {
-                    n = i;
-                    break;
-                }
-            }
-            if (n < 0)
-                return;
-
-            // Remove the specified filter mapping
-            FilterMap results[] = new FilterMap[filterMaps.length - 1];
-            System.arraycopy(filterMaps, 0, results, 0, n);
-            System.arraycopy(filterMaps, n + 1, results, n,
-                             (filterMaps.length - 1) - n);
-            if (n < filterMapInsertPoint) {
-                filterMapInsertPoint--;
-            }
-            filterMaps = results;
-
-        }
-
+        filterMaps.remove(filterMap);
         // Inform interested listeners
         fireContainerEvent("removeFilterMap", filterMap);
-
     }
 
 
@@ -4104,6 +4043,116 @@ public class StandardContext
         return null;
     }
 
+
+    /**
+     * A helper class to manage the filter mappings in a Context.
+     */
+    private static final class ContextFilterMaps {
+        private final Object lock = new Object();
+
+        /**
+         * The set of filter mappings for this application, in the order they
+         * were defined in the deployment descriptor with additional mappings
+         * added via the {@link ServletContext} possibly both before and after
+         * those defined in the deployment descriptor.
+         */
+        private FilterMap[] array = new FilterMap[0];
+
+        /**
+         * Filter mappings added via {@link ServletContext} may have to be
+         * inserted before the mappings in the deployment descriptor but must be
+         * inserted in the order the {@link ServletContext} methods are called.
+         * This isn't an issue for the mappings added after the deployment
+         * descriptor - they are just added to the end - but correctly the
+         * adding mappings before the deployment descriptor mappings requires
+         * knowing where the last 'before' mapping was added.
+         */
+        private int insertPoint = 0;
+
+        /**
+         * Reset the set to the initial state.
+         */
+        public void clear() {
+            synchronized (lock) {
+                array = new FilterMap[0];
+                insertPoint = 0;
+            }
+        }
+
+        /**
+         * Return the set of filter mappings.
+         */
+        public FilterMap[] asArray() {
+            synchronized (lock) {
+                return array;
+            }
+        }
+
+        /**
+         * Add a filter mapping at the end of the current set of filter
+         * mappings.
+         * 
+         * @param filterMap
+         *            The filter mapping to be added
+         */
+        public void add(FilterMap filterMap) {
+            synchronized (lock) {
+                FilterMap results[] = Arrays.copyOf(array, array.length + 1);
+                results[array.length] = filterMap;
+                array = results;
+            }
+        }
+
+        /**
+         * Add a filter mapping before the mappings defined in the deployment
+         * descriptor but after any other mappings added via this method.
+         * 
+         * @param filterMap
+         *            The filter mapping to be added
+         */
+        public void addBefore(FilterMap filterMap) {
+            synchronized (lock) {
+                FilterMap results[] = new FilterMap[array.length + 1];
+                System.arraycopy(array, 0, results, 0, insertPoint);
+                System.arraycopy(array, insertPoint, results, insertPoint + 1,
+                        array.length - insertPoint);
+                results[insertPoint] = filterMap;
+                array = results;
+                insertPoint++;
+            }
+        }
+
+        /**
+         * Remove a filter mapping.
+         *
+         * @param filterMap The filter mapping to be removed
+         */
+        public void remove(FilterMap filterMap) {
+            synchronized (lock) {
+                // Make sure this filter mapping is currently present
+                int n = -1;
+                for (int i = 0; i < array.length; i++) {
+                    if (array[i] == filterMap) {
+                        n = i;
+                        break;
+                    }
+                }
+                if (n < 0)
+                    return;
+
+                // Remove the specified filter mapping
+                FilterMap results[] = new FilterMap[array.length - 1];
+                System.arraycopy(array, 0, results, 0, n);
+                System.arraycopy(array, n + 1, results, n, (array.length - 1)
+                        - n);
+                array = results;
+                if (n < insertPoint) {
+                    insertPoint--;
+                }
+            }
+        }
+    }
+
     // --------------------------------------------------------- Public Methods