ovidiu 02/03/21 15:12:57 Added: src/scratchpad/schecoon/src/org/apache/cocoon/components/flow ContinuationsManagerImpl.java Log: Added. The implementation of the ContinuationsManager interface. Revision Changes Path 1.1 xml-cocoon2/src/scratchpad/schecoon/src/org/apache/cocoon/components/flow/ContinuationsManagerImpl.java Index: ContinuationsManagerImpl.java =================================================================== package org.apache.cocoon.components.flow; import java.security.SecureRandom; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.avalon.framework.component.Component; import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.component.Composable; import org.apache.avalon.framework.configuration.Configurable; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.logger.AbstractLoggable; import org.apache.avalon.framework.thread.ThreadSafe; import java.util.Iterator; /** * The default implementation of {@link ContinuationsManager}. * * @author <a href="mailto:[EMAIL PROTECTED]">Ovidiu Predescu</a> * @since March 19, 2002 * @see ContinuationsManager */ public class ContinuationsManagerImpl extends AbstractLoggable implements ContinuationsManager, Component, Configurable, ThreadSafe { static final int CONTINUATION_ID_LENGTH = 20; protected SecureRandom random = null; protected byte[] bytes; /** * How long does a continuation exist in memory since the last * access? The time is in seconds, and the default is 3600 (1 hour). * * FIXME: Not used for the moment. */ protected int timeToLive; /** * Maintains the forrest of <code>WebContinuation</code> trees. */ protected Set forrest = Collections.synchronizedSet(new HashSet()); /** * Association between <code>WebContinuation</code> ids and the * corresponding <code>WebContinuation</code> object. */ protected Map idToWebCont = Collections.synchronizedMap(new HashMap()); public ContinuationsManagerImpl() throws Exception { random = SecureRandom.getInstance("SHA1PRNG"); random.setSeed(System.currentTimeMillis()); bytes = new byte[CONTINUATION_ID_LENGTH]; } public void configure(Configuration config) { this.timeToLive = config.getAttributeAsInteger("time-to-live", 3600); } public WebContinuation createWebContinuation(Object kont, WebContinuation parentKont) { WebContinuation wk = new WebContinuation(kont, parentKont, this); if (parentKont == null) forrest.add(wk); // No need to add the WebContinuation in idToWebCont as it was // already done during its construction. return wk; } public void invalidateWebContinuation(WebContinuation wk) { WebContinuation parent = wk.getParentContinuation(); if (parent == null) forrest.remove(wk); else { List parentKids = parent.getChildren(); parentKids.remove(wk); } _invalidate(wk); } protected void _invalidate(WebContinuation wk) { idToWebCont.remove(wk.getId()); // Invalidate all the children continuations as well List children = wk.getChildren(); int size = children.size(); for (int i = 0; i < size; i++) _invalidate((WebContinuation)children.get(i)); } public WebContinuation lookupWebContinuation(String id) { return (WebContinuation)idToWebCont.get(id); } /** * Generate a unique identifier for a * <code>WebContinuation</code>. The identifier is generated using a * cryptographically strong algorithm to prevent people to generate * their own identifiers. * * <p>It has the side effect of interning the continuation object in * the <code>idToWebCont</code> hash table. * * @param wk a <code>WebContinuation</code> object for which the * identifier should be generated. * @return the <code>String</code> identifier of the * <code>WebContinuation</code> */ public String generateContinuationId(WebContinuation wk) { char[] result = new char[bytes.length * 2]; String continuationId = null; while (true) { random.nextBytes(bytes); for (int i = 0; i < CONTINUATION_ID_LENGTH; i++) { byte ch = bytes[i]; result[2 * i] = Character.forDigit(Math.abs(ch >> 4), 16); result[2 * i + 1] = Character.forDigit(Math.abs(ch & 0x0f), 16); } continuationId = new String(result); synchronized(idToWebCont) { if (!idToWebCont.containsKey(continuationId)) { idToWebCont.put(continuationId, wk); break; } } } return continuationId; } public void displayAllContinuations() { Iterator iter = forrest.iterator(); while (iter.hasNext()) ((WebContinuation)iter.next()).display(); } }
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]