I just wrote a pipeline that fixes my other problem [1] (by selecting between two different pipelines based on the actual running mode) and included this fix for the caching key which works fine. I have to pass through each of the ProcessingPipeline methods anyway and in each call that has the Environment as parameter I change the uri prefix set in it:

private void fixEnvironmentForCachingPrefix(Environment env) {
    if (this.fixMissingCachingPrefixWithBlockServlets &&
        (env.getURIPrefix() == null || env.getURIPrefix().equals(""))) {

        ServletContext context =
            BlockCallStack.getCurrentBlockContext();

        if (context instanceof BlockContext) {
            // use the mount path of the block as the prefix
            String mountPath =
                ((BlockContext) context).getMountPath() + "/";
            env.setURI(mountPath, env.getURI());
        }
    }
}

The trick is using the static method BlockCallStack.getCurrentBlockContext() and using the mount path as a unique and short URI prefix, which is then used by the caching pipeline implemenations. You are free to consider it as a dirty hack ;-)

Alex

[1] http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=116957460020578&w=2

Vadim Gritsenko schrieb:
Daniel Fagerstrom wrote:
Alexander Klimetschek skrev:
Hi,

when using multiple block-servlets in one cocoon application (2.2), they will all use the same EHDefaultStore as cache. If there are similar matchers in the sitemaps, eg. images/header.png, the key for the cached resource will be the same for both blocks (just images/header.png), and, as the cache is global, the same cached object will be returned for both requests. This happens with expires-caching.

This should be fixed by adding a unique key prefix for each block-servlet or by one cache per block-servlet, but I do not know how to configure this.

The Spring bean name for the block-servlet would work fine as an unique bean prefix.

Prefix from parent sitemap used to be part of the key, IIRC. Works even better.

And it is available from ServletConfig.getServletName() in the block-servlet. The next and more complicated question is how to get the identifier to the caching key ...

.... or how to fix the regression.

Vadim



--
Alexander Klimetschek
http://www.mindquarry.com

Reply via email to