Hi, sorry for intruding this discussion..... just from what I can take from this discussion:
Wouldn't it be easier to enclose this into a generalized Environment implementation that does support Environment.getTopRequest() and is stored with ObjectModel in place of those different "REQUEST_OBJECT" instances - all different? That way you could also have some getCurrentRequest() or getNthRequest(int n) or any other operation that has to deal with request environments and knowledge about can be kept more local. Just my 0,02 EUR Rainer Vadim Gritsenko schrieb: > On Aug 22, 2008, at 8:57 AM, Thorsten Scherler wrote: > >> On Fri, 2008-08-22 at 08:18 -0400, Vadim Gritsenko wrote: >>> On Aug 22, 2008, at 3:35 AM, Thorsten Scherler wrote: >>> >>>> How about: >>>> } else { >>>> - Object lock = >>>> env.getObjectModel().get(HttpEnvironment.HTTP_REQUEST_OBJECT); >>>> + Object lock = >>>> env.getObjectModel().get(ObjectModelHelper.REQUEST_OBJECT); >>>> try { >>>> transientStore.store(lockKey, lock); >>>> } catch (IOException e) { >>>> >>>> This way we always lock the same object. >>> >>> Exactly this thing I was trying to explain - it will not work because >>> instead of using top level request you are suggesting to use current >>> sub-request. >> >> Sorry I am not really following. As understand you we cannot use >> ObjectModelHelper.REQUEST_OBJECT since we cannot be sure that is not a >> sub-request (a request for the exact same resource in a concurrent >> situation). > > Exactly. > > >> If the lock is null for a HttpEnvironment.HTTP_REQUEST_OBJECT then we >> are in CLI mode. > > (patch quoted above does not have lock == null comparison anymore, > that's why it is dangerous for HTTP env) > > >> In CLI ASAIK there is no concurrent situation meaning >> the problem cannot occur. However since the issue is talking about >> includes that may occur. > > Yes. You can still use IncludeTransformer in CLI. So deadlock can happen. > > >> Having a typical call from the cli gives for the env.getObjectModel(): >> >> HashMap values: >> [null, >> [EMAIL PROTECTED], >> link-collection=[], >> [EMAIL PROTECTED], >> null, null, null, null, >> [EMAIL PROTECTED], >> null, null, >> [EMAIL PROTECTED], >> [EMAIL PROTECTED], >> null, null, null] >> >> So which object you would suggest to lock? >> >> You wrote "Suitable alternative would be to lock against top most >> command line request." >> >> To what you are referring with "top most command line request"? > > That would be CommandLineRequest. Following HTTP environment analogy, > that would be CommandLineEnvironment.CLI_REQUEST_OBJECT. > > > Vadim > > >> salu2 >> >>> >>> Take a look at EnvironmentWrapper (which is used e.g. in SitemapSource): >>> >>> // create new object model and replace the request object >>> Map oldObjectModel = env.getObjectModel(); >>> if (oldObjectModel instanceof HashMap) { >>> this.objectModel = (Map)((HashMap)oldObjectModel).clone(); >>> } else { >>> this.objectModel = new HashMap(oldObjectModel.size()*2); >>> Iterator entries = oldObjectModel.entrySet().iterator(); >>> Map.Entry entry; >>> while (entries.hasNext()) { >>> entry = (Map.Entry)entries.next(); >>> this.objectModel.put(entry.getKey(), entry.getValue()); >>> } >>> } >>> this.request = new >>> RequestWrapper(ObjectModelHelper.getRequest(oldObjectModel), >>> requestURI, >>> queryString, >>> this, >>> rawMode); >>> this.objectModel.put(ObjectModelHelper.REQUEST_OBJECT, >>> this.request); >>> >>> >>> Vadim >> -- >> Thorsten Scherler thorsten.at.apache.org >> Open Source Java consulting, training and solutions >> >