[
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