[MSITE-68] site:run now runs reports and category summary

git-svn-id: https://svn.apache.org/repos/asf/maven/plugins/branches/site-refactor@385825 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/AbstractSiteRenderingMojo.java b/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/AbstractSiteRenderingMojo.java
index 8d79332..ae90e09 100644
--- a/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/AbstractSiteRenderingMojo.java
+++ b/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/AbstractSiteRenderingMojo.java
@@ -24,13 +24,16 @@
 import org.apache.maven.artifact.resolver.ArtifactResolver;
 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
 import org.apache.maven.artifact.versioning.VersionRange;
+import org.apache.maven.doxia.module.xhtml.decoration.render.RenderingContext;
 import org.apache.maven.doxia.site.decoration.DecorationModel;
 import org.apache.maven.doxia.site.decoration.Menu;
 import org.apache.maven.doxia.site.decoration.MenuItem;
 import org.apache.maven.doxia.site.decoration.Skin;
 import org.apache.maven.doxia.site.decoration.inheritance.DecorationModelInheritanceAssembler;
 import org.apache.maven.doxia.site.decoration.io.xpp3.DecorationXpp3Reader;
+import org.apache.maven.doxia.siterenderer.DocumentRenderer;
 import org.apache.maven.doxia.siterenderer.Renderer;
+import org.apache.maven.doxia.siterenderer.RendererException;
 import org.apache.maven.doxia.siterenderer.SiteRenderingContext;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
@@ -48,6 +51,8 @@
 import java.io.IOException;
 import java.io.StringReader;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -642,4 +647,210 @@
             menu.addItem( item );
         }
     }
