[MCHANGELOG-69] Print developer names regardless of whether they're listed in the POM
[MCHANGELOG-73] Print developer names in the change report for known developers and make them links to the team page.
Submitted by: John Allen
Reviewed by: Dennis Lundberg

Applied with modifications.

git-svn-id: https://svn.apache.org/repos/asf/maven/plugins/trunk@939126 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/maven/plugin/changelog/ChangeLogReport.java b/src/main/java/org/apache/maven/plugin/changelog/ChangeLogReport.java
index 3f49cf6..7748418 100644
--- a/src/main/java/org/apache/maven/plugin/changelog/ChangeLogReport.java
+++ b/src/main/java/org/apache/maven/plugin/changelog/ChangeLogReport.java
@@ -48,6 +48,7 @@
 
 import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.doxia.siterenderer.Renderer;
+import org.apache.maven.model.Developer;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.reporting.AbstractMavenReport;
@@ -382,12 +383,26 @@
      */
     protected String displayFileRevDetailUrl;
 
+    /**
+     * List of developers to be shown on the report.
+     *
+     * @parameter expression="${project.developers}"
+     * @since 2.2
+     */
+    protected List developers;
+
     // temporary field holder while generating the report
     private String rptRepository, rptOneRepoParam, rptMultiRepoParam;
 
     // field for SCM Connection URL
     private String connection;
 
+    // field used to hold a map of the developers by Id
+    private HashMap developersById;
+
+    // field used to hold a map of the developers by Name
+    private HashMap developersByName;
+
     /**
      * The system properties to use (needed by the perforce scm provider).
      *
@@ -407,7 +422,9 @@
             return;
         }
 
-        intializeDefaultConfigurationParameters();
+        initializeDefaultConfigurationParameters();
+
+        initializeDeveloperMaps();
 
         verifySCMTypeParams();
 
@@ -435,7 +452,7 @@
      * Initializes any configuration parameters that have not/can not be defined
      * or defaulted by the Mojo API.
      */
-    private void intializeDefaultConfigurationParameters()
+    private void initializeDefaultConfigurationParameters()
     {
         if ( displayFileRevDetailUrl == null || displayFileRevDetailUrl.length() == 0 )
         {
@@ -444,6 +461,27 @@
     }
 
     /**
+     * Creates maps of the project developers by developer Id and developer Name
+     * for quick lookups.
+     */
+    private void initializeDeveloperMaps()
+    {
+        developersById = new HashMap();
+        developersByName = new HashMap();
+
+        if ( developers != null )
+        {
+            for ( Iterator i = developers.iterator(); i.hasNext(); )
+            {
+                Developer developer = (Developer) i.next();
+
+                developersById.put( developer.getId(), developer );
+                developersByName.put( developer.getName(), developer );
+            }
+        }
+    }
+
+    /**
      * populates the changedSets field by either connecting to the SCM or using an existing XML generated in a previous
      * run of the report
      *
@@ -1190,7 +1228,9 @@
         sink.tableCell_();
 
         sink.tableCell();
-        sink.text( entry.getAuthor() );
+
+        sinkAuthorDetails( sink, entry.getAuthor() );
+
         sink.tableCell_();
 
         sink.tableCell();
@@ -1311,6 +1351,35 @@
     }
 
     /**
+     * If the supplied author is a known developer this method outputs a
+     * link to the team members report, or alternatively, if the supplied
+     * author is unknown, outputs the author's name as plain text.
+     *
+     * @param sink Sink to use for outputting
+     * @param author The author's name.
+     */
+    protected void sinkAuthorDetails( Sink sink, String author )
+    {
+        Developer developer = (Developer) developersById.get( author );
+
+        if ( developer == null )
+        {
+            developer = (Developer) developersByName.get( author );
+        }
+
+        if ( developer != null )
+        {
+            sink.link( "team-list.html#" + developer.getId() );
+            sink.text( developer.getName() );
+            sink.link_();
+        }
+        else
+        {
+            sink.text( author );
+        }
+    }
+
+    /**
      * populates the report url used to create links from certain elements of the report
      */
     protected void initReportUrls()
diff --git a/src/main/java/org/apache/maven/plugin/changelog/DeveloperActivityReport.java b/src/main/java/org/apache/maven/plugin/changelog/DeveloperActivityReport.java
index d4e218a..b230e8e 100644
--- a/src/main/java/org/apache/maven/plugin/changelog/DeveloperActivityReport.java
+++ b/src/main/java/org/apache/maven/plugin/changelog/DeveloperActivityReport.java
@@ -20,7 +20,6 @@
  */
 
 import org.apache.maven.doxia.sink.Sink;
-import org.apache.maven.model.Developer;
 import org.apache.maven.scm.ChangeFile;
 import org.apache.maven.scm.ChangeSet;
 import org.apache.maven.scm.command.changelog.ChangeLogSet;
@@ -43,13 +42,6 @@
     extends ChangeLogReport
 {
     /**
-     * List of developers to be shown on the report.
-     *
-     * @parameter expression="${project.developers}"
-     */
-    private List developers;
-
-    /**
      * Used to hold data while creating the report
      */
     private HashMap commits;
@@ -183,42 +175,18 @@
     {
         initDeveloperDetails( set );
 
-        //for( Iterator i=commits.keySet().iterator(); i.hasNext(); )
-        for ( Iterator i = developers.iterator(); i.hasNext(); )
+        for( Iterator i = commits.keySet().iterator(); i.hasNext(); )
         {
-            Developer developer = (Developer) i.next();
+            String author = (String) i.next();
 
-            String name = developer.getName();
-
-            String id = developer.getId();
-
-            LinkedList devCommits;
-            HashMap devFiles;
-
-            if ( !commits.containsKey( name ) )
-            {
-                if ( !commits.containsKey( id ) )
-                {
-                    continue;
-                }
-
-                devCommits = (LinkedList) commits.get( id );
-
-                devFiles = (HashMap) files.get( id );
-            }
-            else
-            {
-                devCommits = (LinkedList) commits.get( name );
-
-                devFiles = (HashMap) files.get( name );
-            }
+            LinkedList devCommits = (LinkedList) commits.get( author );
+            HashMap devFiles = (HashMap) files.get( author );
 
             sink.tableRow();
-
             sink.tableCell();
-            sink.link( "team-list.html#" + developer.getId() );
-            sink.text( name );
-            sink.link_();
+
+            sinkAuthorDetails( sink, author );
+
             sink.tableCell_();
 
             sink.tableCell();