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]