+
+    protected Map locateReports( List reports, Map documents, Locale locale )
+    {
+        Map reportsByOutputName = new HashMap();
+        for ( Iterator i = reports.iterator(); i.hasNext(); )
+        {
+            MavenReport report = (MavenReport) i.next();
+
+            String outputName = report.getOutputName() + ".html";
+            if ( documents.containsKey( outputName ) )
+            {
+                String displayLanguage = locale.getDisplayLanguage( Locale.ENGLISH );
+
+                getLog().info( "Skipped \"" + report.getName( locale ) + "\" report, file \"" + outputName +
+                    "\" already exists for the " + displayLanguage + " version." );
+                i.remove();
+            }
+            else
+            {
+                reportsByOutputName.put( report.getOutputName(), report );
+
+                RenderingContext renderingContext = new RenderingContext( siteDirectory, outputName );
+                ReportDocumentRenderer renderer = new ReportDocumentRenderer( report, renderingContext, getLog() );
+                documents.put( outputName, renderer );
+            }
+        }
+        return reportsByOutputName;
+    }
+
+    protected void populateReportsMenu( DecorationModel decorationModel, Locale locale, Map categories )
+    {
+        Menu menu = decorationModel.getMenuRef( "reports" );
+
+        if ( menu != null )
+        {
+            if ( menu.getName() == null )
+            {
+                menu.setName( i18n.getString( "site-plugin", locale, "report.menu.projectdocumentation" ) );
+            }
+
+            boolean found = false;
+            if ( menu.getItems().isEmpty() )
+            {
+                List categoryReports = (List) categories.get( MavenReport.CATEGORY_PROJECT_INFORMATION );
+                if ( !categoryReports.isEmpty() )
+                {
+                    MenuItem item = createCategoryMenu(
+                        i18n.getString( "site-plugin", locale, "report.menu.projectinformation" ), "/project-info.html",
+                        categoryReports, locale );
+                    menu.getItems().add( item );
+                    found = true;
+                }
+
+                categoryReports = (List) categories.get( MavenReport.CATEGORY_PROJECT_REPORTS );
+                if ( !categoryReports.isEmpty() )
+                {
+                    MenuItem item = createCategoryMenu(
+                        i18n.getString( "site-plugin", locale, "report.menu.projectreports" ), "/project-reports.html",
+                        categoryReports, locale );
+                    menu.getItems().add( item );
+                    found = true;
+                }
+            }
+            if ( !found )
+            {
+                decorationModel.removeMenuRef( "reports" );
+            }
+        }
+    }
+
+    private MenuItem createCategoryMenu( String name, String href, List categoryReports, Locale locale )
+    {
+        MenuItem item = new MenuItem();
+        item.setName( name );
+        item.setCollapse( true );
+        item.setHref( href );
+
+        Collections.sort( categoryReports, new ReportComparator( locale ) );
+
+        for ( Iterator k = categoryReports.iterator(); k.hasNext(); )
+        {
+            MavenReport report = (MavenReport) k.next();
+
+            MenuItem subitem = new MenuItem();
+            subitem.setName( report.getName( locale ) );
+            subitem.setHref( report.getOutputName() + ".html" );
+            item.getItems().add( subitem );
+        }
+
+        return item;
+    }
+
+    protected void populateReportItems( DecorationModel decorationModel, Locale locale, Map reportsByOutputName )
+    {
+        for ( Iterator i = decorationModel.getMenus().iterator(); i.hasNext(); )
+        {
+            Menu menu = (Menu) i.next();
+
+            populateItemRefs( menu.getItems(), locale, reportsByOutputName );
+        }
+    }
+
+    private void populateItemRefs( List items, Locale locale, Map reportsByOutputName )
+    {
+        for ( Iterator i = items.iterator(); i.hasNext(); )
+        {
+            MenuItem item = (MenuItem) i.next();
+
+            if ( item.getRef() != null )
+            {
+                if ( reportsByOutputName.containsKey( item.getRef() ) )
+                {
+                    MavenReport report = (MavenReport) reportsByOutputName.get( item.getRef() );
+
+                    if ( item.getName() == null )
+                    {
+                        item.setName( report.getName( locale ) );
+                    }
+
+                    if ( item.getHref() == null || item.getHref().length() == 0 )
+                    {
+                        item.setHref( report.getOutputName() + ".html" );
+                    }
+                }
+                else
+                {
+                    getLog().warn( "Unrecognised reference: '" + item.getRef() + "'" );
+                    i.remove();
+                }
+            }
+            populateItemRefs( item.getItems(), locale, reportsByOutputName );
+        }
+    }
+
+    protected Map categoriseReports( Collection reports )
+    {
+        Map categories = new HashMap();
+        for ( Iterator i = reports.iterator(); i.hasNext(); )
+        {
+            MavenReport report = (MavenReport) i.next();
+            List categoryReports = (List) categories.get( report.getCategoryName() );
+            if ( categoryReports == null )
+            {
+                categoryReports = new ArrayList();
+                categories.put( report.getCategoryName(), categoryReports );
+            }
+            categoryReports.add( report );
+        }
+        return categories;
+    }
+
+    protected Map locateDocuments( SiteRenderingContext context, List reports, Locale locale )
+        throws IOException, RendererException
+    {
+        Map documents = siteRenderer.locateDocumentFiles( context );
+
+        Map reportsByOutputName = locateReports( reports, documents, locale );
+
+        // TODO: I want to get rid of categories eventually. There's no way to add your own in a fully i18n manner
+        Map categories = categoriseReports( reportsByOutputName.values() );
+
+        populateReportsMenu( context.getDecoration(), locale, categories );
+        populateReportItems( context.getDecoration(), locale, reportsByOutputName );
+
+        if ( categories.containsKey( MavenReport.CATEGORY_PROJECT_INFORMATION ) )
+        {
+            List categoryReports = (List) categories.get( MavenReport.CATEGORY_PROJECT_INFORMATION );
+
+            RenderingContext renderingContext = new RenderingContext( siteDirectory, "project-info.html" );
+            String title = i18n.getString( "site-plugin", locale, "report.information.title" );
+            String desc1 = i18n.getString( "site-plugin", locale, "report.information.description1" );
+            String desc2 = i18n.getString( "site-plugin", locale, "report.information.description2" );
+            DocumentRenderer renderer =
+                new CategorySummaryDocumentRenderer( renderingContext, title, desc1, desc2, i18n, categoryReports );
+
+            if ( !documents.containsKey( renderer.getOutputName() ) )
+            {
+                documents.put( renderer.getOutputName(), renderer );
+            }
+            else
+            {
+                getLog().info( "Category summary '" + renderer.getOutputName() + "' skipped; already exists" );
+            }
+        }
+
+        if ( categories.containsKey( MavenReport.CATEGORY_PROJECT_REPORTS ) )
+        {
+            List categoryReports = (List) categories.get( MavenReport.CATEGORY_PROJECT_REPORTS );
+            RenderingContext renderingContext = new RenderingContext( siteDirectory, "project-reports.html" );
+            String title = i18n.getString( "site-plugin", locale, "report.project.title" );
+            String desc1 = i18n.getString( "site-plugin", locale, "report.project.description1" );
+            String desc2 = i18n.getString( "site-plugin", locale, "report.project.description2" );
+            DocumentRenderer renderer =
+                new CategorySummaryDocumentRenderer( renderingContext, title, desc1, desc2, i18n, categoryReports );
+
+            if ( !documents.containsKey( renderer.getOutputName() ) )
+            {
+                documents.put( renderer.getOutputName(), renderer );
+            }
+            else
+            {
+                getLog().info( "Category summary '" + renderer.getOutputName() + "' skipped; already exists" );
+            }
+        }
+        return documents;
+    }
 }
