Author: michiel
Date: 2009-12-14 11:52:39 +0100 (Mon, 14 Dec 2009)
New Revision: 40227

Modified:
   
mmbase/branches/MMBase-1_9/applications/taglib/src/main/java/org/mmbase/bridge/jsp/taglib/util/BasicBacking.java
   
mmbase/branches/MMBase-1_9/applications/taglib/src/main/java/org/mmbase/bridge/jsp/taglib/util/ContextCollector.java
   
mmbase/branches/MMBase-1_9/applications/taglib/src/main/java/org/mmbase/bridge/jsp/taglib/util/ContextContainer.java
Log:
Merged -r 40226 from trunk to solve concurrentmodification exceptions

Modified: 
mmbase/branches/MMBase-1_9/applications/taglib/src/main/java/org/mmbase/bridge/jsp/taglib/util/BasicBacking.java
===================================================================
--- 
mmbase/branches/MMBase-1_9/applications/taglib/src/main/java/org/mmbase/bridge/jsp/taglib/util/BasicBacking.java
    2009-12-14 10:50:33 UTC (rev 40226)
+++ 
mmbase/branches/MMBase-1_9/applications/taglib/src/main/java/org/mmbase/bridge/jsp/taglib/util/BasicBacking.java
    2009-12-14 10:52:39 UTC (rev 40227)
@@ -58,7 +58,7 @@
      */
     public BasicBacking(PageContext pc, boolean ignoreEL) {
         pageContext = pc;
-        b = new HashMap<String, Object>();
+        b = Collections.synchronizedMap(new HashMap<String, Object>()); // The 
context can be put in the session, and then (e.g. when using ajax, can be 
access concurrently)
         isELIgnored = ignoreEL || pageContext == null || 
"true".equals(pc.getServletContext().getInitParameter(ContextTag.ISELIGNORED_PARAM));
         if (log.isDebugEnabled()) {
             log.debug("Pushing page Context " + pc + " --> " + isELIgnored);
@@ -98,7 +98,9 @@
             log.debug("EL ignored");
             return; // never mind
         } else {
-            log.debug("Pushing page context " + b);
+            if (log.isDebugEnabled()) {
+                log.debug("Pushing page context " + b);
+            }
         }
 
         originalPageContextValues = (Map<String, Object>) 
pageContext.getAttribute(PAGECONTEXT_KEY + uniqueNumber);
@@ -107,8 +109,10 @@
             pageContext.setAttribute(PAGECONTEXT_KEY + uniqueNumber, 
originalPageContextValues);
         }
         if (pageContext != null && ! pageContext.equals(origPageContext)) {
-            for (Map.Entry<String, Object> entry : b.entrySet()) {
-                mirrorPut(entry.getKey(), entry.getValue());
+            synchronized(b) {
+                for (Map.Entry<String, Object> entry : b.entrySet()) {
+                    mirrorPut(entry.getKey(), entry.getValue());
+                }
             }
         }
     }
@@ -140,52 +144,53 @@
     }
 
     @Override
