001 package hirondelle.web4jtools.metrics.lines; 002 003 import java.util.*; 004 import hirondelle.web4jtools.metrics.base.FileInfo; 005 import hirondelle.web4j.security.SafeText; 006 007 /** 008 * Model Object for calculating total lines per file extension, for all extensions. 009 * This class uses a {@code List<LineStat>}, one for each file extension. 010 * <P>This class is mutable. 011 */ 012 final class LinesCounter { 013 014 /** Add another file to this counter. */ 015 public void add(FileInfo aFileInfo) { 016 SafeText extension = aFileInfo.getExtension(); 017 if ( ! isKnownExtension(extension) ){ 018 addNewExtension(aFileInfo); 019 } 020 addNumbers(aFileInfo); 021 } 022 023 /** Return the stats to be displayed to the user. */ 024 public List<LineStat> getStats(){ 025 return fStatsList; 026 } 027 028 /** Return the total number of lines for all file extensions. */ 029 public long getTotalLines() { 030 long result = 0; 031 for(LineStat lineStat : fStatsList){ 032 result = result + lineStat.getNumLines(); 033 } 034 return result; 035 } 036 037 /** Return the total number of files for all extensions. */ 038 public long getTotalFiles(){ 039 long result = 0; 040 for(LineStat lineStat : fStatsList) { 041 result = result + lineStat.getNumFiles(); 042 } 043 return result; 044 } 045 046 // PRIVATE // 047 private final List<LineStat> fStatsList = new ArrayList<LineStat>(); 048 049 private boolean isKnownExtension(SafeText aExt){ 050 boolean result = false; 051 for(LineStat lineStat: fStatsList){ 052 if ( lineStat.getExtension().equals(aExt) ){ 053 result = true; 054 break; 055 } 056 } 057 return result; 058 } 059 060 private void addNewExtension(FileInfo aFileInfo){ 061 LineStat lineStat = new LineStat(aFileInfo.getExtension()); 062 fStatsList.add(lineStat); 063 } 064 065 private void addNumbers( FileInfo aFileInfo){ 066 for(LineStat lineStat: fStatsList){ 067 if ( lineStat.getExtension().equals(aFileInfo.getExtension()) ){ 068 lineStat.add(aFileInfo); 069 break; 070 } 071 } 072 } 073 }