diff --git a/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/CategorySummaryDocumentRenderer.java b/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/CategorySummaryDocumentRenderer.java
new file mode 100644
index 0000000..1b40a9a
--- /dev/null
+++ b/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/CategorySummaryDocumentRenderer.java
@@ -0,0 +1,161 @@
+package org.apache.maven.plugins.site;
+
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.maven.doxia.module.xhtml.decoration.render.RenderingContext;
+import org.apache.maven.doxia.siterenderer.DocumentRenderer;
+import org.apache.maven.doxia.siterenderer.Renderer;
+import org.apache.maven.doxia.siterenderer.RendererException;
+import org.apache.maven.doxia.siterenderer.SiteRenderingContext;
+import org.apache.maven.doxia.siterenderer.sink.SiteRendererSink;
+import org.apache.maven.reporting.MavenReport;
+import org.codehaus.plexus.i18n.I18N;
+
+import java.io.FileNotFoundException;
+import java.io.Writer;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * Renders a Maven report.
+ *
+ * @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ */
+public class CategorySummaryDocumentRenderer
+    implements DocumentRenderer
+{
+    private RenderingContext renderingContext;
+
+    private String title;
+
+    private String desc1;
+
+    private String desc2;
+
+    private I18N i18n;
+
+    private List categoryReports;
+
+    public CategorySummaryDocumentRenderer( RenderingContext renderingContext, String title, String desc1, String desc2,
+                                            I18N i18n, List categoryReports )
+    {
+        this.renderingContext = renderingContext;
+        this.title = title;
+        this.desc1 = desc1;
+        this.desc2 = desc2;
+        this.i18n = i18n;
+        this.categoryReports = Collections.unmodifiableList( categoryReports );
+    }
+
+    public void renderDocument( Writer writer, Renderer renderer, SiteRenderingContext siteRenderingContext )
+        throws RendererException, FileNotFoundException
+    {
+        SiteRendererSink sink = new SiteRendererSink( renderingContext );
+
+        sink.head();
+
+        sink.title();
+
+        sink.text( title );
+
+        sink.title_();
+
+        sink.head_();
+
+        sink.body();
+
+        sink.section1();
+        sink.sectionTitle1();
+        sink.text( title );
+        sink.sectionTitle1_();
+
+        sink.paragraph();
+        sink.text( desc1 + " " );
+        sink.link( "http://maven.apache.org" );
+        sink.text( "Maven" );
+        sink.link_();
+        sink.text( " " + desc2 );
+        sink.paragraph_();
+
+        sink.section2();
+        sink.sectionTitle2();
+        Locale locale = siteRenderingContext.getLocale();
+        sink.text( i18n.getString( "site-plugin", locale, "report.category.sectionTitle" ) );
+        sink.sectionTitle2_();
+
+        sink.table();
+
+        String name = i18n.getString( "site-plugin", locale, "report.category.column.document" );
+        String description = i18n.getString( "site-plugin", locale, "report.category.column.description" );
+
+        sink.tableRow();
+
+        sink.tableHeaderCell();
+
+        sink.text( name );
+
+        sink.tableHeaderCell_();
+
+        sink.tableHeaderCell();
+
+        sink.text( description );
+
+        sink.tableHeaderCell_();
+
+        sink.tableRow_();
+
+        if ( categoryReports != null )
+        {
+            for ( Iterator i1 = categoryReports.iterator(); i1.hasNext(); )
+            {
+                MavenReport report = (MavenReport) i1.next();
+
+                sink.tableRow();
+                sink.tableCell();
+                sink.link( report.getOutputName() + ".html" );
+                sink.text( report.getName( locale ) );
+                sink.link_();
+                sink.tableCell_();
+                sink.tableCell();
+                sink.text( report.getDescription( locale ) );
+                sink.tableCell_();
+                sink.tableRow_();
+            }
+        }
+
+        sink.table_();
+
+        sink.section2_();
+
+        sink.section1_();
+
+        sink.body_();
+
+        sink.flush();
+
+        sink.close();
+
+        renderer.generateDocument( writer, sink, siteRenderingContext );
+    }
+
+    public String getOutputName()
+    {
+        return renderingContext.getOutputName();
+    }
+}
diff --git a/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/ReportDocumentRenderer.java b/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/ReportDocumentRenderer.java
new file mode 100644
index 0000000..dc699a0
--- /dev/null
+++ b/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/ReportDocumentRenderer.java
@@ -0,0 +1,84 @@
+package org.apache.maven.plugins.site;
+
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.maven.doxia.module.xhtml.decoration.render.RenderingContext;
+import org.apache.maven.doxia.siterenderer.DocumentRenderer;
+import org.apache.maven.doxia.siterenderer.Renderer;
+import org.apache.maven.doxia.siterenderer.RendererException;
+import org.apache.maven.doxia.siterenderer.SiteRenderingContext;
+import org.apache.maven.doxia.siterenderer.sink.SiteRendererSink;
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.reporting.MavenReport;
+import org.apache.maven.reporting.MavenReportException;
+
+import java.io.FileNotFoundException;
+import java.io.Writer;
+import java.util.Locale;
+
+/**
+ * Renders a Maven report.
+ *
+ * @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ */
+public class ReportDocumentRenderer
+    implements DocumentRenderer
+{
+    private MavenReport report;
+
+    private RenderingContext renderingContext;
+
+    private Log log;
+
+    public ReportDocumentRenderer( MavenReport report, RenderingContext renderingContext, Log log )
+    {
+        this.report = report;
+
+        this.renderingContext = renderingContext;
+
+        this.log = log;
+    }
+
+    public void renderDocument( Writer writer, Renderer renderer, SiteRenderingContext siteRenderingContext )
+        throws RendererException, FileNotFoundException
+    {
+        Locale locale = siteRenderingContext.getLocale();
+        String localReportName = report.getName( locale );
+        log.info( "Generate \"" + localReportName + "\" report." );
+
+        SiteRendererSink sink = new SiteRendererSink( renderingContext );
+
+        try
+        {
+            report.generate( sink, locale );
+        }
+        catch ( MavenReportException e )
+        {
+            throw new RendererException( "Error rendering Maven report: " + e.getMessage(), e );
+        }
+
+        if ( !report.isExternalReport() )
+        {
+            renderer.generateDocument( writer, sink, siteRenderingContext );
+        }
+    }
+
+    public String getOutputName()
+    {
+        return renderingContext.getOutputName();
+    }
+}
diff --git a/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/SiteMojo.java b/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/SiteMojo.java
index 4852fcc..5307f45 100644
--- a/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/SiteMojo.java
+++ b/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/SiteMojo.java
@@ -16,26 +16,15 @@
  * limitations under the License.
  */
 
