Hi,

Is it possible in Cocoon 2.01 to set session attribute within
aggregation so that the change would be in a first part (xsp) and next
part could use the new value of the changed attribute. It seems that the
new value is not available for the rest parts of aggregation within the
same request.
If it is true, then how is it possible to make a branch comparing a
request parameter's value with some session attribute's value?
In particular, I'd like to store some parameter as a session attribute
and if it is not changed then read query results stored as DOM in a
session before, otherwise update query results. My xsp part of
aggregation is the following:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsp:page
   language="java"
   xmlns:xsp="http://apache.org/xsp";
   xmlns:xsp-request="http://apache.org/xsp/request/2.0";
   xmlns:session="http://apache.org/xsp/session/2.0";
   xmlns:util="http://apache.org/xsp/util/2.0";
   create-session="true">
 <page>
   <xsp:logic>
     String idList = (String)<xsp-request:get-parameter name="idList"
default=""/>;
     String idListOld = (String)<session:get-attribute name="idList"
default=""/>;
     String isChanged = (idList.equals(idListOld))?"no":"yes";
   </xsp:logic>
   <session:set-attribute
name="idList"><xsp:logic><xsp:expr>idList</xsp:expr></xsp:logic></session:set-attribute>

   <session:set-attribute
name="isChanged"><xsp:logic><xsp:expr>isChanged</xsp:expr></xsp:logic></session:set-attribute>


<idList><xsp:logic><util:expr><xsp:expr>idList</xsp:expr></util:expr></xsp:logic></idList>


<isChanged><xsp:logic><util:expr><xsp:expr>isChanged</xsp:expr></util:expr></xsp:logic></isChanged>

   </page>
</xsp:page>

The second part of aggregation calls the following via cocoon://
protocol:

<map:match pattern="read_filtered_results">
  <map:match type="sessionstate" pattern="yes">
      <map:parameter name="attribute-name" value="isChanged"/>
      <!-- Update filtered result -->
      <map:generate src="cocoon://read_query_results"/>
      <map:serialize type="xml"/>
  </map:match>
  <!-- if idList is not changed try to read stored filtered result -->
  <map:match type="sessionstate" pattern="**">
      <map:parameter name="attribute-name" value="filtered_results"/>
      <!-- Read filtered result if it was already stored -->
      <map:generate src="data/null.xml"/>
      <map:transform type="readDOMsession">
          <map:parameter name="dom-name" value="filtered_results"/>
          <map:parameter name="trigger-element" value="null"/>
          <map:parameter name="position" value="in"/>
      </map:transform>
      <map:serialize type="xml"/>
  </map:match>
  <!-- Create filtered result if it was not stored before -->
  <map:generate src="cocoon://read_query_results"/>
  <map:serialize type="xml"/>
</map:match>

So the problem is that after changing idList parameter I have to call
the aggregating pipeline twice (i.e. to make two requests from browser
with the same idList parameter) to get an updated query result.

Thank you very much for any advice.
    Roman


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