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    }