Pier Fumagalli wrote:

On 27 Sep 2004, at 19:15, Vadim Gritsenko wrote:

Don' wonder; properties were missing.

Cheeridos!

:)


Now, an annotated dump on the source tells me that you added the following FIXME comment:

36336 unico public Serializable getKey() {
47017 vgritsenko // FIXME: In case of including "cocoon://" or other dynamic sources
47017 vgritsenko // key has to be dynamic.
47017 vgritsenko return "I";
36336 unico }


Care to explain the problem? I need to have this working (somehow) and have some time on my hands to spare and dedicate to the cause of caching! :-P

Sure. Problem is the following. Consider you have a pipeline 'internal' which generates different responses depending on the value of request parameter 'a':


  <map:match pattern="internal">
    <map:generate src="{request-param:a}.xml"/>
    <map:serialize type="xml"/>
  </map:match>

Example request and responses:

  Requesting /internal?a=one gives:
    <one/>

  Requesting /internal?a=two gives:
    <two/>


Now, let's aggregate this pipeline into another pipeline, 'external', using Include transformer and input document like this:
<doc>
<i:include src="cocoon://internal"/>
</doc>


Requesting 'external' pipeline *should* give following result:

  Requesting /external?a=one should give:
    <doc>
     <one/>
    </doc>

  Requesting /external?a=two should give:
    <doc>
     <two/>
    </doc>


But, this does not happen. Response on the first request to the 'external' pipeline will get cached, and all following requests will get same cached response *regardless* of request parameter. This happens because pipeline keys for "/external?a=one" and "/external?a=two" do not differ, they are the same:


  PK_G-file-doc.xml_T-I_S-xml

(that's how pipeline key would look like if 'external' consists of file generator / include transformer / xml serializer). This problem can be solved by adding keys of included sources to the pipeline key - same way as validity is assembled. In this example, key of the 'internal' SitemapSource will be added, which is composed out of source's system ID (cocoon://internal), and hash of the pipeline key (which is different for /internal?a=one and /internal?a=two because it contains name of the file to generate response from - one.xml or two.xml). Resulting key then will be something like:

  PK_G-file-doc.xml_T-I-cocoon://internal?pipelinehash=1234567890_S-xml


Vadim



Reply via email to