[
https://issues.apache.org/jira/browse/COCOON-2044?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12489733
]
Alexander Klimetschek commented on COCOON-2044:
-----------------------------------------------
Unfortunately, using servlet:servlet org.apache.cocoon.foo:/some/file/path does
not work. The problem is that the XSLT processor uses the source.getURI()
String and tries to parse it himself. Thus, only a certain subset of URIs can
be used here (things known to him). I tried using servlet:12345:/some/file/path
and it failed.
The thing that works are my proposed query parameters:
servlet:/some/file/path?servlet-services-id=12345. I am using a number-based ID
because I use System.identityHashCode() on the current servlet context since
this is the only identifier that works.
String id =
String.valueOf(System.identityHashCode(CallFrameHelper.getContext()));
It is not possible to get the mount path or bean id of the servlet, because it
is not yet accessible in the ServletSource constructor (where the system id is
set). Important to know here is that in the case of the "outer" sitemap that
handles the browser request, the ServletContext is not a ServletServiceContext
(hmmm, when writing this I am not quite sure....). At least the
Request/Response objects are the original ones (only wrapped by
DynamicProxyRequestHandler); in a servlet internal call they are
BlockCallHttpServletRequest/Response.
> 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.