[ 
https://issues.apache.org/jira/browse/COCOON-2044?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12489753
 ] 

Grzegorz Kossakowski commented on COCOON-2044:
----------------------------------------------

I'm not so sure how XSLT processor handles URIs inside stylesheets. While I was 
testing caching of ServletSource I remember that I've encountered XSLT 
processor's weirdnesses but did not dig into this any further. Could you find 
out (I mean: check the code) what are the current limitations of XSLT URI 
handling? This knowledge would be very useful not only while dealing with this 
very issue.

I ask for it, because I really don't like adding any additional parameter. Even 
more I don't like identityHashCode() hack ;)
What's more, I think you address the issue wrong way because your proposed 
change makes URI unique but only by including information about the entity 
asking for the resource what breaks another contract.
This way, if servlet A and B ask servlet C for *exactly* the same resource X we 
would end up with two different cache entries:
X?servlet-services-id=identityHashCode(A)
X?servlet-services-id=identityHashCode(A)
instead of one:
X?servlet-services-id=identityHashCode(C)

In ServletSource constructor there is ServletConnection available that in turn 
has the access for all needed properties. Even more, there is FIXME mark 
already related to this:
        // FIXME: This will not be a system global id, as the blockName is 
block local.
        String ssp = (new URI(this.blockName, null, path, queryString, 
null)).toString();

What do you think, now? Are you willing to provide a patch for this?

> servlet: protocol URIs have to be globally unique for use as cache-keys
> -----------------------------------------------------------------------
>
>                 Key: COCOON-2044
>                 URL: https://issues.apache.org/jira/browse/COCOON-2044
>             Project: Cocoon
>          Issue Type: Bug
>          Components: - Servlet service framework
>    Affects Versions: 2.2-dev (Current SVN)
>            Reporter: Alexander Klimetschek
>         Assigned To: Grzegorz Kossakowski
>            Priority: Critical
>
> All servlet protocol URIs like servlet:/some/thing or servlet:super:/foo/bar 
> or servlet:myblock:/another/path have to be globally unique because they are 
> used in the cache, of which there is only one global with globally acting 
> keys.
> There are two caches in standard Cocoon configuration (the only ones I know 
> of ;-), both with a different key generation. Here are ideas how to make the 
> keys global:
> a) EHDefaultStore for caching resources of caching pipelines: they use the 
> uriPrefix of the Enviroment in the key, so providing a uriPrefix (eg. the 
> mount path of the servlet) works here.
> b) DefaultTransientStore which caches XSLT and JX generator sources (don't 
> know why this is different from a)): they do not use the uriPrefix and much 
> worse, they need correct URIs because they are read by the XSLT processor, 
> who does not like things like servlet:uniqueID34:/xsl/stylesheet.xsl 
> containing arbitrary schemes at the beginning. Appending an ID via a query 
> parameter seems the only working solution (tried it already): 
> servlet:/xsl/stylesheet.xsl?servlet-services-id=12345
> Another solution would be to have one cache per sitemap, so that the keys 
> don't have to be unique anymore. But I don't know how to configure that and 
> if this is feasible.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to