On 11/02/2013 13:27, gelo1234 wrote:
Ohh...ok that clarifies a problem a bit. So if the generator declaration inside sitemap.xmap does NOT have src=".." attribute i won't get this piece of code [1] executed:

if (this.source != null) {
             Object attributesObj = configuration.get("attributes");
             if (attributesObj != null && attributesObj instanceof Map) {
             ...
}

In case of the custom example given before:

<map:generate type="some-custom">
  ...
</map:generate>

it does NOT have src attribute (Not every generator got src attribute). So the question is still valid, how to get to those <map:parameter .../> values in such case ? Simply by adding useless src="" attribute to <map:generate ..> e.g.

<map:generate type="some-custom" src="http://www.w3c.org";> ?

or through the use of some Helper class? as it is in [2] (to Request Parameters instead of <map:parameter name="a" value="jexl:cocoon.request.a"/>) with HttpContextHelper - wonder if there is any equivalent Helper class for Cocoon Sitemap :)

Hi,
[2] injects HTTP request parameters as sitemap parameters: here's why the usage of HttpContextHelper.

Let's suppose you want to implement a generator able to deal with:

<map:generate type="mycustom">
  <map:parameter name="customParam" value="customValue"/>
</map:generate>

Then you need to

1. create class MyCustomGenerator extending AbstractSAXGenerator

2. implement setup() and setConfiguration() - an example implementation could be

    @Override
public void setConfiguration(final Map<String, ? extends Object> configuration) {
        this.setup((Map<String, Object>) configuration);
    }

    @Override
    public void setup(final Map<String, Object> parameters) {
        if (parameters == null) {
            return;
        }

// do something with parameters.get("customParam")
    }

3. add a file src/main/resources/META-INF/cocoon/spring/my-sitemap-components.xml with the following content:

<beans xmlns="http://www.springframework.org/schema/beans";
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd";>

<bean name="generator:mycustom" class="xx.yyy.MyCustomGenerator" scope="prototype"/>

</beans>

HTH

Regards.

[1] https://svn.apache.org/repos/asf/cocoon/cocoon3/trunk/cocoon-sax/src/main/java/org/apache/cocoon/sax/component/XSLTTransformer.java [2] https://svn.apache.org/repos/asf/cocoon/cocoon3/trunk/cocoon-servlet/src/main/java/org/apache/cocoon/servlet/component/RequestParametersGenerator.java

2013/2/11 Francesco Chicchiriccò <ilgro...@apache.org <mailto:ilgro...@apache.org>>

    On 11/02/2013 12:07, gelo1234 wrote:

        Question 1:
        Can we have some example of this one ?

        <map:generate type="some-custom">
           <map:parameter name="a" value="1"/>
           <map:parameter name="b" value="2"/>
        </map:generate>

        I mean, how to get sitemap parameter value from Java Generator
        code ?
        btw. Request Parameters are obtained by the use of
        HttpContextHelper, is this correct ?


    No: you can access map:parameter elements from within Java code in
    the same way how this is done in the XSLTTransformer [1]: consider
    that "source" is the only pre-defined parameter you have in any
    pipeline component, mapped to the 'src' XML attribute.


        Question 2:
        What is the best (optimal) way to include XML content
        generated from
        servlet/controller?

        <x:include .... src="servlet:/..."/>

        If the servlet is calling a REST controller there are 2
        invocations involved (one to gather data, the other one (with
        e.g. string-template) to actually serialize the data). Is
        there any way that REST controller could serialize the data
        itself ? without invoking another servlet/Page ?


    Not that I know: anyway I am using similar includes in different
    production environments with high load and I've experienced no
    troubles so far.


        Question 3:
        If the generator is included in some transformer phase (via
        x:include)
        does it still have access to original Request Parameters when
        invoked with:

        <x:include ... src="servlet:/generate?par1=a&par2=b/>

        or they are lost (original request params) and substituted by
        new ones (par1, par2 from the line above)?


    They are lost: you need to explicitly pass them though.

    Regards.

    [1]
    
https://svn.apache.org/repos/asf/cocoon/cocoon3/trunk/cocoon-sax/src/main/java/org/apache/cocoon/sax/component/XSLTTransformer.java

--
Francesco Chicchiriccò

ASF Member, Apache Syncope PMC chair, Apache Cocoon PMC Member
http://people.apache.org/~ilgrosso/

Reply via email to