Here's a sitemap example (for cocoon-2.0) using writeDOMsession /
readDOMsession (as suggested in the docs) to avoid repetitive queries of
reference tables. It works fine, but I haven't done any benchmarking to find
out if it was worth the trouble (and it was quite a bit of trouble)!

Questions:

1. Is there some way this global data could be saved globally rather than
per session?
I guess a new set of global data matchers, selectors and read/writeDOMGlobal
would be required
(more trouble that its worth to me).

2. Has anybody found this approach to be worthwhile or otherwise?

3. Has anybody got a better way of doing it?

Cheers,
        Neil.


                        <!--
                        Get reference table data.
                        e.g. Lookup.Staff returns data from the Staff table (query 
defined in
Staff.xml file)
                        TO DO: make this a 'resource' so its not available externally.

                        If session attribute org.apache.cocoon.SessionState does not 
contain the
string ",Staff,"
                        then this string is appended to the attribute, the query is 
executed and
the result is saved
                        to the session attribute pinnacle.Staff.
                        Otherwise the query is not executed and result is fetched from 
the
session attribute pinnacle.Staff.

                        SessionState is used because I can match its value against 
various string
values, but I don't know how to
                        test for the existence of a non-string valued session 
attribute like
pinnacle.Staff.
                        -->
                        <map:match pattern="Lookup.*">
                                <!-- If session attribute 
org.apache.cocoon.SessionState does contain
the string ",Staff," -->
                                <map:match type="sessionState" pattern="*,{1},*">
                                        <!-- for debugging - In browser's URL field 
you see
"LookupStaff.wasNotSetIsNow" -->
                                        <!-- <map:redirect-to 
uri="Lookup{../1}.wasAlreadySet"/> -->
                                        <map:generate type="file" src="BlankPage.xml"/>
                                        <!-- only contains a <page/> -->
                                        <!--
                                        Append content from session attribute 
pinnacle.Staff after <page/>
element.
                                        We end up with: <page/><page>... stuff we 
want...</page>.
                                        -->
                                        <map:transform type="readDOMsession">
                                                <map:parameter name="dom-name" 
value="pinnacle.{../1}"/>
                                                <map:parameter name="trigger-element" 
value="page"/>
                                                <map:parameter name="position" 
value="in"/>
                                        </map:transform>
                                        <map:serialize type="xml"/>
                                </map:match>
                                <!-- Else session attribute 
org.apache.cocoon.SessionState does not
contain the string ",Staff," -->
                                <map:match type="sessionState" pattern="**">
                                        <map:act type="sessionState">
                                                <map:parameter name="new-state" 
value="{1},{../1},"/>
                                                <!-- append ",Staff," -->
                                                <!-- for debugging - In browser's URL 
field you see
"LookupStaff.wasNotSetIsNow" -->
                                                <!-- <map:redirect-to 
uri="Lookup{../../1}.wasNotSetIsNow"/> -->
                                                <!-- execute query defined in 
Staff.xml. -->
                                                <map:generate type="file" 
src="{../../1}.xml"/>
                                                <map:transform type="sql">
                                                        <map:parameter 
name="use-connection" value="poracle"/>
                                                </map:transform>
                                                <!--
                                                Shouldn't really need an XSLT 
transform here, but without it I get
                                                org.xml.sax.SAXException: URI not 
declared
                                                at
org.apache.cocoon.transformation.WriteDOMSessionTransformer.startElement()
                                                in 
cocoon\WEB-INF\logs\cocoon.log.000001
                                                Some problem with the sql: namespace 
not being declared.
                                                -->
                                                <map:transform type="xslt" 
src="LookupTables.xsl"/>
                                                <!-- save <page> element (and its 
descendents) to session attribute
pinnacle.Staff -->
                                                <map:transform type="writeDOMsession">
                                                        <map:parameter name="dom-name" 
value="pinnacle.{../../1}"/>
                                                        <map:parameter 
name="dom-root-element" value="page"/>
                                                </map:transform>
                                                <map:serialize type="xml"/>
                                        </map:act>
                                </map:match>
                                <map:redirect-to 
uri="Lookup{1}.noMatchOnSessionState"/>
                        </map:match>

                        <!--
                        Test Lookup.*
                        Initialises the session to allow testing from the 
URLReader.java test
programme.
                        -->
                        <map:match pattern="TestLookup.*">
                                <!-- start a session -->
                                <map:redirect-to session="true" uri="TestLookup2.{1}"/>
                        </map:match>

                        <map:match pattern="TestLookup2.*">
                                <!-- init session attribute that holds current state 
-->
                                <map:act type="sessionState">
                                        <map:parameter name="new-state" value="init"/>
                                        <!-- do the lookup -->
                                        <map:redirect-to session="true" 
uri="Lookup.{../1}"/>
                                </map:act>
                        </map:match>


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

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

Reply via email to