cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Francesco Chicchiriccò <ilgro...@apache.org>
Subject Re: BlockContextURLConnection is not context safe
Date Wed, 19 Sep 2012 07:14:54 GMT
On 18/09/2012 23:57, Thorsten Scherler wrote:
> Hi all,
>
> I am working on COCOON3-105 whenever I find a sec, but I am thinking 
> about the underlying problem for a while now.

Hi Thorsten,
I don't know how much useful can be my contribution in this field, 
anyway here are my 2 cents.

> To resume, the blockcontext:/ is being registered as an extension to 
> java.net.URLConnection. In case of a not-known protocol we will create 
> the StreamHandler (who is responsible to open the urlConnection) once 
> - for the whole container!

Ok, this is clear: purpose of URLStreamHandlerFactory is to register the 
handler for all URLs across the JVM, hence the "whole container" as you say.

> This happens in the BlockContextURLStreamHandlerFactory in the method 
> createURLStreamHandler(String protocol). Like said: only once (!) we 
> call this method even if we have two different servlets using 
> different blockcontext. This finally leads to that the 
> BlockContextURLConnection only knows the blockcontext of the first 
> requested blockcontext and ignores any others.
>
> Some possible solution I see:
> - move the resolving of the blockcontext into the 
> BlockContextURLConnection. I tried that in the patch I attached to the 
> issue but the problem is that the second request has no ServletContext 
> associated to it so we cannot get the blocks. -> since we cannot 
> resolve here the blockcontext this solution does not work

Indeed, I think this is the route to follow, i.e. move the blockContexts 
Map in a place bound to app scope, not to JVM scope (like as 
BlockContextURLStreamHandlerFactory).

What if you get to the servletContext not via

ServletContext servletContext = CallStackHelper.getCurrentServletContext();

but instead, using an approach like as [1]:

         WebApplicationContext webApplicationContext = 
(WebApplicationContext) AppContext.getApplicationContext();
         ServletContext servletContext = 
webApplicationContext.getServletContext();
         this.blockContexts = (Map<String, String>) servletContext
.getAttribute(BlockDeploymentServletContextListener.BLOCK_CONTEXT_MAP);

i.e. closer to the current implementation inside 
BlockContextURLStreamHandlerFactory?

As soon as I have enough spare time for this, I'll try to play anyway 
with this issue.

> - use a global blockcontext map. A reference to a global blockcontext 
> map will be kept and this map needs to be merged when a new app is 
> deployed (if needed). However that leads to many open issue like 
> security, version, etc.

I don't see this as viable option anyway.

> Further how do you undeploy the protocol since undeploying the 
> underlying servlet would need to undeploy only a part of the 
> blockcontext protocol.
>
> I am not sure how to overcome above obstacles and would love any 
> thoughts from the community.

Regards.

[1] 
http://blog.jdevelop.eu/2008/07/06/access-the-spring-applicationcontext-from-everywhere-in-your-application/

-- 
Francesco Chicchiriccò

ASF Member, Apache Cocoon PMC and Apache Syncope PPMC Member
http://people.apache.org/~ilgrosso/


Mime
View raw message