Coverage Report - org.apache.maven.changelog.FileActivityReport
 
Classes in this File Line Coverage Branch Coverage Complexity
FileActivityReport
94% 
100% 
1,889
 
 1  
 package org.apache.maven.changelog;
 2  
 
 3  
 /*
 4  
  * Copyright 2001-2006 The Apache Software Foundation.
 5  
  *
 6  
  * Licensed under the Apache License, Version 2.0 (the "License");
 7  
  * you may not use this file except in compliance with the License.
 8  
  * You may obtain a copy of the License at
 9  
  *
 10  
  *      http://www.apache.org/licenses/LICENSE-2.0
 11  
  *
 12  
  * Unless required by applicable law or agreed to in writing, software
 13  
  * distributed under the License is distributed on an "AS IS" BASIS,
 14  
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 15  
  * See the License for the specific language governing permissions and
 16  
  * limitations under the License.
 17  
  */
 18  
 
 19  
 import org.apache.maven.scm.ChangeFile;
 20  
 import org.apache.maven.scm.ChangeSet;
 21  
 import org.apache.maven.scm.command.changelog.ChangeLogSet;
 22  
 import org.codehaus.doxia.sink.Sink;
 23  
 
 24  
 import java.util.Collection;
 25  
 import java.util.Collections;
 26  
 import java.util.HashMap;
 27  
 import java.util.Iterator;
 28  
 import java.util.LinkedList;
 29  
 import java.util.List;
 30  
 import java.util.Locale;
 31  
 import java.util.Map;
 32  
 import java.util.ResourceBundle;
 33  
 
 34  
 /**
 35  
  * Generate a file activity report.
 36  
  *
 37  
  * @goal file-activity
 38  
  */
 39  10
 public class FileActivityReport
 40  
     extends ChangeLogReport
 41  
 {
 42  
     /**
 43  
      * @see org.apache.maven.reporting.MavenReport#getDescription(java.util.Locale)
 44  
      */
 45  
     public String getDescription( Locale locale )
 46  
     {
 47  0
         return "Generate file activity report from SCM.";
 48  
     }
 49  
 
 50  
     /**
 51  
      * @see org.apache.maven.reporting.MavenReport#getName(java.util.Locale)
 52  
      */
 53  
     public String getName( Locale locale )
 54  
     {
 55  10
         return "File Activity";
 56  
     }
 57  
 
 58  
     /**
 59  
      * @see org.apache.maven.reporting.MavenReport#getOutputName()
 60  
      */
 61  
     public String getOutputName()
 62  
     {
 63  20
         return "file-activity";
 64  
     }
 65  
 
 66  
     /**
 67  
      * generates an empty report in case there are no sources to generate a report with
 68  
      *
 69  
      * @param bundle the resource bundle to retrieve report phrases from
 70  
      * @param sink   the report formatting tool
 71  
      */
 72  
     protected void doGenerateEmptyReport( ResourceBundle bundle, Sink sink )
 73  
     {
 74  5
         sink.head();
 75  5
         sink.title();
 76  5
         sink.text( bundle.getString( "report.file-activity.header" ) );
 77  5
         sink.title_();
 78  5
         sink.head_();
 79  
 
 80  5
         sink.body();
 81  5
         sink.section1();
 82  
 
 83  5
         sink.sectionTitle1();
 84  5
         sink.text( bundle.getString( "report.file-activity.mainTitle" ) );
 85  5
         sink.sectionTitle1_();
 86  
 
 87  5
         sink.paragraph();
 88  5
         sink.text( "No sources found to create a report." );
 89  5
         sink.paragraph_();
 90  
 
 91  5
         sink.section1_();
 92  
 
 93  5
         sink.body_();
 94  5
         sink.flush();
 95  5
         sink.close();
 96  5
     }
 97  
 
 98  
     /**
 99  
      * method that generates the report for this mojo.
 100  
      *
 101  
      * @param changeLogSets changed sets to generate the report from
 102  
      * @param bundle        the resource bundle to retrieve report phrases from
 103  
      * @param sink          the report formatting tool
 104  
      */
 105  
     protected void doGenerateReport( List changeLogSets, ResourceBundle bundle, Sink sink )
 106  
     {
 107  5
         sink.head();
 108  5
         sink.title();
 109  5
         sink.text( bundle.getString( "report.file-activity.header" ) );
 110  5
         sink.title_();
 111  5
         sink.head_();
 112  
 
 113  5
         sink.body();
 114  5
         sink.section1();
 115  5
         sink.sectionTitle1();
 116  5
         sink.text( bundle.getString( "report.file-activity.mainTitle" ) );
 117  5
         sink.sectionTitle1_();
 118  
 
 119  5
         for ( Iterator sets = changeLogSets.iterator(); sets.hasNext(); )
 120  
         {
 121  10
             ChangeLogSet set = (ChangeLogSet) sets.next();
 122  10
             doChangedSets( set, bundle, sink );
 123  
         }
 124  
 
 125  5
         sink.section1_();
 126  5
         sink.body_();
 127  
 
 128  5
         sink.table_();
 129  5
     }
 130  
 
 131  
     /**
 132  
      * generates a section of the report referring to a changeset
 133  
      *
 134  
      * @param set    the current ChangeSet to generate this section of the report
 135  
      * @param bundle the resource bundle to retrieve report phrases from
 136  
      * @param sink   the report formatting tool
 137  
      */
 138  
     private void doChangedSets( ChangeLogSet set, ResourceBundle bundle, Sink sink )
 139  
     {
 140  10
         sink.section2();
 141  10
         sink.sectionTitle2();
 142  10
         if ( set.getStartDate() == null )
 143  
         {
 144  0
             sink.text( bundle.getString( "report.SetRangeUnknown" ) );
 145  
         }
 146  10
         else if ( set.getEndDate() == null )
 147  
         {
 148  0
             sink.text( bundle.getString( "report.SetRangeSince" ) );
 149  
         }
 150  
         else
 151  
         {
 152  10
             sink.text( bundle.getString( "report.SetRangeBetween" ) );
 153  10
             sink.text( " " + set.getStartDate() + " " + bundle.getString( "report.To" ) + " " + set.getEndDate() );
 154  
         }
 155  10
         sink.sectionTitle2_();
 156  
 
 157  10
         doSummary( set, bundle, sink );
 158  
 
 159  10
         sink.table();
 160  
 
 161  10
         sink.tableRow();
 162  10
         sink.tableHeaderCell();
 163  10
         sink.text( bundle.getString( "report.file-activity.filename" ) );
 164  10
         sink.tableHeaderCell_();
 165  10
         sink.tableHeaderCell();
 166  10
         sink.text( bundle.getString( "report.file-activity.timesChanged" ) );
 167  10
         sink.tableHeaderCell_();
 168  10
         sink.tableRow_();
 169  
 
 170  10
         doRows( set, sink );
 171  
 
 172  10
         sink.table_();
 173  
 
 174  10
         sink.section2_();
 175  10
     }
 176  
 
 177  
     /**
 178  
      * generates the report summary section of the report
 179  
      *
 180  
      * @param set    changed set to generate the report from
 181  
      * @param bundle the resource bundle to retrieve report phrases from
 182  
      * @param sink   the report formatting tool
 183  
      */
 184  
     private void doSummary( ChangeLogSet set, ResourceBundle bundle, Sink sink )
 185  
     {
 186  10
         sink.paragraph();
 187  
 
 188  10
         sink.text( bundle.getString( "report.file-activity.range" ) );
 189  10
         sink.text( ": " + set.getStartDate() + " " + bundle.getString( "report.To" ) + " " + set.getEndDate() );
 190  
 
 191  10
         sink.text( ", " + bundle.getString( "report.TotalCommits" ) );
 192  10
         sink.text( ":" + set.getChangeSets().size() );
 193  
 
 194  10
         sink.text( ", " + bundle.getString( "report.file-activity.filesChanged" ) );
 195  10
         sink.text( ":" + countFilesChanged( set.getChangeSets() ) );
 196  
 
 197  10
         sink.paragraph_();
 198  10
     }
 199  
 
 200  
     /**
 201  
      * generates the row details for the file activity report
 202  
      *
 203  
      * @param set  the changelog set to generate a report with
 204  
      * @param sink the report formatting tool
 205  
      */
 206  
     private void doRows( ChangeLogSet set, Sink sink )
 207  
     {
 208  10
         List list = getOrderedFileList( set.getChangeSets() );
 209  
 
 210  10
         initReportUrls();
 211  
 
 212  10
         for ( Iterator i = list.iterator(); i.hasNext(); )
 213  
         {
 214  20
             List revision = (List) i.next();
 215  20
             ChangeFile file = (ChangeFile) revision.get( 0 );
 216  
 
 217  20
             sink.tableRow();
 218  20
             sink.tableCell();
 219  
 
 220  
             try
 221  
             {
 222  20
                 generateLinks( getConnection(), file.getName(), sink );
 223  
             }
 224  0
             catch ( Exception e )
 225  
             {
 226  0
                 e.printStackTrace();
 227  
 
 228  0
                 sink.text( file.getName() );
 229  20
             }
 230  20
             sink.tableCell_();
 231  
 
 232  20
             sink.tableCell();
 233  20
             sink.text( "" + revision.size() );
 234  
 
 235  20
             sink.tableCell_();
 236  20
             sink.tableRow_();
 237  
         }
 238  10
     }
 239  
 
 240  
     /**
 241  
      * reads the change log entries and generates a list of files changed order by the number of times edited. This
 242  
      * used the FileActivityComparator Object to sort the list
 243  
      *
 244  
      * @param entries the changelog entries to generate the report
 245  
      * @return list of changed files within the SCM with the number of times changed in descending order
 246  
      */
 247  
     private List getOrderedFileList( Collection entries )
 248  
     {
 249  10
         List list = new LinkedList();
 250  
 
 251  10
         Map map = new HashMap();
 252  
 
 253  10
         for ( Iterator i = entries.iterator(); i.hasNext(); )
 254  
         {
 255  20
             ChangeSet entry = (ChangeSet) i.next();
 256  
 
 257  20
             for ( Iterator j = entry.getFiles().iterator(); j.hasNext(); )
 258  
             {
 259  30
                 ChangeFile file = (ChangeFile) j.next();
 260  
 
 261  
                 List revisions;
 262  
 
 263  30
                 if ( map.containsKey( file.getName() ) )
 264  
                 {
 265  10
                     revisions = (List) map.get( file.getName() );
 266  
                 }
 267  
                 else
 268  
                 {
 269  20
                     revisions = new LinkedList();
 270  
                 }
 271  
 
 272  30
                 revisions.add( file );
 273  
 
 274  30
                 map.put( file.getName(), revisions );
 275  
             }
 276  
         }
 277  
 
 278  10
         list.addAll( map.values() );
 279  
 
 280  10
         Collections.sort( list, new FileActivityComparator() );
 281  
 
 282  10
         return list;
 283  
     }
 284  
 }