-import org.apache.maven.doxia.module.xhtml.decoration.render.RenderingContext;
-import org.apache.maven.doxia.site.decoration.DecorationModel;
-import org.apache.maven.doxia.site.decoration.Menu;
-import org.apache.maven.doxia.site.decoration.MenuItem;
 import org.apache.maven.doxia.siterenderer.RendererException;
 import org.apache.maven.doxia.siterenderer.SiteRenderingContext;
-import org.apache.maven.doxia.siterenderer.sink.SiteRendererSink;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.reporting.MavenReport;
-import org.apache.maven.reporting.MavenReportException;
 
 import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
@@ -104,10 +93,6 @@
                 renderLocale( locale, filteredReports );
             }
         }
-        catch ( MavenReportException e )
-        {
-            throw new MojoExecutionException( "Error during report generation", e );
-        }
         catch ( RendererException e )
         {
             throw new MojoExecutionException( "Error during page generation", e );
@@ -119,316 +104,24 @@
     }
 
     private void renderLocale( Locale locale, List reports )
-        throws IOException, RendererException, MavenReportException, MojoFailureException, MojoExecutionException
+        throws IOException, RendererException, MojoFailureException, MojoExecutionException
     {
-        File outputDirectory = getOutputDirectory( locale );
-
         SiteRenderingContext context = createSiteRenderingContext( locale );
 
-        Map documents = siteRenderer.locateDocumentFiles( context );
+        Map documents = locateDocuments( context, reports, locale );
 
-        Map reportsByOutputName = new HashMap();
+        File outputDirectory = getOutputDirectory( locale );
+
+        // For external reports
         for ( Iterator i = reports.iterator(); i.hasNext(); )
         {
             MavenReport report = (MavenReport) i.next();
-
-            reportsByOutputName.put( report.getOutputName(), report );
-
-            String outputName = report.getOutputName() + ".html";
-            if ( documents.containsKey( outputName ) )
-            {
-                String displayLanguage = locale.getDisplayLanguage( Locale.ENGLISH );
-
-                getLog().info( "Skipped \"" + report.getName( locale ) + "\" report, file \"" + outputName +
-                    "\" already exists for the " + displayLanguage + " version." );
-                i.remove();
-            }
-        }
-
-        // TODO: I want to get rid of categories eventually. There's no way to add your own in a fully i18n manner
-        Map categories = categoriseReports( reportsByOutputName.values() );
-
-        populateReportsMenu( context.getDecoration(), locale, categories );
-        populateReportItems( context.getDecoration(), locale, reportsByOutputName );
-
-        if ( categories.containsKey( MavenReport.CATEGORY_PROJECT_INFORMATION ) )
-        {
-            List categoryReports = (List) categories.get( MavenReport.CATEGORY_PROJECT_INFORMATION );
-            writeSummaryPage( categoryReports, locale, "project-info.html", context, outputDirectory,
-                              i18n.getString( "site-plugin", locale, "report.information.title" ),
-                              i18n.getString( "site-plugin", locale, "report.information.description1" ),
-                              i18n.getString( "site-plugin", locale, "report.information.description2" ) );
-        }
-
-        if ( categories.containsKey( MavenReport.CATEGORY_PROJECT_REPORTS ) )
-        {
-            List categoryReports = (List) categories.get( MavenReport.CATEGORY_PROJECT_REPORTS );
-            writeSummaryPage( categoryReports, locale, "project-reports.html", context, outputDirectory,
-                              i18n.getString( "site-plugin", locale, "report.project.title" ),
-                              i18n.getString( "site-plugin", locale, "report.project.description1" ),
-                              i18n.getString( "site-plugin", locale, "report.project.description2" ) );
-        }
-
-        renderDocuments( documents, reportsByOutputName.values(), outputDirectory, locale, context );
-    }
-
-    private void renderDocuments( Map documents, Collection reports, File outputDirectory, Locale locale,
-                                  SiteRenderingContext context )
-        throws RendererException, IOException, MavenReportException
-    {
-        for ( Iterator i = reports.iterator(); i.hasNext(); )
-        {
-            MavenReport report = (MavenReport) i.next();
-
-            String outputName = report.getOutputName() + ".html";
-
-            String localReportName = report.getName( locale );
-            getLog().info( "Generate \"" + localReportName + "\" report." );
-
             report.setReportOutputDirectory( outputDirectory );
-
-            SiteRendererSink sink = siteRenderer.createSink( new RenderingContext( siteDirectory, outputName ) );
-
-            report.generate( sink, locale );
-
-            if ( !report.isExternalReport() )
-            {
-                File outputFile = new File( outputDirectory, outputName );
-
-                if ( !outputFile.getParentFile().exists() )
-                {
-                    outputFile.getParentFile().mkdirs();
-                }
-
-                siteRenderer.generateDocument(
-                    new OutputStreamWriter( new FileOutputStream( outputFile ), outputEncoding ), sink, context );
-            }
         }
 
         siteRenderer.render( documents.values(), context, outputDirectory, outputEncoding );
     }
 
