You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by jo...@apache.org on 2008/04/02 05:59:31 UTC
svn commit: r643716 -
/cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/flow/ContinuationsManagerImpl.java
Author: joerg
Date: Tue Apr 1 20:59:30 2008
New Revision: 643716
URL: http://svn.apache.org/viewvc?rev=643716&view=rev
Log:
revert changes for revision 642855, rather start the refactoring for fixing threading issues from before that revision
Modified:
cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/flow/ContinuationsManagerImpl.java
Modified: cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/flow/ContinuationsManagerImpl.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/flow/ContinuationsManagerImpl.java?rev=643716&r1=643715&r2=643716&view=diff
==============================================================================
--- cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/flow/ContinuationsManagerImpl.java (original)
+++ cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/flow/ContinuationsManagerImpl.java Tue Apr 1 20:59:30 2008
@@ -18,6 +18,7 @@
import java.security.SecureRandom;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -26,7 +27,6 @@
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
-
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
@@ -40,6 +40,7 @@
import org.apache.avalon.framework.service.ServiceManager;
import org.apache.avalon.framework.service.Serviceable;
import org.apache.avalon.framework.thread.ThreadSafe;
+
import org.apache.cocoon.components.ContextHelper;
import org.apache.cocoon.environment.ObjectModelHelper;
import org.apache.cocoon.environment.Request;
@@ -90,7 +91,7 @@
* This set is used only for debugging purposes by
* {@link #displayAllContinuations()} method.
*/
- protected Set forest = new HashSet();
+ protected Set forest = Collections.synchronizedSet(new HashSet());
/**
* Main continuations holder. Used unless continuations are stored in user
@@ -103,7 +104,7 @@
* their expiration time. This is used by the background thread to
* invalidate continuations.
*/
- protected SortedSet expirations = new TreeSet();
+ protected SortedSet expirations = Collections.synchronizedSortedSet(new TreeSet());
protected boolean bindContinuationsToSession;
@@ -168,16 +169,14 @@
WebContinuation wk = generateContinuation(kont, parent, ttl, interpreterId, disposer);
- synchronized (this) {
- if (parent == null) {
- forest.add(wk);
- } else {
- handleParentContinuationExpiration(parent);
- }
-
- handleLeafContinuationExpiration(wk);
+ if (parent == null) {
+ forest.add(wk);
+ } else {
+ handleParentContinuationExpiration(parent);
}
+ handleLeafContinuationExpiration(wk);
+
if (getLogger().isDebugEnabled()) {
getLogger().debug("WK: Created continuation " + wk.getId());
}
@@ -209,10 +208,8 @@
*/
public List getWebContinuationsDataBeanList() {
List beanList = new ArrayList();
- synchronized (this) {
- for(Iterator it = this.forest.iterator(); it.hasNext();) {
- beanList.add(new WebContinuationDataBean((WebContinuation) it.next()));
- }
+ for(Iterator it = this.forest.iterator(); it.hasNext();) {
+ beanList.add(new WebContinuationDataBean((WebContinuation) it.next()));
}
return beanList;
}
@@ -242,14 +239,12 @@
return null;
}
- synchronized (this) {
- // COCOON-2109: Sorting in the TreeSet happens on insert. So in order to re-sort the
- // continuation has to be re-added.
- expirations.remove(kont);
- kont.updateLastAccessTime();
- expirations.add(kont);
- }
-
+ // COCOON-2109: Sorting in the TreeSet happens on insert. So in order to re-sort the
+ // continuation has to be re-added.
+ expirations.remove(kont);
+ kont.updateLastAccessTime();
+ expirations.add(kont);
+
return kont;
}
@@ -328,9 +323,8 @@
getLogger().debug("WK: Manual expire of continuation " + wk.getId());
}
disposeContinuation(continuationsHolder, wk);
- synchronized (this) {
- expirations.remove(wk);
- }
+ expirations.remove(wk);
+
// Invalidate all the children continuations as well
List children = wk.getChildren();
int size = children.size();
@@ -349,9 +343,7 @@
protected void _detach(WebContinuation wk) {
WebContinuation parent = wk.getParentContinuation();
if (parent == null) {
- synchronized (this) {
- forest.remove(wk);
- }
+ forest.remove(wk);
} else
wk.detachFromParent();
}
@@ -382,7 +374,7 @@
return;
}
- // remove access to this continuation
+ // remove access to this contination
disposeContinuation(continuationsHolder, wk);
_detach(wk);
@@ -404,21 +396,22 @@
*/
protected void displayExpireSet() {
StringBuffer wkSet = new StringBuffer("\nWK; Expire set size: " + expirations.size());
- synchronized (this) {
- Iterator i = expirations.iterator();
- while (i.hasNext()) {
- final WebContinuation wk = (WebContinuation) i.next();
- final long lat = wk.getLastAccessTime() + wk.getTimeToLive();
- wkSet.append("\nWK: ").append(wk.getId()).append(" ExpireTime [");
-
- if (lat < System.currentTimeMillis()) {
- wkSet.append("Expired");
- } else {
- wkSet.append(lat);
- }
- wkSet.append("]");
+ Iterator i = expirations.iterator();
+ while (i.hasNext()) {
+ final WebContinuation wk = (WebContinuation) i.next();
+ final long lat = wk.getLastAccessTime() + wk.getTimeToLive();
+ wkSet.append("\nWK: ")
+ .append(wk.getId())
+ .append(" ExpireTime [");
+
+ if (lat < System.currentTimeMillis()) {
+ wkSet.append("Expired");
+ } else {
+ wkSet.append(lat);
}
+ wkSet.append("]");
}
+
getLogger().debug(wkSet.toString());
}
@@ -427,11 +420,9 @@
* in the system
*/
public void displayAllContinuations() {
- synchronized (this) {
- final Iterator i = forest.iterator();
- while (i.hasNext()) {
- getLogger().debug(i.next().toString());
- }
+ final Iterator i = forest.iterator();
+ while (i.hasNext()) {
+ getLogger().debug(i.next().toString());
}
}
@@ -453,21 +444,18 @@
// Clean up expired continuations
int count = 0;
WebContinuation wk;
- synchronized (this) {
- Iterator i = expirations.iterator();
- while (i.hasNext()
- && ((wk = (WebContinuation) i.next()).hasExpired())) {
- i.remove();
- WebContinuationsHolder continuationsHolder;
- if (wk instanceof HolderAwareWebContinuation)
- continuationsHolder =
- ((HolderAwareWebContinuation) wk).getContinuationsHolder();
- else
- continuationsHolder = this.continuationsHolder;
- removeContinuation(continuationsHolder, wk);
- count++;
- }
+ Iterator i = expirations.iterator();
+ while (i.hasNext() && ((wk = (WebContinuation) i.next()).hasExpired())) {
+ i.remove();
+ WebContinuationsHolder continuationsHolder;
+ if (wk instanceof HolderAwareWebContinuation)
+ continuationsHolder = ((HolderAwareWebContinuation) wk).getContinuationsHolder();
+ else
+ continuationsHolder = this.continuationsHolder;
+ removeContinuation(continuationsHolder, wk);
+ count++;
}
+
if (getLogger().isDebugEnabled()) {
getLogger().debug("WK Cleaned up " + count + " continuations in " +
(System.currentTimeMillis() - now));
@@ -485,15 +473,18 @@
* about session invalidation. Invalidates all continuations held by passed
* continuationsHolder.
*/
- protected void invalidateContinuations(WebContinuationsHolder continuationsHolder) {
- synchronized (continuationsHolder) {
- Set continuationIds = continuationsHolder.getContinuationIds();
- for (Iterator iter = continuationIds.iterator(); iter.hasNext();) {
- WebContinuation wk = continuationsHolder.get((Object)iter.next());
- if (wk != null) {
- _detach(wk);
- _invalidate(continuationsHolder, wk);
- }
+ protected void invalidateContinuations(
+ WebContinuationsHolder continuationsHolder) {
+ // TODO: this avoids ConcurrentModificationException, still this is not
+ // the best solution and should be changed
+ Object[] continuationIds = continuationsHolder.getContinuationIds()
+ .toArray();
+
+ for (int i = 0; i < continuationIds.length; i++) {
+ WebContinuation wk = continuationsHolder.get(continuationIds[i]);
+ if (wk != null) {
+ _detach(wk);
+ _invalidate(continuationsHolder, wk);
}
}
}
@@ -540,36 +531,26 @@
private final static String CONTINUATIONS_HOLDER =
"o.a.c.c.f.SCMI.WebContinuationsHolder";
- private Map holder = new HashMap();
+ private Map holder = Collections.synchronizedMap(new HashMap());
public WebContinuation get(Object id) {
- synchronized (this) {
- return (WebContinuation) this.holder.get(id);
- }
+ return (WebContinuation) this.holder.get(id);
}
public void addContinuation(WebContinuation wk) {
- synchronized (this) {
- this.holder.put(wk.getId(), wk);
- }
+ this.holder.put(wk.getId(), wk);
}
public void removeContinuation(WebContinuation wk) {
- synchronized (this) {
- this.holder.remove(wk.getId());
- }
+ this.holder.remove(wk.getId());
}
public Set getContinuationIds() {
- synchronized (this) {
- return holder.keySet();
- }
+ return holder.keySet();
}
public boolean contains(String continuationId) {
- synchronized (this) {
- return this.holder.containsKey(continuationId);
- }
+ return this.holder.containsKey(continuationId);
}
public boolean contains(WebContinuation wk) {
@@ -607,6 +588,10 @@
return continuationsHolder;
}
+ //retain comparation logic from parent
+ public int compareTo(Object other) {
+ return super.compareTo(other);
+ }
}
}