[DOXIASITETOOLS-183] add relative path to build root
diff --git a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java
index 9a17e3c..f7abb91 100644
--- a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java
+++ b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java
@@ -189,7 +189,8 @@
 
                     String excludes = ( moduleExcludes == null ) ? null : moduleExcludes.get( module.getParserId() );
 
-                    addModuleFiles( moduleBasedir, module, excludes, files, editable );
+                    addModuleFiles( siteRenderingContext.getRootDirectory(), moduleBasedir, module, excludes, files,
+                                    editable );
                 }
             }
         }
@@ -203,7 +204,8 @@
 
                 String excludes = ( moduleExcludes == null ) ? null : moduleExcludes.get( module.getParserId() );
 
-                addModuleFiles( module.getBasedir(), parserModule, excludes, files, editable );
+                addModuleFiles( siteRenderingContext.getRootDirectory(), module.getBasedir(), parserModule, excludes,
+                                files, editable );
             }
             catch ( ParserModuleNotFoundException e )
             {
@@ -229,7 +231,7 @@
         return filtered;
     }
 
-    private void addModuleFiles( File moduleBasedir, ParserModule module, String excludes,
+    private void addModuleFiles( File rootDir, File moduleBasedir, ParserModule module, String excludes,
                                  Map<String, DocumentRenderer> files, boolean editable )
             throws IOException, RendererException
     {
@@ -238,6 +240,9 @@
             return;
         }
 
+        String moduleRelativePath =
+            PathTool.getRelativeFilePath( rootDir.getAbsolutePath(), moduleBasedir.getAbsolutePath() );
+
         List<String> allFiles = FileUtils.getFileNames( moduleBasedir, "**/*.*", excludes, false );
 
         for ( String extension : module.getExtensions() )
@@ -253,8 +258,8 @@
 
             for ( String doc : docs )
             {
-                RenderingContext context =
-                        new RenderingContext( moduleBasedir, doc, module.getParserId(), extension, editable );
+                RenderingContext context = new RenderingContext( moduleBasedir, moduleRelativePath, doc,
+                                                                 module.getParserId(), extension, editable );
 
                 // TODO: DOXIA-111: we need a general filter here that knows how to alter the context
                 if ( endsWithIgnoreCase( doc, ".vm" ) )
diff --git a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/RenderingContext.java b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/RenderingContext.java
index 44831e9..b05c0c6 100644
--- a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/RenderingContext.java
+++ b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/RenderingContext.java
@@ -37,6 +37,8 @@
 {
     private final File basedir;
 
+    private final String basedirRelativePath;
+
     private final String inputName;
 
     private final String outputName;
@@ -56,7 +58,7 @@
     @Deprecated
     public RenderingContext( File basedir, String document )
     {
-        this( basedir, document, null, null, false, null );
+        this( basedir, null, document, null, null, false, null );
     }
 
     /**
@@ -72,18 +74,19 @@
      */
     public RenderingContext( File basedir, String document, String generator )
     {
-        this( basedir, document, null, null, false, generator );
+        this( basedir, null, document, null, null, false, generator );
     }
 
     @Deprecated
     public RenderingContext( File basedir, String document, String parserId, String extension )
     {
-        this( basedir, document, parserId, extension, false, null );
+        this( basedir, null, document, parserId, extension, false, null );
     }
 
-    public RenderingContext( File basedir, String document, String parserId, String extension, boolean editable )
+    public RenderingContext( File basedir, String basedirRelativePath, String document, String parserId,
+                             String extension, boolean editable )
     {
-        this( basedir, document, parserId, extension, editable, null );
+        this( basedir, basedirRelativePath, document, parserId, extension, editable, null );
     }
 
     /**
@@ -92,6 +95,7 @@
      * </p>
      *
      * @param basedir the source base directory (not null, pseudo value when not a Doxia source).
+     * @param basedirRelativePath the relative path from root (null if not Doxia source)
      * @param document the source document name.
      * @param parserId the Doxia module parser id associated to this document, may be null if document not rendered from
      *            a Doxia source.
@@ -101,10 +105,11 @@
      * @param generator the generator (in general a reporting goal: <code>groupId:artifactId:version:goal</code>)
      * @since 1.8
      */
-    public RenderingContext( File basedir, String document, String parserId, String extension, boolean editable,
-                             String generator )
+    public RenderingContext( File basedir, String basedirRelativePath, String document, String parserId,
+                             String extension, boolean editable, String generator )
     {
         this.basedir = basedir;
+        this.basedirRelativePath = basedirRelativePath;
         this.inputName = document;
         this.parserId = parserId;
         this.extension = extension;
@@ -223,7 +228,9 @@
 
     /**
      * Is the source document editable?
+     *
      * @return <code>true</code> if comes from an editable Doxia source (not generated one).
+     * @since 1.8
      */
     public boolean isEditable()
     {
@@ -231,11 +238,46 @@
     }
 
     /**
+     * Is the document rendered from a Doxia source?
+     *
+     * @return <code>true</code> if comes from a Doxia source.
+     * @since 1.8
+     */
+    public boolean isDoxiaSource()
+    {
+        return StringUtils.isNotEmpty( extension );
+    }
+
+    /**
      * What is the generator (if any)?
+     *
      * @return <code>null</code> if no known generator
+     * @since 1.8
      */
     public String getGenerator()
     {
         return generator;
     }
+
+    /**
+     * Get the relative path of basedir (when a Doxia source)
+     *
+     * @return the relative path of basedir when a Doxia source, or <code>null</code> if not a Doxia source
+     * @since 1.8
+     */
+    public String getBasedirRelativePath()
+    {
+        return basedirRelativePath;
+    }
+
+    /**
+     * Get the relative path to Doxia source from build root.
+     *
+     * @return the relative path to Doxia source from build root, or <code>null</code> if not a Doxia source
+     * @since 1.8
+     */
+    public String getDoxiaSourcePath()
+    {
+        return isDoxiaSource() ? ( basedirRelativePath + '/' + inputName ) : null;
+    }
 }
diff --git a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java
index 552eb12..994e2a1 100644
--- a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java
+++ b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java
@@ -64,6 +64,8 @@
 
     private boolean usingDefaultTemplate;
 
+    private File rootDirectory;
+
     private List<File> siteDirectories = new ArrayList<File>();
 
     private Map<String, String> moduleExcludes;
@@ -427,6 +429,7 @@
      * Directory where to save content after Velocity processing (<code>*.vm</code>), but before parsing it with Doxia.
      * 
      * @return not null if the documents are to be saved
+     * @since 1.7
      */
     public File getProcessedContentOutput()
     {
@@ -438,9 +441,33 @@
      * Doxia?
      * 
      * @param processedContentOutput not null if the documents are to be saved
+     * @since 1.7
      */
     public void setProcessedContentOutput( File processedContentOutput )
     {
         this.processedContentOutput = processedContentOutput;
     }
+
+    /**
+     * Root directory, to calculate relative path to every site directories.
+     * Corresponds to the <code>pom.xml</code> directory for Maven build.
+     *
+     * @return the root directory
+     * @since 1.8
+     */
+    public File getRootDirectory()
+    {
+        return rootDirectory;
+    }
+
+    /**
+     * Set the root directory.
+     *
+     * @param rootDirectory
+     * @since 1.8
+     */
+    public void setRootDirectory( File rootDirectory )
+    {
+        this.rootDirectory = rootDirectory;
+    }
 }
diff --git a/doxia-site-renderer/src/main/resources/org/apache/maven/doxia/siterenderer/resources/default-site.vm b/doxia-site-renderer/src/main/resources/org/apache/maven/doxia/siterenderer/resources/default-site.vm
index eb2814e..77fd795 100644
--- a/doxia-site-renderer/src/main/resources/org/apache/maven/doxia/siterenderer/resources/default-site.vm
+++ b/doxia-site-renderer/src/main/resources/org/apache/maven/doxia/siterenderer/resources/default-site.vm
@@ -18,9 +18,9 @@
 ##
 #parse( "default-site-macros.vm" )
 <!-- Generated by Apache Maven Doxia Site Renderer#if( $doxiaSiteRendererVersion ) $doxiaSiteRendererVersion#end##
-#if( $docRenderingContext.generator || $docRenderingContext.extension ) from##
+#if( $docRenderingContext.generator || $docRenderingContext.doxiaSource ) from##
 #if( $docRenderingContext.generator ) $docRenderingContext.generator#end##
-#if( $docRenderingContext.extension ) $docRenderingContext.basedir.name/$docRenderingContext.inputName#end##
+#if( $docRenderingContext.doxiaSource ) $docRenderingContext.doxiaSourcePath#end##
 #end
  at $dateFormat.format( $currentDate ) -->
 <html xmlns="http://www.w3.org/1999/xhtml"#if ( $locale ) xml:lang="$locale.language" lang="$locale.language"#end>
diff --git a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java
index ffcb3fb..4032b5d 100644
--- a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java
+++ b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java
@@ -162,10 +162,12 @@
             .read( new FileReader( getTestFile( "src/test/resources/site/site.xml" ) ) );
 
         SiteRenderingContext ctxt = getSiteRenderingContext( decoration, "src/test/resources/site", false );
-        renderer.render( renderer.locateDocumentFiles( ctxt ).values(), ctxt, getTestFile( OUTPUT ) );
+        ctxt.setRootDirectory( getTestFile( "" ) );
+        renderer.render( renderer.locateDocumentFiles( ctxt, true ).values(), ctxt, getTestFile( OUTPUT ) );
 
         ctxt = getSiteRenderingContext( decoration, "src/test/resources/site-validate", true );
-        renderer.render( renderer.locateDocumentFiles( ctxt ).values(), ctxt, getTestFile( OUTPUT ) );
+        ctxt.setRootDirectory( getTestFile( "" ) );
+        renderer.render( renderer.locateDocumentFiles( ctxt, true ).values(), ctxt, getTestFile( OUTPUT ) );
 
         // ----------------------------------------------------------------------
         // Verify specific pages
@@ -197,7 +199,8 @@
         DocumentRenderer docRenderer = mock( DocumentRenderer.class );
         when( docRenderer.isExternalReport() ).thenReturn( true );
         when( docRenderer.getOutputName() ).thenReturn( "external/index" );
-        when( docRenderer.getRenderingContext() ).thenReturn( new RenderingContext( new File( "" ), "index.html" )  );
+        when( docRenderer.getRenderingContext() ).thenReturn( new RenderingContext( new File( "" ), "index.html",
+                                                                                    "generator:external" ) );
 
         SiteRenderingContext context = new SiteRenderingContext();
 
@@ -225,9 +228,9 @@
         siteRenderingContext.setTemplateProperties( attributes );
 
         siteRenderingContext.setTemplateName( "org/apache/maven/doxia/siterenderer/velocity-toolmanager.vm" );
-        RenderingContext context = new RenderingContext( new File( "" ), "document.html" );
+        RenderingContext context = new RenderingContext( new File( "" ), "document.html", "generator" );
         SiteRendererSink sink = new SiteRendererSink( context );
-        renderer.generateDocument( writer, sink, siteRenderingContext );
+        renderer.mergeDocumentIntoSite( writer, sink, siteRenderingContext );
 
         String renderResult = writer.toString();
         String expectedResult = IOUtils.toString( getClass().getResourceAsStream( "velocity-toolmanager.expected.txt" ) );
@@ -253,9 +256,9 @@
         SiteRenderingContext siteRenderingContext =
             renderer.createContextForTemplate( templateFile, attributes, new DecorationModel(),
                                                "defaultWindowTitle", Locale.ENGLISH );
-        RenderingContext context = new RenderingContext( new File( "" ), "document.html" );
+        RenderingContext context = new RenderingContext( new File( "" ), "document.html", "generator" );
         SiteRendererSink sink = new SiteRendererSink( context );
-        renderer.generateDocument( writer, sink, siteRenderingContext );
+        renderer.mergeDocumentIntoSite( writer, sink, siteRenderingContext );
 
         String renderResult = writer.toString();
         String expectedResult = IOUtils.toString( getClass().getResourceAsStream( "velocity-toolmanager.expected.txt" ) );
@@ -283,9 +286,9 @@
         SiteRenderingContext siteRenderingContext =
             renderer.createContextForSkin( skin, attributes, new DecorationModel(), "defaultWindowTitle",
                                            Locale.ENGLISH );
-        RenderingContext context = new RenderingContext( new File( "" ), "document.html" );
+        RenderingContext context = new RenderingContext( new File( "" ), "document.html", "generator" );
         SiteRendererSink sink = new SiteRendererSink( context );
-        renderer.generateDocument( writer, sink, siteRenderingContext );
+        renderer.mergeDocumentIntoSite( writer, sink, siteRenderingContext );
         String renderResult = writer.toString();
         String expectedResult = IOUtils.toString( getClass().getResourceAsStream( "velocity-toolmanager.expected.txt" ) );
         expectedResult = StringUtils.unifyLineSeparators( expectedResult );
diff --git a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/RenderingContextTest.java b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/RenderingContextTest.java
index 6b1faad..2435847 100644
--- a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/RenderingContextTest.java
+++ b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/RenderingContextTest.java
@@ -43,32 +43,32 @@
         File baseDir = new File( getBasedir() + File.separatorChar + "test" + File.separatorChar + "resources" );
         String docName = "file.with.dot.in.name.xml";
 
-        RenderingContext renderingContext = new RenderingContext( baseDir, docName, "", "xml" );
+        RenderingContext renderingContext = new RenderingContext( baseDir, "test", docName, "", "xml", false );
         assertEquals( "file.with.dot.in.name.html", renderingContext.getOutputName() );
         assertEquals( ".", renderingContext.getRelativePath() );
 
-        renderingContext = new RenderingContext( baseDir, docName ); // not Doxia source
+        renderingContext = new RenderingContext( baseDir, docName, "generator" ); // not Doxia source
         assertEquals( "file.with.dot.in.name.html", renderingContext.getOutputName() );
         assertEquals( ".", renderingContext.getRelativePath() );
 
         docName = "index.xml.vm";
 
-        renderingContext = new RenderingContext( baseDir, docName, "", "xml" );
+        renderingContext = new RenderingContext( baseDir, "test", docName, "", "xml", false );
         assertEquals( "index.html", renderingContext.getOutputName() );
         assertEquals( ".", renderingContext.getRelativePath() );
 
         docName = "download.apt.vm";
 
-        renderingContext = new RenderingContext( baseDir, docName, "", "apt" );
+        renderingContext = new RenderingContext( baseDir, "test", docName, "", "apt", false );
         assertEquals( "download.html", renderingContext.getOutputName() );
         assertEquals( ".", renderingContext.getRelativePath() );
 
         docName = "path/file.apt";
-        renderingContext = new RenderingContext( baseDir, docName, "", "apt" );
+        renderingContext = new RenderingContext( baseDir, "test", docName, "", "apt", false );
         assertEquals( "path/file.html", renderingContext.getOutputName() );
         assertEquals( "..", renderingContext.getRelativePath() );
 
-        renderingContext = new RenderingContext( baseDir, docName );
+        renderingContext = new RenderingContext( baseDir, docName, "generator" );
         assertEquals( "path/file.html", renderingContext.getOutputName() );
         assertEquals( "..", renderingContext.getRelativePath() );
     }