001    package hirondelle.web4jtools.metrics.histogram;
002    
003    import hirondelle.web4j.action.ResponsePage;
004    import hirondelle.web4j.request.RequestParser;
005    import hirondelle.web4jtools.metrics.base.FileInfo;
006    import hirondelle.web4jtools.metrics.base.MetricsAction;
007    
008    import java.util.ArrayList;
009    import java.util.Iterator;
010    import java.util.List;
011    
012    /**
013    *  Display a breakdown of the number of lines for .java files, as a histogram.
014    */
015    public final class HistogramAction extends MetricsAction {
016    
017      public HistogramAction(RequestParser aRequestParser) {
018        super(FORWARD, aRequestParser);
019      }
020      
021      /** Calculate histogram buckets, and show to user. */
022      protected void calculateMetric() {
023        createBuckets();
024        calcBucketCounts(fFileList);
025        addToRequest("buckets", fBuckets);
026      }
027      
028      // PRIVATE //
029      private static final ResponsePage FORWARD = new ResponsePage("Breakdown of .java File Sizes", "view.jsp", HistogramAction.class);
030      private List<Bucket> fBuckets = new ArrayList<Bucket>();
031      
032      private void createBuckets(){
033        fBuckets.add(new Bucket(0,25));
034        fBuckets.add(new Bucket(26,50));
035        fBuckets.add(new Bucket(51,75));
036        fBuckets.add(new Bucket(76,100));
037        fBuckets.add(new Bucket(101,125));
038        fBuckets.add(new Bucket(126,150));
039        fBuckets.add(new Bucket(151,175));
040        fBuckets.add(new Bucket(176,200));
041        fBuckets.add(new Bucket(201,225));
042        fBuckets.add(new Bucket(226,250));
043        fBuckets.add(new Bucket(251,275));
044        fBuckets.add(new Bucket(276,300));
045        fBuckets.add(new Bucket(301));
046      }
047      
048      private void calcBucketCounts(List<FileInfo> aFiles){
049        //need iterator since altering state of items in the list
050        Iterator<FileInfo> iter = aFiles.iterator();
051        while ( iter.hasNext() ) {
052          FileInfo file = iter.next();
053          if( file.isJavaSourceFile() ) {
054            Integer numLines = file.getNumLines();
055            addToCorrectBucket(numLines);
056          }
057        }
058      }
059      
060      private void addToCorrectBucket(Integer aNumLines){
061        Iterator<Bucket> iter = fBuckets.iterator();
062        while ( iter.hasNext() ) {
063          Bucket bucket = iter.next();
064          if ( bucket.getMax() == null || aNumLines <= bucket.getMax() ) {
065            bucket.incrementCount();
066            break;
067          }
068        }
069      }
070    }