ovidiu      02/02/08 16:19:50

  Added:       src/scratchpad/schecoon/src/org/apache/cocoon/scheme/sitemap
                        ContinuationsManager.java
  Log:
  Manages the continuation objects.
  
  Revision  Changes    Path
  1.1                  
xml-cocoon2/src/scratchpad/schecoon/src/org/apache/cocoon/scheme/sitemap/ContinuationsManager.java
  
  Index: ContinuationsManager.java
  ===================================================================
  package org.apache.cocoon.scheme.sitemap;
  
  import java.lang.Math;
  import java.security.SecureRandom;
  import java.util.HashMap;
  import sisc.ContinuationException;
  import sisc.Interpreter;
  import sisc.ModuleAdapter;
  import sisc.data.ImmutableString;
  import sisc.data.Value;
  
  /**
   * Manages the continuation objects.
   *
   * @author <a href="mailto:[EMAIL PROTECTED]";>Ovidiu Predescu</a>
   * @since February 8, 2002
   */
  public class ContinuationsManager extends ModuleAdapter
  {
    static protected int CONTINUATION_ID_LENGTH = 20;
  
    public String getModuleName()
    {
      return "Continuations Manager";
    }
  
    public float getModuleVersion()
    {
      return 1.0f;
    }
  
    public static final int
      REGISTER = 1,
      GET = 2,
      REMOVE = 3;
  
    /**
     * Random generator for continuation identifiers.
     */
    protected SecureRandom random = null;
  
    /**
     * Array of bytes used internally to generate the continuation
     * identifier.
     */
    protected byte[] bytes;
  
    /**
     * Association between string identifiers and continuation objects.
     */
    protected HashMap continuations = new HashMap();
  
    public ContinuationsManager()
      throws Exception
    {
      random = SecureRandom.getInstance("SHA1PRNG");
      random.setSeed(System.currentTimeMillis());
      bytes = new byte[CONTINUATION_ID_LENGTH];
  
      define("continuations:register", REGISTER);
      define("continuations:get", GET);
      define("continuations:remove", REMOVE);
    }
  
    /**
     * The SISC evaluator function for this module. Executes the actual
     * Java code corresponding to the Scheme functions defined by the
     * module.
     *
     * @param primid an <code>int</code> value
     * @param r an <code>Interpreter</code> value
     * @return a <code>Value</code> value
     * @exception ContinuationException if an error occurs
     */
    public Value eval(int primid, Interpreter r)
      throws ContinuationException
    {
      switch (r.vlr.length) {
        // One argument functions
      case 1:
        switch (primid) {
        case REGISTER:
          return registerContinuation(r.vlr[0]);
        case GET:
          return getContinuationFromId(r.vlr[0]);
        case REMOVE:
          return removeContinuationId(r.vlr[0]);
        }
      }
  
      throw new RuntimeException("Invalid number of arguments to function "
                                 + r.acc + ", got " + r.vlr.length);
    }
  
    /**
     * Registers a continuation object and returns an identifier
     * associated with it.
     *
     * @param kont a continuation object
     * @return a <code>Value</code> value, representing the string identifier
     */
    public Value registerContinuation(Value kont)
    {
      Value kontId;
  
      char[] result = new char[bytes.length * 2];
      String continuationId = null;
      
      synchronized(continuations) {
        do {
          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);
        } while (continuations.containsKey(continuationId));
        continuations.put(continuationId, kont);
      }
  
      return new ImmutableString(continuationId);
    }
  
    /**
     * Given a Scheme string identifier, return the corresponding
     * continuation.
     *
     * @param id the string identifier
     * @return the continuation object, or <code>null</code> if no such
     * continuation is registered.
     */
    public Value getContinuationFromId(Value id)
    {
      String continuationId = string(id);
  
      return (Value)continuations.get(continuationId);
    }
  
    /**
     * Given a continuation id, remove the associated continuation from
     * the store.
     *
     * @param id the string identifier for the continuation
     * @return the continuation object removed
     */
    public Value removeContinuationId(Value id)
    {
      synchronized(continuations) {
        return (Value)continuations.remove(string(id));
      }
    }
  }
  
  
  

----------------------------------------------------------------------
In case of troubles, e-mail:     [EMAIL PROTECTED]
To unsubscribe, e-mail:          [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to