[ http://jira.codehaus.org/browse/DOXIASITETOOLS-9?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lukas Theussl closed DOXIASITETOOLS-9. -------------------------------------- Assignee: Lukas Theussl Resolution: Won't Fix This behavior is correct according to the rfc specs: http://www.ietf.org/rfc/rfc2396.txt (see eg the example given in App D). If you want the "1" to be interpreted as a hierarchical component (ie as a directory on a filesystem), you need to append a slash in the end: {code} PathDescriptor( new URL( http://projects.apt.fs.fujitsu.com/apt-core/com.fujitsu.fs.apt.maven.plugins/maven-apache-plugins/1/ ), "../../../com.fujitsu.fs.apt/apt-core/2/apt-core/images/banner-lhs.png" ) {code} which is a recommended practice for web URLs anyway, see eg http://www.standardzilla.com/2007/07/09/dont-forget-your-trailing-slash/ > PathDescriptor fails to create proper absolute paths from relative > components, as expected by > DefaultDecorationModelInheritanceAssembler.convertPaths > ----------------------------------------------------------------------------------------------------------------------------------------------------- > > Key: DOXIASITETOOLS-9 > URL: http://jira.codehaus.org/browse/DOXIASITETOOLS-9 > Project: Maven Doxia Site Tools > Issue Type: Bug > Affects Versions: 1.0-alpha-10 > Environment: 2.0.8 > Reporter: John Allen > Assignee: Lukas Theussl > > PathDescriptor is either incorrectly implemented for handling the building of > URLs from relativePaths. > A call to > {code} > PathDescriptor( new URL( > http://projects.apt.fs.fujitsu.com/apt-core/com.fujitsu.fs.apt.maven.plugins/maven-apache-plugins/1 > ), "../../../com.fujitsu.fs.apt/apt-core/2/apt-core/images/banner-lhs.png" ) > {code} > And you boil down to this call > {code} > private static final URL buildUrl( final URL baseUrl, final String path ) > throws MalformedURLException > { > if ( baseUrl == null ) > { > throw new MalformedURLException( "Base is null!" ); > } > if ( path == null ) > { > return baseUrl; > } > if ( baseUrl.getProtocol().equals( "file" ) ) > { > return new File( baseUrl.getFile(), path ).toURL(); > } > if ( path.startsWith( "/" ) && baseUrl.getPath().endsWith( "/" ) ) > { > return new URL( baseUrl, path.substring( 1 ) ); > } > return new URL( baseUrl, path ); > } > {code} > And critically the last line, namely: > {code} > return new URL( baseUrl, path ); > {code} > where baseUrl is the previously mentioned LHS and path is the RHS passed into > the constructor > Javadoc for this baby says (java.net.URL.URL(URL context, String spec)): > {quote} > Otherwise, the path is treated as a relative path and is appended to the > context path, as described in RFC2396. Also, in this case, the path is > canonicalized through the removal of directory changes made by occurences of > ".." and ".". > For a more detailed description of URL parsing, refer to RFC2396. > {quote} > Going to RFC 2396 and we find this in relation to "5.2. Resolving Relative > References to Absolute Form" > {quote} > 6) If this step is reached, then we are resolving a relative-path > reference. The relative path needs to be merged with the base > URI's path. Although there are many ways to do this, we will > describe a simple method using a separate string buffer. > a) All but the last segment of the base URI's path component is > copied to the buffer. In other words, any characters after the > last (right-most) slash character, if any, are excluded. > {quote} > So what happens? First of all the most right hand side path segment of the > context is removed. > That turns our LHS url from: > http://projects.apt.fs.fujitsu.com/apt-core/com.fujitsu.fs.apt.maven.plugins/maven-apache-plugins/1 > to: > http://projects.apt.fs.fujitsu.com/apt-core/com.fujitsu.fs.apt.maven.plugins/maven-apache-plugins > And now it says we cat on the spec, handling the '..' etc. > So we now do this: > http://projects.apt.fs.fujitsu.com/apt-core/com.fujitsu.fs.apt.maven.plugins/maven-apache-plugins > + ../../../com.fujitsu.fs.apt/apt-core/2/apt-core/images/banner-lhs.png > Which results in: > http://projects.apt.fs.fujitsu.com/com.fujitsu.fs.apt/apt-core/2/apt-core/images/banner-lhs.png > Which is *INVALID* as it does not exist > What this object was trying to do was create a new URL of the form: > http://projects.apt.fs.fujitsu.com/apt-core/com.fujitsu.fs.apt.maven.plugins/maven-apache-plugins/1 > + ../../../com.fujitsu.fs.apt/apt-core/2/apt-core/images/banner-lhs.png > i.e.: > http://projects.apt.fs.fujitsu.com/apt-core/com.fujitsu.fs.apt/apt-core/2/apt-core/images/banner-lhs.png > Which it can't as the first thing java.net.URL.URL(URL context, String spec) > does is strip the most right hand side segment from the context URL because > it expects it to be a resource, such as foo.jpg. > This bug was found during site creation, where we try and assemble the > descriptor using inherited site.xmls that have banners in them; the original > LHS input URL used in this description (or URL context if you prefer) comes > from the project.getURL() in AbstractSiteRenderingMojo.getDecorationModel > {code} > assembler.assembleModelInheritance( project.getName(), > decoration, parent, project.getUrl(), > parentProject.getUrl() == > null ? project.getUrl() : parentProject > .getUrl() > {code} > And I've not seen many projects use explicit URLs of the sort > http://projects.apt.fs.fujitsu.com/apt-core/com.fujitsu.fs.apt.maven.plugins/maven-apache-plugins/1/index.html > rather the convention seems to be use the path form, rather than the full > index URL. i.e.: > http://projects.apt.fs.fujitsu.com/apt-core/com.fujitsu.fs.apt.maven.plugins/maven-apache-plugins/1 > So you can not inherit things such as banners etc (there are tickets > outstanding for that) -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://jira.codehaus.org/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira