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