Re: DO NOT REPLY [Bug 36534] - Context relative URLs returned by ServletContext.getResource() for the same path are not equal

2005-09-07 Thread Remy Maucherat

[EMAIL PROTECTED] wrote:

DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG·
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
http://issues.apache.org/bugzilla/show_bug.cgi?id=36534.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND·
INSERTED IN THE BUG DATABASE.

http://issues.apache.org/bugzilla/show_bug.cgi?id=36534


[EMAIL PROTECTED] changed:

   What|Removed |Added

 Status|RESOLVED|REOPENED
 Resolution|WONTFIX |




--- Additional Comments From [EMAIL PROTECTED]  2005-09-07 19:47 ---
Good point about toString(). I have a solution for that as well. Just override
org.apache.naming.resources.DirContextURLStreamHandler.toExternalForm() and have
it ignore the authority part of the URL, as follows (this is copied from
java.net.URLStreamHandler.toExternalForm(), with authority part ignored):

/**
 * Converts a codeURL/code of a specific protocol to a
 * codeString/code.
 *
 * @param   u   the URL.
 * @return  a string representation of the codeURL/code argument.
 */
protected String toExternalForm(URL u) {

// pre-compute length of StringBuffer
int len = u.getProtocol().length() + 1;
if (u.getPath() != null) {
len += u.getPath().length();
}
if (u.getQuery() != null) {
len += 1 + u.getQuery().length();
}
	if (u.getRef() != null) 
	len += 1 + u.getRef().length();


StringBuffer result = new StringBuffer(len);
result.append(u.getProtocol());
result.append(:);
if (u.getPath() != null) {
result.append(u.getPath());
}
if (u.getQuery() != null) {
result.append('?');
result.append(u.getQuery());
}
if (u.getRef() != null) {
result.append(#);
result.append(u.getRef());
}
return result.toString();
}

It is important that URLs returned by ServletContext.getResource() that are
equal have equals() return TRUE. This works for all other kinds of URLs.


I hadn't noticed you were the one who filed the bug. Besides skipping 
the result.append(:);, you should simply apply the fix, it's a very 
good solution.


Rémy

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



Re: DO NOT REPLY [Bug 36534] - Context relative URLs returned by ServletContext.getResource() for the same path are not equal

2005-09-07 Thread Jan Luehe


Remy Maucherat wrote:
 [EMAIL PROTECTED] wrote:
 
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG·
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
http://issues.apache.org/bugzilla/show_bug.cgi?id=36534.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND·
INSERTED IN THE BUG DATABASE.

http://issues.apache.org/bugzilla/show_bug.cgi?id=36534


[EMAIL PROTECTED] changed:

   What|Removed |Added

 Status|RESOLVED|REOPENED
 Resolution|WONTFIX |




--- Additional Comments From [EMAIL PROTECTED]  2005-09-07 19:47 ---
Good point about toString(). I have a solution for that as well. Just override
org.apache.naming.resources.DirContextURLStreamHandler.toExternalForm() and 
have
it ignore the authority part of the URL, as follows (this is copied from
java.net.URLStreamHandler.toExternalForm(), with authority part ignored):

/**
 * Converts a codeURL/code of a specific protocol to a
 * codeString/code.
 *
 * @param   u   the URL.
 * @return  a string representation of the codeURL/code argument.
 */
protected String toExternalForm(URL u) {

  // pre-compute length of StringBuffer
  int len = u.getProtocol().length() + 1;
  if (u.getPath() != null) {
  len += u.getPath().length();
  }
  if (u.getQuery() != null) {
  len += 1 + u.getQuery().length();
  }
  if (u.getRef() != null) 
  len += 1 + u.getRef().length();

  StringBuffer result = new StringBuffer(len);
  result.append(u.getProtocol());
result.append(:);
if (u.getPath() != null) {
result.append(u.getPath());
}
if (u.getQuery() != null) {
result.append('?');
result.append(u.getQuery());
}
  if (u.getRef() != null) {
  result.append(#);
result.append(u.getRef());
  }
  return result.toString();
}

It is important that URLs returned by ServletContext.getResource() that are
equal have equals() return TRUE. This works for all other kinds of URLs.
 
 
 I hadn't noticed you were the one who filed the bug. Besides skipping 
 the result.append(:); 

Not sure I understand: the : following the protocol is necessary,
so that the printable representation of the context generated URLs
starts with jndi:.

 you should simply apply the fix, it's a very 
 good solution.

I'm still having problems with CVS, which are preventing me from
committing my fix.

If you can commit this on my behalf, I'd appreciate it.
The complete fix consists of the above diff and the following patch
in org.apache.catalina.core.ApplicationContext:

 try {
 resources.lookup(path);
 return new URL
-(jndi, null, 0, getJNDIUri(hostName, fullPath),
- new DirContextURLStreamHandler(resources));
+(jndi, , 0, getJNDIUri(hostName, fullPath),
+ new DirContextURLStreamHandler(resources));
 } catch (Exception e) {
 // Ignore
 }

Thanks,

Jan



 Rémy
 
 -
 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]



Re: DO NOT REPLY [Bug 36534] - Context relative URLs returned by ServletContext.getResource() for the same path are not equal

2005-09-07 Thread Remy Maucherat

Jan Luehe wrote:


Remy Maucherat wrote:
I hadn't noticed you were the one who filed the bug. Besides skipping 
the result.append(:); 


Not sure I understand: the : following the protocol is necessary,
so that the printable representation of the context generated URLs
starts with jndi:.


Right, it's not related to the port number. Doh.

you should simply apply the fix, it's a very 
good solution.



I'm still having problems with CVS, which are preventing me from
committing my fix.

If you can commit this on my behalf, I'd appreciate it.
The complete fix consists of the above diff and the following patch
in org.apache.catalina.core.ApplicationContext:

 try {
 resources.lookup(path);
 return new URL
-(jndi, null, 0, getJNDIUri(hostName, fullPath),
- new DirContextURLStreamHandler(resources));
+(jndi, , 0, getJNDIUri(hostName, fullPath),
+ new DirContextURLStreamHandler(resources));
 } catch (Exception e) {
 // Ignore
 }


Ok.

Rémy

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