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 }