The 30 lines are already in an available JAR, only normalize() is currently private there:
http://cvs.apache.org/viewcvs.cgi/avalon-excalibur/sourceresolve/src/jav a/org/apache/excalibur/source/SourceUtil.java?rev=1.5&view=auto
Hmmm, interesting ... nowadays you can find an implementation under every turned stone, it seems ;-).
We might compare the different implementations, see which is better and keep only that.
Just to be picky, the one in Excalibur creates maybe too many temp String objects:
path = path.substring(0, i + 1) + path.substring(i + 3);
and scans the input too many times for my taste.
Anyway, all of this will become moot the day we decide not to support JDK 1.3 anymore.
Ugo