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

Alexander Klimetschek commented on COCOON-2044:
-----------------------------------------------

The servlet source works in other places used in XSL sheets, so it is 
registered. I think the problem is that the ids/mount-paths I tried are not 
valid, only ids of configured connections work. I say think because I cannot 
debug the xerces code, because the damn jar does not contain line numbers.... 
So my theory is:

a) Xerces handles the URL
b) it sees servlet: and passes it to cocoon's sourceresolver (don't know where 
this is done)
c) the servlet source cannot resolve servlet:12345:/bla or 
servlet:/my/mountpath:/something and throws an exception or returns a null value
d) the URL handler sees this problem, but only gives a MalformedURLException 
(unknown protocol: servlet)

If this is the case, we need a globally unique servlet:servlet-bean-id:/foo/bar 
URL that can be resolved by the ServletSourceFactory. Currently it can only 
handle connections defined in the servlet bean xml. IMHO these are shortcuts 
(using servlet:myblock: is much shorter than 
serlvet:com.mycompany.mypackage.foobar-servlet). But they also work as a 
contract for the block or servlet, showing which other blocks are needed at 
runtime, although this is not used by any tool, its only an information for the 
developer looking at the xml file.

> 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