-    private void writeSummaryPage( List categoryReports, Locale locale, String outputName, SiteRenderingContext context,
-                                   File outputDirectory, String title, String desc1, String desc2 )
-        throws RendererException, IOException
-    {
-        SiteRendererSink sink = siteRenderer.createSink( new RenderingContext( siteDirectory, outputName ) );
-
-        sink.head();
-
-        sink.title();
-
-        sink.text( title );
-
-        sink.title_();
-
-        sink.head_();
-
-        sink.body();
-
-        sink.section1();
-        sink.sectionTitle1();
-        sink.text( title );
-        sink.sectionTitle1_();
-
-        sink.paragraph();
-        sink.text( desc1 + " " );
-        sink.link( "http://maven.apache.org" );
-        sink.text( "Maven" );
-        sink.link_();
-        sink.text( " " + desc2 );
-        sink.paragraph_();
-
-        sink.section2();
-        sink.sectionTitle2();
-        sink.text( i18n.getString( "site-plugin", locale, "report.category.sectionTitle" ) );
-        sink.sectionTitle2_();
-
-        sink.table();
-
-        String name = i18n.getString( "site-plugin", locale, "report.category.column.document" );
-        String description = i18n.getString( "site-plugin", locale, "report.category.column.description" );
-
-        sink.tableRow();
-
-        sink.tableHeaderCell();
-
-        sink.text( name );
-
-        sink.tableHeaderCell_();
-
-        sink.tableHeaderCell();
-
-        sink.text( description );
-
-        sink.tableHeaderCell_();
-
-        sink.tableRow_();
-
-        if ( categoryReports != null )
-        {
-            for ( Iterator i1 = categoryReports.iterator(); i1.hasNext(); )
-            {
-                MavenReport report = (MavenReport) i1.next();
-
-                sink.tableRow();
-                sink.tableCell();
-                sink.link( report.getOutputName() + ".html" );
-                sink.text( report.getName( locale ) );
-                sink.link_();
-                sink.tableCell_();
-                sink.tableCell();
-                sink.text( report.getDescription( locale ) );
-                sink.tableCell_();
-                sink.tableRow_();
-            }
-        }
-
-        sink.table_();
-
-        sink.section2_();
-
-        sink.section1_();
-
-        sink.body_();
-
-        sink.flush();
-
-        sink.close();
-
-        File outputFile = new File( outputDirectory, outputName );
-
-        if ( !outputFile.getParentFile().exists() )
-        {
-            outputFile.getParentFile().mkdirs();
-        }
-
-        siteRenderer.generateDocument( new OutputStreamWriter( new FileOutputStream( outputFile ), outputEncoding ),
-                                       sink, context );
-    }
-
-    private void populateReportsMenu( DecorationModel decorationModel, Locale locale, Map categories )
-    {
-        Menu menu = decorationModel.getMenuRef( "reports" );
-
-        if ( menu != null )
-        {
-            if ( menu.getName() == null )
-            {
-                menu.setName( i18n.getString( "site-plugin", locale, "report.menu.projectdocumentation" ) );
-            }
-
-            boolean found = false;
-            if ( menu.getItems().isEmpty() )
-            {
-                List categoryReports = (List) categories.get( MavenReport.CATEGORY_PROJECT_INFORMATION );
-                if ( !categoryReports.isEmpty() )
-                {
-                    MenuItem item = createCategoryMenu(
-                        i18n.getString( "site-plugin", locale, "report.menu.projectinformation" ), "/project-info.html",
-                        categoryReports, locale );
-                    menu.getItems().add( item );
-                    found = true;
-                }
-
-                categoryReports = (List) categories.get( MavenReport.CATEGORY_PROJECT_REPORTS );
-                if ( !categoryReports.isEmpty() )
-                {
-                    MenuItem item = createCategoryMenu(
-                        i18n.getString( "site-plugin", locale, "report.menu.projectreports" ), "/project-reports.html",
-                        categoryReports, locale );
-                    menu.getItems().add( item );
-                    found = true;
-                }
-            }
-            if ( !found )
-            {
-                decorationModel.removeMenuRef( "reports" );
-            }
-        }
-    }
-
-    private MenuItem createCategoryMenu( String name, String href, List categoryReports, Locale locale )
-    {
-        MenuItem item = new MenuItem();
-        item.setName( name );
-        item.setCollapse( true );
-        item.setHref( href );
-
-        Collections.sort( categoryReports, new ReportComparator( locale ) );
-
-        for ( Iterator k = categoryReports.iterator(); k.hasNext(); )
-        {
-            MavenReport report = (MavenReport) k.next();
-
-            MenuItem subitem = new MenuItem();
-            subitem.setName( report.getName( locale ) );
-            subitem.setHref( report.getOutputName() + ".html" );
-            item.getItems().add( subitem );
-        }
-
-        return item;
-    }
-
-    private Map categoriseReports( Collection reports )
-    {
-        Map categories = new HashMap();
-        for ( Iterator i = reports.iterator(); i.hasNext(); )
-        {
-            MavenReport report = (MavenReport) i.next();
-            List categoryReports = (List) categories.get( report.getCategoryName() );
-            if ( categoryReports == null )
-            {
-                categoryReports = new ArrayList();
-                categories.put( report.getCategoryName(), categoryReports );
-            }
-            categoryReports.add( report );
-        }
-        return categories;
-    }
-
-    private void populateReportItems( DecorationModel decorationModel, Locale locale, Map reportsByOutputName )
-    {
-        for ( Iterator i = decorationModel.getMenus().iterator(); i.hasNext(); )
-        {
-            Menu menu = (Menu) i.next();
-
-            populateItemRefs( menu.getItems(), locale, reportsByOutputName );
-        }
-    }
-
-    private void populateItemRefs( List items, Locale locale, Map reportsByOutputName )
-    {
-        for ( Iterator i = items.iterator(); i.hasNext(); )
-        {
-            MenuItem item = (MenuItem) i.next();
-
-            if ( item.getRef() != null )
-            {
-                if ( reportsByOutputName.containsKey( item.getRef() ) )
-                {
-                    MavenReport report = (MavenReport) reportsByOutputName.get( item.getRef() );
-
-                    if ( item.getName() == null )
-                    {
-                        item.setName( report.getName( locale ) );
-                    }
-
-                    if ( item.getHref() == null || item.getHref().length() == 0 )
-                    {
-                        item.setHref( report.getOutputName() + ".html" );
-                    }
-                }
-                else
-                {
-                    getLog().warn( "Unrecognised reference: '" + item.getRef() + "'" );
-                    i.remove();
-                }
-            }
-            populateItemRefs( item.getItems(), locale, reportsByOutputName );
-        }
-    }
-
     private File getOutputDirectory( Locale locale )
     {
         File file;
diff --git a/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/SiteRunMojo.java b/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/SiteRunMojo.java
index 3bbb962..88319ff 100644
--- a/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/SiteRunMojo.java
+++ b/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/SiteRunMojo.java
@@ -134,7 +134,6 @@
         WebAppContext webapp = new WebAppContext();
         webapp.setContextPath( "/" );
         webapp.setResourceBase( tempWebappDirectory.getAbsolutePath() );
-        webapp.setAttribute( "siteDirectory", siteDirectory );
         webapp.setAttribute( "siteRenderer", siteRenderer );
 
         List filteredReports = filterReports( reports );
@@ -148,10 +147,12 @@
         try
         {
             // TODO
-            SiteRenderingContext context = createSiteRenderingContext( Locale.getDefault() );
+            Locale locale = Locale.getDefault();
+            SiteRenderingContext context = createSiteRenderingContext( locale );
             webapp.setAttribute( "context", context );
 
-            Map documents = siteRenderer.locateDocumentFiles( context );
+            Map documents = locateDocuments( context, filteredReports, locale );
+
             webapp.setAttribute( "documents", documents );
 
             siteRenderer.copyResources( context, new File( siteDirectory, "resources" ), tempWebappDirectory );
diff --git a/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/webapp/DoxiaFilter.java b/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/webapp/DoxiaFilter.java
index 5921f0b..c4d1f0c 100644
--- a/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/webapp/DoxiaFilter.java
+++ b/maven-site-plugin/src/main/java/org/apache/maven/plugins/site/webapp/DoxiaFilter.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-import org.apache.maven.doxia.module.xhtml.decoration.render.RenderingContext;
+import org.apache.maven.doxia.siterenderer.DocumentRenderer;
 import org.apache.maven.doxia.siterenderer.Renderer;
 import org.apache.maven.doxia.siterenderer.RendererException;
 import org.apache.maven.doxia.siterenderer.SiteRenderingContext;
@@ -29,7 +29,6 @@
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
-import java.io.File;
 import java.io.IOException;
 import java.util.Map;
 
@@ -41,8 +40,6 @@
 public class DoxiaFilter
     implements Filter
 {
-    private File siteDirectory;
-
     private Renderer siteRenderer;
 
     private SiteRenderingContext context;
@@ -53,7 +50,6 @@
         throws ServletException
     {
         ServletContext servletContext = filterConfig.getServletContext();
-        siteDirectory = (File) servletContext.getAttribute( "siteDirectory" );
         siteRenderer = (Renderer) servletContext.getAttribute( "siteRenderer" );
         context = (SiteRenderingContext) servletContext.getAttribute( "context" );
         documents = (Map) servletContext.getAttribute( "documents" );
@@ -72,8 +68,8 @@
 
             try
             {
-                siteRenderer.renderDocument( servletResponse.getWriter(), (RenderingContext) documents.get( path ),
-                                             context );
+                DocumentRenderer renderer = (DocumentRenderer) documents.get( path );
+                renderer.renderDocument( servletResponse.getWriter(), siteRenderer, context );
             }
             catch ( RendererException e )
             {