ovidiu      02/01/08 15:15:07

  Added:       src/scratchpad/schecoon/src/org/apache/cocoon/scheme/sitemap
                        SchemeSitemap.java
  Log:
  Renamed SitemapComponents to SchemeSitemap. This file contains now the definitions 
of the Scheme sitemap functions.
  
  Revision  Changes    Path
  1.1                  
xml-cocoon2/src/scratchpad/schecoon/src/org/apache/cocoon/scheme/sitemap/SchemeSitemap.java
  
  Index: SchemeSitemap.java
  ===================================================================
  package org.apache.cocoon.scheme.sitemap;
  
  import org.apache.avalon.framework.component.Component;
  import org.apache.avalon.framework.component.ComponentManager;
  import org.apache.avalon.framework.parameters.Parameters;
  import org.apache.cocoon.components.pipeline.EventPipeline;
  import org.apache.cocoon.components.pipeline.StreamPipeline;
  import org.apache.cocoon.environment.Environment;
  import sisc.ContinuationException;
  import sisc.Interpreter;
  import sisc.ModuleAdapter;
  import sisc.data.Pair;
  import sisc.data.Symbol;
  import sisc.data.Value;
  import sisc.modules.J2S;
  
  /**
   * This class contains the definition of the Scheme functions:
   *
   * <ul>
   *
   *  <li><b>sitemap:generate</b> - create a new {@link
   *  org.apache.cocoon.components.pipeline.EventPipeline}, and adds the
   *  generator specified by the function arguments to it. The prototype
   *  of Scheme function is:
   *  <pre>
   *   sitemap:generate: SitemapComponents Environment params -> EventPipeline
   *  </pre>
   *
   *
   *  <li><b>sitemap:read</b> - creates a new {@link
   *  org.apache.cocoon.components.pipeline.StreamPipeline} and a new
   *  {@link org.apache.cocoon.reading.Reader}, adds the reader to the
   *  pipeline, and returns the pipeline. The prototype of the Scheme
   *  function is:
   *  <pre>
   *   sitemap:read: SitemapComponents Environment params -> StreamPipeline
   *  </pre>
   *
   *  <li><b>sitemap:transform</b> - creates a transformer object of the
   *  type specified by the arguments, adds it to the pipeline passed as
   *  argument, and returns the pipeline. The prototype of the Scheme
   *  function is:
   *  <pre>
   *   sitemap:transform: SitemapComponents Environment params EventPipeline
   *                      -> EventPipeline
   *  </pre>
   *
   *  <li><b>sitemap:serialize</b> - creates a serializer object of the
   *  type specified by the arguments, adds it to the pipeline passed as
   *  argument, and returns the pipeline. The prototype of the Scheme
   *  function is:
   *  <pre>
   *   sitemap:serialize: SitemapComponents Environment params EventPipeline
   *                      -> EventPipeline
   *  </pre>
   *
   *  <li><b>sitemap:process</b> - processes the given pipeline passed
   *  as argument. This has the side effect of processing the pipeline,
   *  as it was specified in the sitemap.
   *  <pre>
   *   sitemap:process: SitemapComponents Environment params EventPipeline
   *                    -> void
   *  </pre>
   *
   * </ul>
   *
   * <p>With these Scheme functions, a pipeline processing setup would
   * look like this:
   *
   * <pre>
   * (match "some-url/(.*)" (sitemap env file . args)
   *   (sitemap:process sitemap env (list (cons 'type "xml"))
   *     (sitemap:transform sitemap env (list (cons 'type "xslt")
   *                                          (cons 'src "stylesheet/a.xsl"))
   *       (sitemap:generate sitemap env (list (cons 'src (concat "docs/" file))))
   *     )))
   * </pre>
   *
   * @author <a href="mailto:[EMAIL PROTECTED]";>Ovidiu Predescu</a>
   * @since December 20, 2001
   *
   * @see org.apache.cocoon.components.pipeline.EventPipeline
   * @see org.apache.cocoon.components.pipeline.StreamPipeline
   * @see org.apache.cocoon.reading.Reader
   */
  public class SchemeSitemap extends ModuleAdapter
  {
    public String getModuleName()
    {
      return "Apache Cocoon Sitemap Components";
    }
  
    public float getModuleVersion()
    {
      return 1.0f;
    }
  
    public static final int
      GENERATE = 1,
      READER = 2,
      TRANSFORM = 3,
      SERIALIZE = 4,
      PROCESS = 5;
  
    protected Parameters emptyParam = new Parameters();
  
    /**
     * Creates a new <code>SchemeSitemap</code> instance. Defines
     * the Scheme functions implemented by this module.
     */
    public SchemeSitemap()
    {
      define("sitemap:generate", GENERATE);
      define("sitemap:read", READER);
      define("sitemap:transform", TRANSFORM);
      define("sitemap:serialize", SERIALIZE);
      define("sitemap:process", PROCESS);
    }
  
    /**
     * 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
     */
    public Value eval(int primid, Interpreter r)
      throws ContinuationException
    {
      try {
        switch (r.vlr.length) {
  
          // Three argument functions
        case 3:
          switch (primid) {
          case GENERATE:
            return generate(r.vlr[0], r.vlr[1], r.vlr[2]);
          case READER:
            return read(r.vlr[0], r.vlr[1], r.vlr[2]);
          }
  
        case 4:
          switch (primid) {
          case TRANSFORM:
            return transform (r.vlr[0], r.vlr[1], r.vlr[2], r.vlr[3]);
          case SERIALIZE:
            return serialize (r.vlr[0], r.vlr[1], r.vlr[2], r.vlr[3]);
          case PROCESS:
            return process (r.vlr[0], r.vlr[1], r.vlr[2], r.vlr[3]);
          }
        }
      }
      catch (Exception ex) {
        ex.printStackTrace();
        throw new RuntimeException(ex.toString());
      }
  
      throw new RuntimeException("Invalid number of arguments to function "
                                 + r.acc + ", got " + r.vlr.length);
    }
  
    /**
     * Type cast function from a Scheme wrapper of a ComponentManager.
     *
     * @param scm a Scheme wrapper instance of a ComponentManager.
     * @return a <code>ComponentManager</code> value
     */
    static public SitemapComponents sitemapComponents(Value scm)
    {
      try {
        return (SitemapComponents)(((J2S.JavaObject)scm).o);
      }
      catch (ClassCastException ex) {
        typeError("SitemapComponents", scm);
      }
      return null;
    }
  
    /**
     * Type cast function from a Scheme wrapper of an Environment
     * instance.
     *
     * @param senv a Scheme wrapper of an Environment instance.
     * @return an <code>Environment</code> value
     */
    static public Environment environment(Value senv)
    {
      try {
        return (Environment)(((J2S.JavaObject)senv).o);
      }
      catch (ClassCastException ex) {
        typeError("Environment", senv);
      }
      return null;
    }
  
    /**
     * Retrieve an entry from an association list. Uses eq? to compare
     * the CAR of each entry.
     *
     * @param l the association list
     * @param v the value to be searched for
     * @return a <code>Pair</code> value representing the entry, or
     * <tt>FALSE</tt> if no such entry is present.
     */
    static public Value assq (Value l, Value v)
    {
      Pair list = pair(l);
      while (list != EMPTYLIST) {
        Pair entry = pair(list.car);
        if (entry.car.eq(v))
          return entry;
        list = pair(list.cdr);
      }
      return FALSE;
    }
  
    /**
     * Assumes the <tt>sparams</tt> is either an association list or the
     * FALSE value. It returns either an empty Avalon
     * <tt>Parameters</tt> instance, or a <tt>Parameters</tt> instance
     * that contains the values extracted from the association list.
     *
     * @param sparams a <code>Value</code> value, either <tt>FALSE</tt>
     * or an association list
     * @return an Avalon <code>Parameters</code> instance
     */
    public Parameters getParameters(Value sparams)
    {
      Parameters params = emptyParam;
  
      if (!sparams.eq(FALSE)) {
        params = new Parameters();
        Pair sparamValues = pair(pair(sparams).cdr);
        while (sparamValues != EMPTYLIST) {
          Pair entry = pair(sparamValues.car);
          String name = string(entry.car);
          String value = string(entry.cdr);
          params.setParameter(name, value);
          sparamValues = pair(sparamValues.cdr);
        }
      }
  
      return params;
    }
  
    /**
     * <p>Creates a new <tt>EventPipeline</tt> instance, and a new
     * Generator instance. Adds the Generator to the pipeline.
     *
     * <p>The type of the generator is specified in the <tt>sargs</tt>
     * list, which is a Scheme association list. The parameters to be
     * passed to the generators, if any, should be present in this
     * association list as the value of the <it>params</it> entry. This
     * value should be another association list, where the CAR of each
     * entry is the name of the parameter, and the CDR of the entry is
     * the actual value.
     *
     * <p>The recognized parameters are:
     *
     * <ul>
     *
     *  <li><b>src</b> - (required) the source of the generator
     *
     *  <li><b>type</b> - (optional) the type of generator. If not
     *  specified, the default generator specified using the
     *  <tt>default</tt> attribute of the <tt>generators</tt> XML
     *  element is used.
     *
     *  <li><b>params</b> - (optional) the parameters to be passed to
     *  the generator. The CDR of this association entry should be
     *  another association entry, that contains the names and values of
     *  the parameters.
     *
     * </ul>
     *
     * <p><b>Example:</b>
     *
     * <pre>
     * (match "generate/(.*)" (sitemap env file . args)
     *  (sitemap:generate sitemap env
     *                    (list (cons 'src (concat "doc/samples" file ".xml")))))
     * </pre>
     *
     * @param scm the Scheme wrapper for the SitemapComponents instance
     * @param senv the Scheme wrapper for the Environment instance
     * @param sargs the Scheme arguments, as list
     * @return a Scheme wrapper for the <tt>EventPipeline</tt> instance
     * @exception Exception if an error occurs
     *
     * @see SitemapComponents
     */
    public Value generate(Value scm, Value senv, Value sargs)
      throws Exception
    {
      SitemapComponents sitemapComponents = sitemapComponents(scm);
      EventPipeline eventPipeline = sitemapComponents.getEventPipeline();
  
      // Obtain the 'src' attribute
      Value ssrc = assq(sargs, Symbol.get("src"));
      if (ssrc.eq(FALSE))
        throw new RuntimeException("No 'src' attribute specified for 'generate'!");
      String src = string(pair(ssrc).cdr);
  
      // Obtain the 'type' attribute
      Value stype = assq(sargs, Symbol.get("type"));
      String type;
      if (!stype.eq(FALSE))
        type = string(pair(ssrc).cdr);
      else
        type = sitemapComponents.getDefaultGeneratorType();
  
      // Obtain the parameters
      Value sparams = assq(sargs, Symbol.get("params"));
      Parameters params = getParameters(sparams);
  
      eventPipeline.setGenerator(type, src, params);
  
      return new J2S.JavaObject(eventPipeline);
    }
  
    /**
     * <p>Creates a new <tt>Reader</tt> and a new
     * <tt>StreamPipeline</tt>. Adds the reader to the pipeline and
     * returns the pipeline newly created.
     *
     * <p>The parameters that describe the reader are specified in the
     * <tt>sargs</tt> list, which is a Scheme association list.
     *
     * <p>The recognized parameters for a reader are:
     *
     * <ul>
     *  <li><b>src</b> - (required) the source for the reader
     *
     *  <li><b>mime-type</b> - (optional) the MIME type associated with
     *  the source. If no MIME type is specified, text/html is assumed.
     *
     *  <li><b>type</b> - (optional) if no type is specified, the
     *  default reader type is used. The default reader type is
     *  specified using the <tt>default</tt> attribute of the
     *  <tt>readers</tt> XML element.
     *
     *  <li><b>params</b> - (optional) additional parameters to be
     *  specified when configuring the reader. The value of this entry
     *  should be a Scheme association list, which contains the
     *  additional parameters.
     *
     * </ul>
     *
     * @param scm the Scheme wrapper for the SitemapComponents instance
     * @param senv the Scheme wrapper for the Environment instance
     * @param sargs the Scheme arguments, as list
     * @return a Scheme wrapper for the <tt>StreamPipeline</tt> instance
     * @exception Exception if an error occurs
     *
     * @see SitemapComponents
     */
    public Value read(Value scm, Value senv, Value sargs)
      throws Exception
    {
      SitemapComponents sitemapComponents = sitemapComponents(scm);
      StreamPipeline streamPipeline = sitemapComponents.getStreamPipeline();
      EventPipeline eventPipeline = sitemapComponents.getEventPipeline();
  
      streamPipeline.setEventPipeline(eventPipeline);
  
      // Obtain the 'src' attribute
      Value ssrc = assq(sargs, Symbol.get("src"));
      if (ssrc.eq(FALSE))
        throw new RuntimeException("No 'src' attribute specified for 'read'!");
      String src = string(pair(ssrc).cdr);
  
      // Obtain the 'mime-type' attribute
      Value smimeType = assq(sargs, Symbol.get("mime-type"));
      String mimeType;
      if (smimeType.eq(FALSE))
        mimeType = "text/html";
      else
        mimeType = string(pair(smimeType).cdr);
  
      // Obtain the 'type' attribute
      Value stype = assq(sargs, Symbol.get("type"));
      String type;
      if (!stype.eq(FALSE))
        type = string(pair(ssrc).cdr);
      else
        type = sitemapComponents.getDefaultReaderType();
  
      // Obtain the parameters
      Value sparams = assq(sargs, Symbol.get("params"));
      Parameters params = getParameters(sparams);
  
      streamPipeline.setReader(type, src, params, mimeType);
  
      return new J2S.JavaObject(streamPipeline);
    }
  
    public Value transform(Value scm, Value senv, Value sargs, Value spipeline)
    {
      return null;
    }
  
    public Value serialize(Value scm, Value senv, Value sargs, Value spipeline)
    {
      return null;
    }
  
    /**
     * Invokes the <tt>process</tt> method of the pipeline instance
     * passed as argument. The pipeline could be either an {@link
     * org.apache.cocoon.components.pipeline.EventPipeline} or a {@link
     * org.apache.cocoon.components.pipeline.StreamPipeline}.
     *
     * <p>This function releases the pipeline, so it must be the last
     * function you call on the pipeline.
     *
     * @param scm the Scheme wrapper for the SitemapComponents instance
     * @param senv the Scheme wrapper for the Environment instance
     * @param sargs the Scheme arguments, as list
     * @param spipeline the Scheme wrapper for pipeline object
     * @return null
     * @exception Exception if an error occurs
     */
    public Value process(Value scm, Value senv, Value sargs, Value spipeline)
      throws Exception
    {
      SitemapComponents sitemapComponents = sitemapComponents(scm);
      Environment env = environment(senv);
      Object pipeline = ((J2S.JavaObject)spipeline).o;
  
      if (pipeline instanceof EventPipeline)
        ((EventPipeline)pipeline).process(env);
      else {
        ((StreamPipeline)pipeline).process(env);
        EventPipeline eventPipeline
          = ((StreamPipeline)pipeline).getEventPipeline();
        sitemapComponents.releasePipeline((Component)eventPipeline);
      }
  
      sitemapComponents.releasePipeline((Component)pipeline);
  
      return null;
    }
  }
  
  
  

----------------------------------------------------------------------
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