Hi Mark,

Mark Thomas wrote On 11/24/05 11:34,:
> All,
> 
> I have been looking at bug 13040 and reviewing the current 
> getContext() implementation. I saw Remy's comment from some time ago 
> when fixing some related bugs 
> (http://marc.theaimsgroup.com/?l=tomcat-dev&m=106008981803343&w=2) 
> that this would be better if the spec mandated that the parameter 
> passed to getContext() must be an exact match for a context path.
> 
> Having read the 2.4 spec several times I am pretty sure that is does 
> say this, albeit not as directly as it might. I assume (perhaps 
> wrongly) that any changes in this area will generate a lot of debate 
> so I wanted to do the debate and then change the code.
> 
> The key parts of the spec are:
> SRV.14.2.8 ServletContext
> <snip>
> public ServletContext getContext(java.lang.String uripath)
> <snip>
> uripath - a String specifying the context path of another web 
> application in the container.
> <snip>
> 
> My interpretation is:
> SRV.14.2.8 says the parameter is a context path
> SRV.4.4 is very clear about what is context path is
> 
> Therefore, getContext() must look for an exact match of uripath 
> against the context paths for the currently deployed web-apps.
> 
> My proposal, therefore is to change the getContext() implementation to 
> look for an exact match. This is stricter than the current 
> implementation (and may cause problems for some users) but will fix a 
> number of odd behaviours including the one described in bug 13040.
> 
> In the unlikely event that no-one disagrees with my interpretation, 
> I'll commit a fix over the weekend to TC4 and TC5. (The 2.3 spec has 
> the exact same wording.)


I agree the current javadocs of ServletContext.getContext() are
ambiguous, and I agree we need to present this case to the
Servlet EG. Maybe there is a small chance to have this resolved
in the Servlet 2.5 timeframe ...

I think it would be more useful to have the "uripath" argument be
interpreted as a full URI rather than a context root, and have
ServletContext.getContext() determine the longest match of the given
"uripath" with the context roots of any deployed contexts.

Applied to the scenario described at:

  http://marc.theaimsgroup.com/?l=tomcat-dev&m=108109687130165&w=2

which assumes the following configured contexts:

  A: /
  B: /foo/
  C: /foo/bar/

the above interpretation would give the following consistent results:

  Context uripath         result
  ------------------------------
  A       "/"             A
  A       "/foo/"         B
  A       "/foo/bar/"     C
  A       "/foo/bar/xxx/" C

  B       "/"             A
  B       "/foo/"         B
  B       "/foo/bar/"     C
  B       "/foo/bar/xxx/" C

  C       "/"             A
  C       "/foo/"         B
  C       "/foo/bar/"     C
  C       "/foo/bar/xxx/" C

I agree the current behaviour, which "hides" any foreign contexts
whose context roots match a subdir of the current context, is broken
(in part because of the spec ambiguity), because it returns different
results depending on the context from which the getContext() call is
made.

I don't see why we need to restrict "uripath" to be a context root in
order to fix the current behaviour, though. As I said, returning
the context whose context root has the longest match with the given
"uripath" may make more sense.

Would you agree?


Jan

> 
> Mark
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to