[DOXIASITETOOLS-166] use projects from reactor for modules menu

git-svn-id: https://svn.apache.org/repos/asf/maven/doxia/doxia-sitetools/trunk@1762152 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/doxia-integration-tools/src/main/java/org/apache/maven/doxia/tools/DefaultSiteTool.java b/doxia-integration-tools/src/main/java/org/apache/maven/doxia/tools/DefaultSiteTool.java
index 9717d29..070e826 100644
--- a/doxia-integration-tools/src/main/java/org/apache/maven/doxia/tools/DefaultSiteTool.java
+++ b/doxia-integration-tools/src/main/java/org/apache/maven/doxia/tools/DefaultSiteTool.java
@@ -56,7 +56,6 @@
 import org.apache.maven.doxia.site.decoration.io.xpp3.DecorationXpp3Reader;
 import org.apache.maven.doxia.site.decoration.io.xpp3.DecorationXpp3Writer;
 import org.apache.maven.model.DistributionManagement;
-import org.apache.maven.model.Model;
 import org.apache.maven.model.Site;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectBuilder;
@@ -480,7 +479,14 @@
             populateParentMenu( decorationModel, llocale, project, parentProject, true );
         }
 
-        populateModulesMenu( decorationModel, llocale, project, reactorProjects, localRepository, true );
+        try
+        {
+            populateModulesMenu( decorationModel, llocale, project, reactorProjects, localRepository, true );
+        }
+        catch ( IOException e )
+        {
+            throw new SiteToolException( "Error while populating modules menu: " + e.getMessage(), e );
+        }
 
         if ( decorationModel.getBannerLeft() == null )
         {
@@ -733,11 +739,12 @@
      * @param localRepository the Maven local repository, not null.
      * @param keepInheritedRefs used for inherited references.
      * @throws SiteToolException if any
+     * @throws IOException 
      */
     private void populateModulesMenu( DecorationModel decorationModel, Locale locale, MavenProject project,
                                      List<MavenProject> reactorProjects, ArtifactRepository localRepository,
                                      boolean keepInheritedRefs )
-        throws SiteToolException
+        throws SiteToolException, IOException
     {
         checkNotNull( "project", project );
         checkNotNull( "reactorProjects", reactorProjects );
@@ -766,36 +773,45 @@
                 menu.setName( i18n.getString( "site-tool", llocale, "decorationModel.menu.projectmodules" ) );
             }
 
-            getLogger().debug( "Attempting to load module information from local filesystem" );
-
-            // Not running reactor - search for the projects manually
-            List<Model> models = new ArrayList<Model>( project.getModules().size() );
             for ( String module : (List<String>) project.getModules() )
             {
-                Model model;
-                File f = new File( project.getBasedir(), module + "/pom.xml" );
-                if ( f.exists() )
-                {
-                    try
-                    {
-                        model = mavenProjectBuilder.build( f, localRepository, null ).getModel();
-                    }
-                    catch ( ProjectBuildingException e )
-                    {
-                        throw new SiteToolException( "Unable to read local module-POM", e );
-                    }
-                }
-                else
-                {
-                    getLogger().warn( "No filesystem module-POM available" );
+                MavenProject moduleProject = getModuleFromReactor( project, reactorProjects, module );
 
-                    model = new Model();
-                    model.setName( module );
-                    setDistMgmntSiteUrl( model, module );
+                if ( moduleProject == null )
+                {
+                    getLogger().warn( "Module " + module
+                        + " not found in reactor: loading locally" );
+
+                    File f = new File( project.getBasedir(), module + "/pom.xml" );
+                    if ( f.exists() )
+                    {
+                        try
+                        {
+                            moduleProject = mavenProjectBuilder.build( f, localRepository, null );
+                        }
+                        catch ( ProjectBuildingException e )
+                        {
+                            throw new SiteToolException( "Unable to read local module-POM", e );
+                        }
+                    }
+                    else
+                    {
+                        getLogger().warn( "No filesystem module-POM available" );
+    
+                        moduleProject = new MavenProject();
+                        moduleProject.setName( module );
+                        moduleProject.setDistributionManagement( new DistributionManagement() );
+                        moduleProject.getDistributionManagement().setSite( new Site() );
+                        moduleProject.getDistributionManagement().getSite().setUrl( module );
+                    }
                 }
-                models.add( model );
+
+                String siteUrl = getDistMgmntSiteUrl( moduleProject );
+                String itemName =
+                    ( moduleProject.getName() == null ) ? moduleProject.getArtifactId() : moduleProject.getName();
+
+                appendMenuItem( project, menu, itemName, siteUrl, moduleProject.getArtifactId() );
             }
-            populateModulesMenuItemsFromModels( project, models, menu );
         }
         else if ( decorationModel.getMenuRef( "modules" ).getInherit() == null )
         {
@@ -804,6 +820,24 @@
         }
     }
 
+    private static MavenProject getModuleFromReactor( MavenProject project, List<MavenProject> reactorProjects,
+                                                      String module )
+        throws IOException
+    {
+        File moduleBasedir = new File( project.getBasedir(), module ).getCanonicalFile();
+
+        for ( MavenProject reactorProject : reactorProjects )
+        {
+            if ( moduleBasedir.equals( reactorProject.getBasedir() ) )
+            {
+                return reactorProject;
+            }
+        }
+
+        // module not found in reactor
+        return null;
+    }
+
     /** {@inheritDoc} */
     public void populateReportsMenu( DecorationModel decorationModel, Locale locale,
                                      Map<String, List<MavenReport>> categories )
@@ -1322,22 +1356,6 @@
 
     /**
      * @param project not null
-     * @param models not null
-     * @param menu not null
-     */
-    private void populateModulesMenuItemsFromModels( MavenProject project, List<Model> models, Menu menu )
-    {
-        for ( Model model : models )
-        {
-            String reactorUrl = getDistMgmntSiteUrl( model );
-            String name = ( model.getName() == null ) ? model.getArtifactId() : model.getName();
-
-            appendMenuItem( project, menu, name, reactorUrl, model.getArtifactId() );
-        }
-    }
-
-    /**
-     * @param project not null
      * @param menu not null
      * @param name not null
      * @param href could be null
@@ -1426,17 +1444,6 @@
         return getDistMgmntSiteUrl( project.getDistributionManagement() );
     }
 
-    /**
-     * Return distributionManagement.site.url if defined, null otherwise.
-     *
-     * @param model not null
-     * @return could be null
-     */
-    private static String getDistMgmntSiteUrl( Model model )
-    {
-        return getDistMgmntSiteUrl( model.getDistributionManagement() );
-    }
-
     private static String getDistMgmntSiteUrl( DistributionManagement distMgmnt )
     {
         if ( distMgmnt != null && distMgmnt.getSite() != null && distMgmnt.getSite().getUrl() != null )
@@ -1464,21 +1471,6 @@
         }
     }
 
-    private static void setDistMgmntSiteUrl( Model model, String url )
-    {
-        if ( model.getDistributionManagement() == null )
-        {
-            model.setDistributionManagement( new DistributionManagement() );
-        }
-
-        if ( model.getDistributionManagement().getSite() == null )
-        {
-            model.getDistributionManagement().setSite( new Site() );
-        }
-
-        model.getDistributionManagement().getSite().setUrl( url );
-    }
-
     private void checkNotNull( String name, Object value )
     {
         if ( value == null )