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

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

The problem is caused by 
org.apache.cocoon.servletservice.components.ServletSource (extending 
org.apache.excalibur.source.impl.AbstractSource). It just breaks contracts so 
other elements (like caching) that rely on the contract fail. Let's look at 
AbstractSource#getURI():
    /**
     * Return the unique identifer for this source
     */
    public String getURI()
    {
        return m_systemId;
    }

Unique word is essential here but ServletSource have *relative* to servlet's 
context system Id now. The situation is exactly the same as File source would 
return relative paths instead of absolute ones.

So how to absolutize servlet protocol's URIs? We should just replace connection 
name (which may be empty) with servlet's bean id that the URI is actually 
resolved to. So if servlet org.apache.cocoon.foo has servlet 
org.apache.cocoon.bar as super these URIs should be made absolute that way:
servlet:/some/file/path -> servlet:servlet org.apache.cocoon.foo:/some/file/path
servlet:super:/other/path -> servlet:servlet org.apache.cocoon.bar:/other/path

This way ServletSource will fulfill the contract. What do you think?

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