How about this?  If I read you right, what you're really going for is not
getting the sitemap parameters but the request parameters.  There's a
difference between doing that from within the sitemap and within java code
like this.  I'm not positive this will compile, and I'm not 100% positive
that this keeps up with any changes in the last few months but I think it's
OK on both counts.  Of course, one would never want to put all that text
formatted data in there - I just wanted to change as little as possible for
the sake of comparison.

// for the setup() method
import org.apache.cocoon.environment.SourceResolver;
import java.util.Map;
import org.apache.avalon.framework.parameters.Parameters;
// used to get and hold the request parameters.
import org.apache.cocoon.environment.ObjectModelHelper;
import org.apache.cocoon.environment.Request;
import java.util.Enumeration;


public class NewAnyName extends AbstractGenerator 
{

    // will be initialized in the setup() method and used in generate()
    Request request = null;
    Enumeration paramNames = null;

    /**
     * Implement the generate() method from AbstractGenerator.
     * It simply generates SAX events using SAX methods.  I haven't
     * tested it, but this has to be faster than parsing them from a string.
     * I've made comments on many of the original comments (which have been
promoted
     * to "really commented out" status: ////)
     */

    public void generate() throws IOException, SAXException, 
ProcessingException
    {
      // xspAttr will stay empty for this simple implementation
      // If we had any attributes in our tags, we would add them to this
variable
      // before the call to startElement(), and either create a new
AttributesImpl
      // instance for each element, or reuse one being careful to reset it
before 
      // each use.
      
      AttributesImpl xspAttr = new AttributesImpl();
      // contentHandler is inherited from
org.apache.cocoon.xml.AbstractXMLProducer
      contentHandler.startDocument();
      
        ////This string will be feeded to the transformer pipeline as sax
events
        // String xmlText = "<doc>\nMy first Cocoon 2 generator\n";
        // - nope, do this with SAX:
      contentHandler.startElement("", "doc", "doc", xspAttr);
      
      // NOTE: xml is not the place to worry about line break characters.
For the sake of the
      // simple example, I left many of yours in, but you really would
handle the parameter information
      // using nested tags (which you can do easily by nesting
startElement()-endElement() paired calls inside
      // this element).
      // By the way, the characters(char[] chars, int start, int end) begs
to be overloaded with 
      // a version like characters(String justPutTheWholeThingIn) that
handles the conversion
      // to a character array and assumes you want from beginning to end.  I
thought some of the cocoon
      // Generators did this, but I can't find any right now.  You'll
probably want to set up a convenient 
      // BaseGenerator with helpers like that and extend it for your real
Generators.
      contentHandler.characters("My first Cocoon 2
generator\n".toCharArray(),0,"My first Cocoon 2 generator\n".length());

        ////This object will read and parse the XML content
        // no longer needed since we're using SAX methods
        //XMLReader xmlReader = XMLReaderFactory.createXMLReader();

        ////super.xmlConsumer will receive the SAX events
        ////xmlReader.setContentHandler(super.xmlConsumer);
        
        // This is _not_ how you get your request parameters.
        //String paramNames[] = parameters.getNames();

        // text way
        //xmlText += "Number of parameters: " + paramNames.length + "\n";
        // SAX way
        contentHandler.characters(("Number of parameters: " +
paramNames.length + "\n").toCharArray(),0,("Number of parameters: " +
paramNames.length + "\n").length());
        
        //same thing:
        //xmlText += "Parameter names:\n";
        contentHandler.characters(("Parameter names:
\n").toCharArray(),0,("Parameter names: \n").length());
        
        //for(int i = 0; i < paramNames.length; i++)
        while (paramNames.hasMoreElements()) {
            //xmlText += paramNames[i] + "\n";
            String param = (String)paramNames.nextElement() + "\n";
            contentHandler.characters(param.toCharArray(),0,param.length());
        }
            
        //xmlText += "Source: " + source + "\n";
        contentHandler.characters(("Source: " + source +
"\n").toCharArray(),0,("Source: " + source + "\n").length());

        //xmlText += "</doc>";
        contentHandler.endElement("","doc", "doc");

        // no longer needed with SAX
        ////Create an InputSource from the hardcoded string
        //InputSource src = new InputSource(new StringReader(xmlText));

        // no longer needed with SAX
        ////Parse the XML input and generate SAX events to the consumer
        //xmlReader.parse(src);
    }
   
   public void setup(SourceResolver resolver, Map objectModel, String src,
Parameters par) {
      request = ObjectModelHelper.getRequest(objectModel);
      paramNames = request.getParameterNames();
  }
}

// END

Hope that helps.  Maybe I'll try to fix that up and submit it as a sample or
how-to or something for the docs.  If that doesn't compile, can someone let
me know?  I did this off the top of my head and probably missed something -
exceptions and imports most likely - and don't have time to test it out
right now.

Geoff Howard

> -----Original Message-----
> From: Istvan Beszteri [mailto:[EMAIL PROTECTED]]
> Sent: Wednesday, July 31, 2002 1:36 PM
> To: [EMAIL PROTECTED]
> Subject: own generator
> 
> 
> Hi All,
> 
> I'd like to write my own generator. I have written the 
> following generator 
> according to the documents on the Cocoon 2 site, by extending 
> an example.
> I can start the generator properly, but I can not pass any 
> parameter to it.
> Somehow I'd like to reach the HTTP request itself (requested 
> URI, headers 
> etc.) within the generator.
> 
> public class AnyName extends AbstractGenerator
> {
>     /**
>      * The only implemented method from AbstarctGenerator.
>      * It simply generates SAX events from a string.
>      */
> 
>     public void generate() throws IOException, SAXException, 
> ProcessingException
>     {
>       //This string will be feeded to the transformer 
> pipeline as sax events
>         String xmlText = "<doc>\nMy first Cocoon 2 generator\n";
> 
>       //This object will read and parse the XML content
>         XMLReader xmlReader = XMLReaderFactory.createXMLReader();
> 
>       //super.xmlConsumer will receive the SAX events
>         xmlReader.setContentHandler(super.xmlConsumer);
>         
>         String paramNames[] = parameters.getNames();
> 
>         xmlText += "Number of parameters: " + 
> paramNames.length + "\n";
> 
>       xmlText += "Parameter names:\n";
> 
>         for(int i = 0; i < paramNames.length; i++)
>             xmlText += paramNames[i] + "\n";
> 
>         xmlText += "Source: " + source + "\n";
> 
>       xmlText += "</doc>";
> 
>         //Create an InputSource from the hardcoded string
>         InputSource src = new InputSource(new StringReader(xmlText));
> 
>       //Parse the XML input and generate SAX events to the consumer
>         xmlReader.parse(src);
>     }
> }
> 
> I use the following pipeline. In the generated XML I could see the 
> parameters, and the source, but it seems that the source is 
> null, and no 
> parameters are passed to the generator.
> 
> <map:pipeline>
>     <map:match pattern="foo/*">
>       <map:act type="request">
>         <map:parameter name="parameters" value="true"/>
>         <map:generate type="ist" source="{1}"/>
>         <map:serialize type="xml"/>
>       </map:act>
>     </map:match>
> 
>     <map:handle-errors>
>       <map:transform src="stylesheets/system/error2html.xsl"/>
>       <map:serialize status-code="500"/>
>     </map:handle-errors>
>   </map:pipeline>
> 
> 
> How could I get the request data in the generator?
> 
> Thanks in advance!
> Br,
>   Istvan
> 
> ---------------------------------------------------------------------
> Please check that your question  has not already been answered in the
> FAQ before posting.     <http://xml.apache.org/cocoon/faq/index.html>
> 
> To unsubscribe, e-mail:     <[EMAIL PROTECTED]>
> For additional commands, e-mail:   <[EMAIL PROTECTED]>
> 

---------------------------------------------------------------------
Please check that your question  has not already been answered in the
FAQ before posting.     <http://xml.apache.org/cocoon/faq/index.html>

To unsubscribe, e-mail:     <[EMAIL PROTECTED]>
For additional commands, e-mail:   <[EMAIL PROTECTED]>

Reply via email to