-   public Set<Map.Entry<String, Object>> entrySet() {
+    public Set<Map.Entry<String, Object>> entrySet() {
+        System.out.println("" + Logging.stackTrace());
         return new AbstractSet<Map.Entry<String, Object>>() {
-                public int size() {
-                    return b.size();
-                }
-                public Iterator<Map.Entry<String, Object>> iterator() {
-                    return new Iterator<Map.Entry<String, Object>>() {
-                        Iterator<Map.Entry<String, Object>> i = 
b.entrySet().iterator();
-                        Map.Entry<String, Object> last = null;
-                        public boolean hasNext() {
-                            return i.hasNext();
-                        }
-                        public Map.Entry<String, Object> next() {
-                            last = new Map.Entry<String, Object>() {
-                                final Map.Entry<String, Object> wrapped = 
i.next();
-                                public final String getKey() {
-                                    return wrapped.getKey();
-                                }
-                                public final Object getValue() {
-                                    return wrapped.getValue();
-                                }
+            public int size() {
+                return b.size();
+            }
+            public Iterator<Map.Entry<String, Object>> iterator() {
+                return new Iterator<Map.Entry<String, Object>>() {
+                    Iterator<Map.Entry<String, Object>> i = 
b.entrySet().iterator();
+                    Map.Entry<String, Object> last = null;
+                    public boolean hasNext() {
+                        return i.hasNext();
+                    }
+                    public Map.Entry<String, Object> next() {
+                        last = new Map.Entry<String, Object>() {
+                            final Map.Entry<String, Object> wrapped = i.next();
+                            public final String getKey() {
+                                return wrapped.getKey();
+                            }
+                            public final Object getValue() {
+                                return wrapped.getValue();
+                            }
 
-                                public final Object setValue(Object v) {
-                                    
BasicBacking.this.mirrorPut(wrapped.getKey(), v);
-                                    return wrapped.setValue(v);
-                                }
-                                @Override
-                                public String toString() {
-                                    return getKey() + "=" + getValue();
-                                }
+                            public final Object setValue(Object v) {
+                                BasicBacking.this.mirrorPut(wrapped.getKey(), 
v);
+                                return wrapped.setValue(v);
+                            }
+                            @Override
+                            public String toString() {
+                                return getKey() + "=" + getValue();
+                            }
 
-                            };
-                            return last;
-                        }
-                        public void remove() {
-                            i.remove();
-                            if (! isELIgnored) {
-                                String key = last.getKey();
-                                if (! 
originalPageContextValues.containsKey(key)) {
-                                    originalPageContextValues.put(key, 
pageContext.getAttribute(key, SCOPE));
-                                }
-                                pageContext.removeAttribute(key, SCOPE);
+                        };
+                        return last;
+                    }
+                    public void remove() {
+                        i.remove();
+                        if (! isELIgnored) {
+                            String key = last.getKey();
+                            if (! originalPageContextValues.containsKey(key)) {
+                                originalPageContextValues.put(key, 
pageContext.getAttribute(key, SCOPE));
                             }
+                            pageContext.removeAttribute(key, SCOPE);
                         }
-                    };
-                }
+                    }
+                };
+            }
         };
     }
 
@@ -244,6 +249,22 @@
         return b.get(key);
     }
 
+    // Override for efficiency and synchronization
+    @Override
+    public Object remove(Object key) {
+        return b.remove(key);
+    }
+
+    @Override
+    public void clear() {
+        b.clear();
+    }
+
+    @Override
+    public boolean containsKey(Object key) {
+        return b.containsKey(key);
+    }
+
     public Object getOriginal(String key) {
         return b.get(key);
     }

Modified: 
mmbase/branches/MMBase-1_9/applications/taglib/src/main/java/org/mmbase/bridge/jsp/taglib/util/ContextCollector.java
===================================================================
--- 
mmbase/branches/MMBase-1_9/applications/taglib/src/main/java/org/mmbase/bridge/jsp/taglib/util/ContextCollector.java
        2009-12-14 10:50:33 UTC (rev 40226)
+++ 
mmbase/branches/MMBase-1_9/applications/taglib/src/main/java/org/mmbase/bridge/jsp/taglib/util/ContextCollector.java
        2009-12-14 10:52:39 UTC (rev 40227)
@@ -71,10 +71,12 @@
      */
     public final void doAfterBody(boolean iteratesAgain) throws 
JspTagException {
         if (iteratesAgain) {
-            for (Map.Entry<String, Object> e : backing.entrySet()) {
-                if (((CollectorBacking) backing).myKeys.contains(e.getKey())) {
-                    //parent.unRegister(e.getKey());
-                    unregister.put(e.getKey(), e.getValue());
+            synchronized(backing.getOriginalMap()) {
+                for (Map.Entry<String, Object> e : backing.entrySet()) {
+                    if (((CollectorBacking) 
backing).myKeys.contains(e.getKey())) {
+                        //parent.unRegister(e.getKey());
+                        unregister.put(e.getKey(), e.getValue());
+                    }
                 }
             }
             //

Modified: 
mmbase/branches/MMBase-1_9/applications/taglib/src/main/java/org/mmbase/bridge/jsp/taglib/util/ContextContainer.java
===================================================================
--- 
mmbase/branches/MMBase-1_9/applications/taglib/src/main/java/org/mmbase/bridge/jsp/taglib/util/ContextContainer.java
        2009-12-14 10:50:33 UTC (rev 40226)
+++ 
mmbase/branches/MMBase-1_9/applications/taglib/src/main/java/org/mmbase/bridge/jsp/taglib/util/ContextContainer.java
        2009-12-14 10:52:39 UTC (rev 40227)
@@ -454,6 +454,16 @@
         return getBacking().containsOwnKey(key);
     }
 
+    @Override
+    public Object remove(Object key) {
+        return getBacking().remove(key);
+    }
+    @Override
+    public void clear() {
+        getBacking().clear();
+    }
+
+
     /**
      * @since MMBase-1.7 (here)
      */

_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to