? classes
? src/net/sf/statcvs/sloc
? src/net/sf/statcvs/model/SlocMetrics.java
Index: build.xml
===================================================================
RCS file: /cvsroot/statcvs/statcvs/build.xml,v
retrieving revision 1.36
diff -u -r1.36 build.xml
--- build.xml	6 Apr 2007 17:12:07 -0000	1.36
+++ build.xml	26 May 2008 17:13:46 -0000
@@ -87,6 +87,17 @@
 		</java>
 	</target>
 
+	<target name="run.sclc" depends="compile,copyfiles">
+		<!-- Runs StatCVS on itself with sclc-->
+		<java classname="${project.package}.Main" fork="yes">
+			<arg line="-verbose -counter net.sf.statcvs.sloc.SclcSlocCounter -title StatCVS -output-dir ${stats} -notes etc/report-notes.txt -config-file statcvs.properties -viewcvs http://statcvs.cvs.sourceforge.net/statcvs/statcvs -tags 'v.*' -no-developer uid91994 ${cvs.log} ."/>
+			<classpath>
+				<path refid="project.class.path"/>
+				<pathelement path="${build}"/>
+			</classpath>
+		</java>
+	</target>
+
 	<target name="run.ant" depends="jar">
 		<!-- Runs StatCVS on itself, via the Ant task -->
 		<taskdef name="statcvs" classname="net.sf.statcvs.ant.StatCvsTask" classpath="${dist}/${project.jar}"/>
Index: src/net/sf/statcvs/Main.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/src/net/sf/statcvs/Main.java,v
retrieving revision 1.57
diff -u -r1.57 Main.java
--- src/net/sf/statcvs/Main.java	1 Jan 2007 10:20:21 -0000	1.57
+++ src/net/sf/statcvs/Main.java	26 May 2008 17:13:46 -0000
@@ -112,6 +112,7 @@
 				+ "  -tags <regexp>     show matching tags in lines of code chart, e.g. version-.*\n"
 				+ "  -title <title>     set project title to be used in reports\n"
 				+ "  -xdoc              generate Maven XDoc instead of HTML\n"
+				+ "  -counter           SLOC counter class name\n"
 				+ "  -verbose           print extra progress information\n"
 				+ "  -viewcvs/viewvc/cvsweb/chora/jcvsweb/bugzilla/mantis <url>\n"
 				+ "                     add links to installation at <url>\n"
Index: src/net/sf/statcvs/input/Builder.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/src/net/sf/statcvs/input/Builder.java,v
retrieving revision 1.39
diff -u -r1.39 Builder.java
--- src/net/sf/statcvs/input/Builder.java	6 Apr 2007 16:53:43 -0000	1.39
+++ src/net/sf/statcvs/input/Builder.java	26 May 2008 17:13:46 -0000
@@ -40,6 +40,7 @@
 import net.sf.statcvs.model.Author;
 import net.sf.statcvs.model.Directory;
 import net.sf.statcvs.model.Repository;
+import net.sf.statcvs.model.SlocMetrics;
 import net.sf.statcvs.model.SymbolicName;
 import net.sf.statcvs.model.VersionedFile;
 import net.sf.statcvs.output.ConfigurationOptions;
@@ -306,7 +307,7 @@
         }
     }
     
-	public int getLOC(String filename) throws NoLineCountException {
+	public SlocMetrics getLOC(String filename) throws NoLineCountException {
 		if (repositoryFileManager == null) {
 			throw new NoLineCountException("no RepositoryFileManager");
 		}
Index: src/net/sf/statcvs/input/FileBuilder.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/src/net/sf/statcvs/input/FileBuilder.java,v
retrieving revision 1.17
diff -u -r1.17 FileBuilder.java
--- src/net/sf/statcvs/input/FileBuilder.java	9 Dec 2006 15:29:30 -0000	1.17
+++ src/net/sf/statcvs/input/FileBuilder.java	26 May 2008 17:13:46 -0000
@@ -32,6 +32,7 @@
 import java.util.TreeSet;
 import java.util.logging.Logger;
 
+import net.sf.statcvs.model.SlocMetrics;
 import net.sf.statcvs.model.VersionedFile;
 
 /**
@@ -136,16 +137,21 @@
 
 		Iterator it = revisions.iterator();
 		RevisionData currentData = (RevisionData) it.next();
-		int currentLOC = getFinalLOC();
+		SlocMetrics currentLOC = getFinalLOC();
 		RevisionData previousData;
-		int previousLOC;
+		SlocMetrics previousLOC;
         SortedSet symbolicNames;
 
+        // Iterate backwards in time through revisions
 		while (it.hasNext()) {
 			previousData = currentData;
 			previousLOC = currentLOC;
 			currentData = (RevisionData) it.next();
-			currentLOC = previousLOC - getLOCChange(previousData);
+			
+			if (previousLOC != null) {
+				int newRawLOC = previousLOC.getRawLines() - getLOCChange(previousData);
+				currentLOC = new SlocMetrics(newRawLOC);
+			}
 
             // symbolic names for previousData
             symbolicNames = createSymbolicNamesCollection(previousData);
@@ -167,15 +173,20 @@
         // symbolic names for currentData
         symbolicNames = createSymbolicNamesCollection(currentData); 
 
-		int nextLinesOfCode = currentLOC - getLOCChange(currentData);
+        SlocMetrics nextMetrics;
+        if (currentLOC == null) {
+        	nextMetrics = new SlocMetrics();
+        } else {
+        	nextMetrics = new SlocMetrics(currentLOC.getRawLines()- getLOCChange(currentData));
+        }
 		if (currentData.isCreation()) {
 			buildCreationRevision(file, currentData, currentLOC, symbolicNames);
 		} else if (currentData.isDeletion()) {
 			buildDeletionRevision(file, currentData, currentLOC, symbolicNames);
-			buildBeginOfLogRevision(file, beginOfLogDate, nextLinesOfCode, symbolicNames);
+			buildBeginOfLogRevision(file, beginOfLogDate, nextMetrics, symbolicNames);
 		} else if (currentData.isChangeOrRestore()) {
 			buildChangeRevision(file, currentData, currentLOC, symbolicNames);
-			buildBeginOfLogRevision(file, beginOfLogDate, nextLinesOfCode, symbolicNames);
+			buildBeginOfLogRevision(file, beginOfLogDate, nextMetrics, symbolicNames);
 		} else if (currentData.isAddOnSubbranch()) {
 			// ignore
 		} else {
@@ -205,11 +216,11 @@
 	 *  
 	 * @return the LOC count for the file's most recent revision.
 	 */
-	private int getFinalLOC() {
+	private SlocMetrics getFinalLOC() {
 		if (isBinary) {
-			return 0;
+			return null;
 		} else if (lastAdded != null && lastAdded.isAddOnSubbranch()) {
-			return locDelta;
+			return new SlocMetrics(locDelta);
 		}
 
 		String revision = null;
@@ -224,8 +235,9 @@
 		}
 			
 		try {
+			SlocMetrics loc = builder.getLOC(name);
 			if ("1.1".equals(revision)) {
-				return builder.getLOC(name) + locDelta;
+				loc.setRawLines(loc.getRawLines() + locDelta);
 			} else {
 				if (!revisions.isEmpty()) {
 					RevisionData firstAdded = (RevisionData)revisions.get(0);
@@ -237,8 +249,9 @@
 						this.flagUnexpectedLocalRevision = true;
 					}
 				}
-				return builder.getLOC(name);
+				
 			}
+			return loc;
 		} catch (NoLineCountException e) {
 			if (!finalRevisionIsDead()) {
 				logger.info("No line count for " + this.name);
@@ -269,7 +282,7 @@
 	 * 
 	 * @return a lower bound for the file's LOC before it was deleted
 	 */
-	private int approximateFinalLOC() {
+	private SlocMetrics approximateFinalLOC() {
 		int max = 0;
 		int current = 0;
 		Iterator it = revisions.iterator();
@@ -279,7 +292,7 @@
 			max = Math.max(current, max);
 			current -= data.getLinesRemoved();
 		}
-		return max;
+		return new SlocMetrics(max);
 	}	
 
 	/**
@@ -294,13 +307,13 @@
 		return data.getLinesAdded() - data.getLinesRemoved();
 	}
 
-	private void buildCreationRevision(VersionedFile file, RevisionData data, int loc, SortedSet symbolicNames) {
+	private void buildCreationRevision(VersionedFile file, RevisionData data, SlocMetrics loc, SortedSet symbolicNames) {
 		file.addInitialRevision(data.getRevisionNumber(),
 				builder.getAuthor(data.getLoginName()), data.getDate(),
 				data.getComment(), loc, symbolicNames);
 	}
 
-	private void buildChangeRevision(VersionedFile file, RevisionData data, int loc, SortedSet symbolicNames) {
+	private void buildChangeRevision(VersionedFile file, RevisionData data, SlocMetrics loc, SortedSet symbolicNames) {
 		file.addChangeRevision(data.getRevisionNumber(),
 				builder.getAuthor(data.getLoginName()), data.getDate(),
 				data.getComment(), loc,
@@ -308,13 +321,13 @@
 				Math.min(data.getLinesAdded(), data.getLinesRemoved()), symbolicNames);	
 	}
 
-	private void buildDeletionRevision(VersionedFile file, RevisionData data, int loc, SortedSet symbolicNames) {
+	private void buildDeletionRevision(VersionedFile file, RevisionData data, SlocMetrics loc, SortedSet symbolicNames) {
 		file.addDeletionRevision(data.getRevisionNumber(),
 				builder.getAuthor(data.getLoginName()), data.getDate(),
 				data.getComment(), loc, symbolicNames);
 	}
 
-	private void buildBeginOfLogRevision(VersionedFile file, Date beginOfLogDate, int loc, SortedSet symbolicNames) {
+	private void buildBeginOfLogRevision(VersionedFile file, Date beginOfLogDate, SlocMetrics loc, SortedSet symbolicNames) {
 		Date date = new Date(beginOfLogDate.getTime() - 60000);
 		file.addBeginOfLogRevision(date, loc, symbolicNames);
 	}
Index: src/net/sf/statcvs/input/RepositoryFileManager.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/src/net/sf/statcvs/input/RepositoryFileManager.java,v
retrieving revision 1.25
diff -u -r1.25 RepositoryFileManager.java
--- src/net/sf/statcvs/input/RepositoryFileManager.java	22 Nov 2006 16:29:46 -0000	1.25
+++ src/net/sf/statcvs/input/RepositoryFileManager.java	26 May 2008 17:13:46 -0000
@@ -2,7 +2,7 @@
     StatCvs - CVS statistics generation 
     Copyright (C) 2002  Lukasz Pekacki <lukasz@pekacki.de>
     http://statcvs.sf.net/
-    
+
     This library is free software; you can redistribute it and/or
     modify it under the terms of the GNU Lesser General Public
     License as published by the Free Software Foundation; either
@@ -16,10 +16,10 @@
     You should have received a copy of the GNU Lesser General Public
     License along with this library; if not, write to the Free Software
     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-    
+
 	$RCSfile: RepositoryFileManager.java,v $ 
 	Created on $Date: 2006/11/22 16:29:46 $ 
-*/
+ */
 package net.sf.statcvs.input;
 
 import java.io.BufferedReader;
@@ -29,6 +29,11 @@
 import java.util.StringTokenizer;
 import java.util.logging.Logger;
 
+import sun.reflect.generics.tree.SimpleClassTypeSignature;
+
+import net.sf.statcvs.model.SlocMetrics;
+import net.sf.statcvs.sloc.SimpleSlocCounter;
+import net.sf.statcvs.sloc.SlocCounterFactory;
 import net.sf.statcvs.util.FileUtils;
 
 /**
@@ -62,75 +67,64 @@
 	 * @throws NoLineCountException when the line count could not be retrieved,
 	 * for example when the file was not found.
 	 */
-	public int getLinesOfCode(String filename) throws NoLineCountException {
-        final String absoluteName = FileUtils.getAbsoluteName(this.path, filename);
-        try {
-			FileReader freader = new FileReader(absoluteName);
-			BufferedReader reader = new BufferedReader(freader);
-            int linecount = getLineCount(reader);
-            logger.finer("line count for '" + absoluteName
-					+ "': " + linecount);
-			freader.close();
-			return linecount;
-		} catch (IOException e) {
-			throw new NoLineCountException(
-					"could not get line count for '"
-					+ absoluteName + "': " + e);
+	public SlocMetrics getLinesOfCode(String filename) throws NoLineCountException {
+		final String absoluteName = FileUtils.getAbsoluteName(this.path, filename);
+		SlocMetrics linecount = SlocCounterFactory.getSlocCounter().countSloc(absoluteName);
+		SlocMetrics checkcount = new SimpleSlocCounter().countSloc(absoluteName);
+		if (linecount.getRawLines() != checkcount.getRawLines()) {
+			System.out.println("Descrepancy " + absoluteName);
+			System.out.println("--> LC " + linecount);
+			System.out.println("--> CC " + checkcount);
 		}
+		logger.finer("line count for '" + absoluteName
+				+ "': " + linecount);
+		return linecount;
 	}
 
-    private int getLineCount(BufferedReader reader) throws IOException {
-        int linecount = 0;
-        while (reader.readLine() != null) {
-            linecount++;
-        }
-        return linecount;
-    }
-
- 	/**
- 	 * Returns the revision of filename in the local working directory by 
- 	 * reading the CVS/Entries file.
- 	 * @param filename the filename
- 	 * @return the revision of filename
- 	 */
- 	public String getRevision(String filename) throws IOException {
- 		String rev = (String)revByFilename.get(filename);
- 		if (rev != null) {
- 			return rev;
- 		}
- 		
- 		String baseDir = FileUtils.getParentDirectoryPath(filename);
- 		String entriesFilename =  baseDir + "CVS" + FileUtils.getDefaultDirSeparator() + "Entries";
- 
- 		// read CVS/Entries file
- 		String absoluteName = FileUtils.getAbsoluteName(this.path, entriesFilename);
- 		BufferedReader in = new BufferedReader(new FileReader(absoluteName));
- 		try {
- 			String line;
- 			while ((line = in.readLine()) != null) {
- 				if (line.startsWith("D")) {
- 					// ignore, directory entry
- 				} else {
- 					// cache all entries
- 					StringTokenizer t = new StringTokenizer(line, "/");
- 					if (t.countTokens() >= 2) {
- 						revByFilename.put(baseDir + t.nextToken(), t.nextToken());
- 					} else {
- 						// invalid entry
- 					}
- 				}
- 			}
- 			
- 			rev = (String)revByFilename.get(filename);
- 			if (rev != null) {
- 				return rev;
- 			} else {
- 				throw new IOException("File " + filename  + " has no revision");
- 			}
- 		} 
- 		finally {
- 			in.close();
- 		}
- 	}
+	/**
+	 * Returns the revision of filename in the local working directory by 
+	 * reading the CVS/Entries file.
+	 * @param filename the filename
+	 * @return the revision of filename
+	 */
+	public String getRevision(String filename) throws IOException {
+		String rev = (String)revByFilename.get(filename);
+		if (rev != null) {
+			return rev;
+		}
+
+		String baseDir = FileUtils.getParentDirectoryPath(filename);
+		String entriesFilename =  baseDir + "CVS" + FileUtils.getDefaultDirSeparator() + "Entries";
+
+		// read CVS/Entries file
+		String absoluteName = FileUtils.getAbsoluteName(this.path, entriesFilename);
+		BufferedReader in = new BufferedReader(new FileReader(absoluteName));
+		try {
+			String line;
+			while ((line = in.readLine()) != null) {
+				if (line.startsWith("D")) {
+					// ignore, directory entry
+				} else {
+					// cache all entries
+					StringTokenizer t = new StringTokenizer(line, "/");
+					if (t.countTokens() >= 2) {
+						revByFilename.put(baseDir + t.nextToken(), t.nextToken());
+					} else {
+						// invalid entry
+					}
+				}
+			}
+
+			rev = (String)revByFilename.get(filename);
+			if (rev != null) {
+				return rev;
+			} else {
+				throw new IOException("File " + filename  + " has no revision");
+			}
+		} 
+		finally {
+			in.close();
+		}
+	}
 
 }
Index: src/net/sf/statcvs/model/Directory.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/src/net/sf/statcvs/model/Directory.java,v
retrieving revision 1.10
diff -u -r1.10 Directory.java
--- src/net/sf/statcvs/model/Directory.java	22 Nov 2006 16:29:45 -0000	1.10
+++ src/net/sf/statcvs/model/Directory.java	26 May 2008 17:13:46 -0000
@@ -143,6 +143,8 @@
 	/**
 	 * Returns the number of lines in this directory. The returned number
 	 * will be for the current revisions of all files.
+	 * 
+	 * @deprecated Use {@link #getCurrentSlocMetrics()} instead.
 	 * @return lines in this directory
 	 */
 	public int getCurrentLOC() {
@@ -154,6 +156,22 @@
 		}
 		return result;
 	}
+	
+	/**
+	 * Returns the SlocMetrics in this directory. The returned metrics
+	 * will be for the current revisions of all files.
+	 *
+	 * @return metrics for this directory
+	 */
+	public SlocMetrics getCurrentSlocMetrics() {
+		SlocMetrics result = new SlocMetrics();
+		Iterator it = files.iterator();
+		while (it.hasNext()) {
+			VersionedFile file = (VersionedFile) it.next();
+			result.concat(file.getCurrentSlocMetrics());
+		}
+		return result;
+	}
 
 	/**
 	 * Returns the number of files in this directory. Deleted files are not
Index: src/net/sf/statcvs/model/Repository.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/src/net/sf/statcvs/model/Repository.java,v
retrieving revision 1.2
diff -u -r1.2 Repository.java
--- src/net/sf/statcvs/model/Repository.java	8 Dec 2006 21:15:15 -0000	1.2
+++ src/net/sf/statcvs/model/Repository.java	26 May 2008 17:13:46 -0000
@@ -114,6 +114,8 @@
 
 	/**
 	 * returns the current line count of the repository
+	 * 
+	 * @deprecated Use {@link #getCurrentSlocMetrics()} instead
 	 * @return the current line count of the repository
 	 */
 	public int getCurrentLOC() {
@@ -127,6 +129,24 @@
 	}
 
 	/**
+	 * Returns the SlocMetrics in this directory. The returned metrics
+	 * will be for the current revisions of all files.
+	 *
+	 * @return metrics for this directory
+	 */
+	public SlocMetrics getCurrentSlocMetrics() {
+		SlocMetrics result = new SlocMetrics();
+		Iterator it = files.iterator();
+		while (it.hasNext()) {
+			VersionedFile file = (VersionedFile) it.next();
+			if (file.getCurrentSlocMetrics() != null) {
+				result.concat(file.getCurrentSlocMetrics());
+			}
+		}
+		return result;
+	}
+	
+	/**
 	 * Returns a list of all {@link VersionedFile}s, ordered by full name
 	 * @return a list of all {@link VersionedFile}s
 	 */
Index: src/net/sf/statcvs/model/Revision.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/src/net/sf/statcvs/model/Revision.java,v
retrieving revision 1.1
diff -u -r1.1 Revision.java
--- src/net/sf/statcvs/model/Revision.java	22 Nov 2006 16:29:45 -0000	1.1
+++ src/net/sf/statcvs/model/Revision.java	26 May 2008 17:13:46 -0000
@@ -26,6 +26,8 @@
 import java.util.Iterator;
 import java.util.SortedSet;
 
+import com.sun.swing.internal.plaf.metal.resources.metal;
+
 /**
  * One revision of a {@link VersionedFile}. That can be an initial revision
  * (checkin), a change, a deletion, or a re-add. Revisions are created
@@ -75,9 +77,10 @@
 	private final Author author;
 	private final Date date;
 	private final String comment;
-	private final int lines;
 	private final int linesReplaced;
 	private final int linesDelta;
+	
+	private final SlocMetrics slocMetrics;
 
 	private SortedSet symbolicNames;
 
@@ -98,14 +101,14 @@
 	 * @param symbolicNames list of symbolic names for this revision or null if this revision has no symbolic names	 
  	 */
 	public Revision(VersionedFile file, String revisionNumber, int type,
-			Author author, Date date, String comment, int lines, int linesDelta, int linesReplaced, SortedSet symbolicNames) {
+			Author author, Date date, String comment, SlocMetrics slocMetrics, int linesDelta, int linesReplaced, SortedSet symbolicNames) {
 		this.file = file;
 		this.revisionNumber = revisionNumber;
 		this.type = type;
 		this.author = author;
 		this.date = date;
 		this.comment = comment;
-		this.lines = lines;
+		this.slocMetrics = slocMetrics;
 		this.linesDelta = linesDelta;
 		this.linesReplaced = linesReplaced;
 		this.symbolicNames = symbolicNames;
@@ -158,13 +161,30 @@
 	 * Returns the number of lines for this revision. This is 0 for
 	 * dead revisions.
 	 * 
+	 * Prefers to use physical or logical line counts, but will
+	 * return non-blank - comments as a fallback.
+	 * 
+	 * If both physical and logical counts are supported it will
+	 * report physical
+	 * 
 	 * @return the number of lines
 	 */
 	public int getLines() {
-		return lines;
+		if (slocMetrics == null) return 0;
+		return slocMetrics.getNonBlankLines();
 	}
 
 	/**
+	 * Return the sloc metrics for this revision.  This is null for
+	 * dead revisions.
+	 * 
+	 * @return
+	 */
+	public SlocMetrics getSlocMetrics() {
+		return slocMetrics;
+	}
+	
+	/**
 	 * Returns by how many lines the line count changed with this
 	 * revision. Deletions return <code>-getLines()</code>,
 	 * re-adds and initial revisions return <code>getLines()</code>.
Index: src/net/sf/statcvs/model/VersionedFile.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/src/net/sf/statcvs/model/VersionedFile.java,v
retrieving revision 1.1
diff -u -r1.1 VersionedFile.java
--- src/net/sf/statcvs/model/VersionedFile.java	22 Nov 2006 16:29:45 -0000	1.1
+++ src/net/sf/statcvs/model/VersionedFile.java	26 May 2008 17:13:46 -0000
@@ -118,6 +118,9 @@
 	/**
 	 * Returns the current number of lines for this file. Binary files
 	 * and deleted files are assumed to have 0 lines.
+	 * 
+	 * @deprecated Use {@link #getCurrentSlocMetrics()} instead.
+	 * 
 	 * @return the current number of lines for this file
 	 */
 	public int getCurrentLinesOfCode() {
@@ -125,6 +128,16 @@
 	}
 	
 	/**
+	 * Returns the SLOC metrics for this file. Binary files
+	 * and deleted files are assumed to have null metrics.
+	 * 
+	 * @return the current sloc metrics for this file
+	 */
+	public SlocMetrics getCurrentSlocMetrics() {
+		return getLatestRevision().getSlocMetrics();
+	}
+	
+	/**
 	 * Returns <code>true</code> if the latest revision of this file was
 	 * a deletion.
 	 * @return <code>true</code> if this file is deleted
@@ -187,10 +200,13 @@
 	 * @param lines the number of lines of the new file
 	 */
 	public Revision addInitialRevision(String revisionNumber, Author author,
-									Date date, String comment, int lines, SortedSet symbolicNames) {
+									Date date, String comment, SlocMetrics metrics, SortedSet symbolicNames) {
+		int linesDelta = 0;
+		if (metrics != null) linesDelta = metrics.getRawLines();
+		
 		Revision result = new Revision(this, revisionNumber,
 				Revision.TYPE_CREATION, author, date, comment,
-				lines, lines, 0, symbolicNames);
+				metrics, linesDelta, 0, symbolicNames);
 		addRevision(result);
 		return result;
 	}
@@ -206,11 +222,11 @@
 	 * @param replacedLines number of lines that were removed and replaced by others
 	 */
 	public Revision addChangeRevision(String revisionNumber, Author author,
-								  Date date, String comment, int lines,
+								  Date date, String comment, SlocMetrics metrics,
 								  int linesDelta, int replacedLines, SortedSet symbolicNames) {
 		Revision result = new Revision(this, revisionNumber,
 				Revision.TYPE_CHANGE, author, date, comment,
-				lines, linesDelta, replacedLines, symbolicNames);
+				metrics, linesDelta, replacedLines, symbolicNames);
 		addRevision(result);
 		return result;
 	}
@@ -224,10 +240,14 @@
 	 * @param lines the number of lines in the file before it was deleted
 	 */
 	public Revision addDeletionRevision(String revisionNumber, Author author,
-									Date date, String comment, int lines, SortedSet symbolicNames) {
+									Date date, String comment, SlocMetrics metrics, SortedSet symbolicNames) {
+		int linesDelta = 0;
+		if (metrics != null) {
+			linesDelta = -1*metrics.getRawLines();
+		}
 		Revision result = new Revision(this, revisionNumber,
 				Revision.TYPE_DELETION, author, date, comment,
-				0, -lines, 0, symbolicNames);
+				null, linesDelta, 0, symbolicNames);
 		addRevision(result);
 		return result;
 	}
@@ -240,10 +260,10 @@
 	 * @param date the begin of the log
 	 * @param lines the number of lines in the file at that time
 	 */
-	public Revision addBeginOfLogRevision(Date date, int lines, SortedSet symbolicNames) {
+	public Revision addBeginOfLogRevision(Date date, SlocMetrics metrics, SortedSet symbolicNames) {
 		Revision result = new Revision(this, "0.0",
 				Revision.TYPE_BEGIN_OF_LOG, null, date, null,
-				lines, 0, 0, symbolicNames);
+				metrics, 0, 0, symbolicNames);
 		addRevision(result);
 		return result;
 	}
Index: src/net/sf/statcvs/output/CommandLineParser.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/src/net/sf/statcvs/output/CommandLineParser.java,v
retrieving revision 1.23
diff -u -r1.23 CommandLineParser.java
--- src/net/sf/statcvs/output/CommandLineParser.java	6 Apr 2007 16:53:44 -0000	1.23
+++ src/net/sf/statcvs/output/CommandLineParser.java	26 May 2008 17:13:46 -0000
@@ -176,6 +176,11 @@
 				throw new ConfigurationException("Missing argument for -no-developer");
 			}
 			ConfigurationOptions.addNonDeveloperLogin(popNextArg());
+		} else if (s.equals("counter")) {
+			if (args.isEmpty()) {
+				throw new ConfigurationException("Missing argument for -no-developer");
+			}
+			ConfigurationOptions.setSlocCounterClass(popNextArg());
 		} else if (!doChildrenSwitch(s)){
 			throw new ConfigurationException("Unrecognized option -" + s);
 		}
Index: src/net/sf/statcvs/output/ConfigurationOptions.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/src/net/sf/statcvs/output/ConfigurationOptions.java,v
retrieving revision 1.29
diff -u -r1.29 ConfigurationOptions.java
--- src/net/sf/statcvs/output/ConfigurationOptions.java	9 Apr 2007 10:31:42 -0000	1.29
+++ src/net/sf/statcvs/output/ConfigurationOptions.java	26 May 2008 17:13:46 -0000
@@ -67,7 +67,8 @@
 	private static String loggingProperties = LOGGING_CONFIG_DEFAULT;
 	private static String notesFile = null;
 	private static String notes = null;
-
+	private static String slocCounterClass = null;
+	
 	private static FilePatternMatcher includePattern = null;
 	private static FilePatternMatcher excludePattern = null;
 
@@ -81,6 +82,7 @@
     private static String outputFormat = "html";
 	private static Properties properties = new Properties();
 	
+	
 	/**
 	 * returns the {@link CssHandler}
 	 * @return the CssHandler
@@ -130,6 +132,10 @@
 		return notes;
 	}
 
+	public static String getSlocCounterClass() {
+		return slocCounterClass;
+	}
+	
 	/**
 	 * Returns a {@link WebRepositoryIntegration} object if the user
 	 * has specified a URL to one. <tt>null</tt> otherwise.
@@ -236,6 +242,10 @@
 		}
 	}
 
+	public static void setSlocCounterClass(String slocCounterClass) {
+		ConfigurationOptions.slocCounterClass = slocCounterClass;
+	}
+	
 	/**
 	 * Sets the URL to a <a href="http://viewcvs.sourceforge.net/">ViewCVS</a>
 	 * web-based CVS browser. This must be the URL at which the checked-out
Index: src/net/sf/statcvs/pages/DirectoryPageMaker.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/src/net/sf/statcvs/pages/DirectoryPageMaker.java,v
retrieving revision 1.8
diff -u -r1.8 DirectoryPageMaker.java
--- src/net/sf/statcvs/pages/DirectoryPageMaker.java	9 Dec 2006 14:22:54 -0000	1.8
+++ src/net/sf/statcvs/pages/DirectoryPageMaker.java	26 May 2008 17:13:46 -0000
@@ -14,6 +14,7 @@
 import net.sf.statcvs.model.Directory;
 import net.sf.statcvs.model.Repository;
 import net.sf.statcvs.model.Revision;
+import net.sf.statcvs.model.SlocMetrics;
 import net.sf.statcvs.model.VersionedFile;
 import net.sf.statcvs.output.ReportConfig;
 import net.sf.statcvs.output.WebRepositoryIntegration;
@@ -120,6 +121,9 @@
 		return commits;
 	}
 	
+	/**
+	 * @deprecated Use {@link #getCurrentSlocMetrics()} instead.
+	 */
 	private int getCurrentLOC() {
 		int result = 0;
 		Iterator it = this.directory.getFiles().iterator();
@@ -130,6 +134,16 @@
 		return result;
 	}
 
+	public SlocMetrics getCurrentSlocMetrics() {
+		SlocMetrics result = new SlocMetrics();
+		Iterator it = this.directory.getFiles().iterator();
+		while (it.hasNext()) {
+			VersionedFile file = (VersionedFile) it.next();
+			result.concat(file.getCurrentSlocMetrics());
+		}
+		return result;
+	}
+	
 	private int getCurrentFileCount() {
 		int result = 0;
 		Iterator it = this.directory.getFiles().iterator();
Index: src/net/sf/statcvs/pages/IndexPageMaker.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/src/net/sf/statcvs/pages/IndexPageMaker.java,v
retrieving revision 1.5
diff -u -r1.5 IndexPageMaker.java
--- src/net/sf/statcvs/pages/IndexPageMaker.java	9 Dec 2006 14:22:53 -0000	1.5
+++ src/net/sf/statcvs/pages/IndexPageMaker.java	26 May 2008 17:13:46 -0000
@@ -1,16 +1,20 @@
 package net.sf.statcvs.pages;
 
+import java.text.DecimalFormat;
 import java.util.Calendar;
+import java.util.Formatter;
 import java.util.Iterator;
 
 import net.sf.statcvs.Messages;
 import net.sf.statcvs.charts.ChartImage;
 import net.sf.statcvs.charts.LOCChartMaker.MainLOCChartMaker;
 import net.sf.statcvs.model.Repository;
+import net.sf.statcvs.model.SlocMetrics;
 import net.sf.statcvs.model.VersionedFile;
 import net.sf.statcvs.output.ReportConfig;
 import net.sf.statcvs.reports.TagReport;
 import net.sf.statcvs.reports.TopDevelopersTableReport;
+import net.sf.statcvs.sloc.SlocCounterFactory;
 
 /**
  * @author anja
@@ -22,6 +26,7 @@
 	private Repository repository;
 	private String notesHTML;
 	private PageGroup reports;
+	
 
 	/**
 	 * Creates a new report index page.
@@ -47,7 +52,27 @@
 		page.addAttribute("Generated", Calendar.getInstance().getTime());
 		page.addRawAttribute("Report Period", getReportPeriod());
 		page.addAttribute("Total Files", getCurrentFileCount());
-		page.addAttribute("Total Lines of Code", this.repository.getCurrentLOC());
+		SlocMetrics metrics = this.repository.getCurrentSlocMetrics();
+		if (metrics != null) {
+			page.addRawAttribute("SLOC Counter", SlocCounterFactory.getSlocCounter().getName());
+			page.addAttribute("Total Raw Lines", metrics.getRawLines());
+			page.addAttribute("Total Non-Blank Lines", metrics.getNonBlankLines());
+			if (metrics.getPhysicalSloc() != null) {
+				page.addAttribute("Total Physical Lines of Code", metrics.getPhysicalSloc().intValue());
+			}
+			if (metrics.getLogicalSloc() != null) {
+				page.addAttribute("Total Logical Lines of Code", metrics.getLogicalSloc().intValue());
+			}
+			if (metrics.getCommentLines() != null) {
+				page.addAttribute("Total Comment Lines", metrics.getCommentLines().intValue());
+			}
+			if (metrics.getOtherLines() != null) {
+				page.addAttribute("Total Other Lines", metrics.getOtherLines().intValue());
+			}
+			
+		} else {
+			page.addRawContent("No SLOC Metrics available for this repository");
+		}
 		page.addAttribute("Developers", topDevelopers.getDeveloperCount());
 		if (this.notesHTML != null) {
 			page.addRawContent(this.notesHTML);
Index: tests-src/net/sf/statcvs/input/CommitListBuilderTest.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/tests-src/net/sf/statcvs/input/CommitListBuilderTest.java,v
retrieving revision 1.9
diff -u -r1.9 CommitListBuilderTest.java
--- tests-src/net/sf/statcvs/input/CommitListBuilderTest.java	22 Nov 2006 16:29:45 -0000	1.9
+++ tests-src/net/sf/statcvs/input/CommitListBuilderTest.java	26 May 2008 17:13:46 -0000
@@ -183,7 +183,7 @@
 	}
 
 	private Revision createRevision(VersionedFile file, String revision, long time, Author author, String message) {
-		return file.addChangeRevision(revision, author, new Date(time), message, 0, 0, 0, null);
+		return file.addChangeRevision(revision, author, new Date(time), message, null, 0, 0, null);
 	}
 
 	private void runBuilder(Revision[] revisions) {
Index: tests-src/net/sf/statcvs/input/DummyBuilder.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/tests-src/net/sf/statcvs/input/DummyBuilder.java,v
retrieving revision 1.4
diff -u -r1.4 DummyBuilder.java
--- tests-src/net/sf/statcvs/input/DummyBuilder.java	9 Dec 2006 14:24:08 -0000	1.4
+++ tests-src/net/sf/statcvs/input/DummyBuilder.java	26 May 2008 17:13:46 -0000
@@ -21,6 +21,7 @@
 
 import net.sf.statcvs.model.Author;
 import net.sf.statcvs.model.Directory;
+import net.sf.statcvs.model.SlocMetrics;
 
 /**
  * Test dummy of {@link Builder} for use in
@@ -76,17 +77,17 @@
 	/* (non-Javadoc)
 	 * @see net.sf.statcvs.input.Builder#getLOC(java.lang.String)
 	 */
-	public int getLOC(String filename) throws NoLineCountException {
-		if ("file".equals(filename)) {
-			return 100;
+	public SlocMetrics getLOC(String filename) throws NoLineCountException {
+		if ("file".equals(filename)) {			
+			return new SlocMetrics(100);
 		} else if ("nolinecount".equals(filename)) {
 			throw new NoLineCountException();
 		} else if ("dir1/file".equals(filename)) {
-			return 10;
+			return new SlocMetrics(10);
 		} else if ("dir2/file".equals(filename)) {
-			return 20;
+			return new SlocMetrics(20);
 		} else if ("dir1/subdir/file".equals(filename)) {
-			return 500;
+			return new SlocMetrics(500);
 		}
 		throw new IllegalArgumentException(filename);
 	}
Index: tests-src/net/sf/statcvs/input/DummyRepositoryFileManager.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/tests-src/net/sf/statcvs/input/DummyRepositoryFileManager.java,v
retrieving revision 1.1
diff -u -r1.1 DummyRepositoryFileManager.java
--- tests-src/net/sf/statcvs/input/DummyRepositoryFileManager.java	17 Feb 2004 18:37:15 -0000	1.1
+++ tests-src/net/sf/statcvs/input/DummyRepositoryFileManager.java	26 May 2008 17:13:46 -0000
@@ -24,6 +24,8 @@
 
 import java.util.HashMap;
 
+import net.sf.statcvs.model.SlocMetrics;
+
 /**
  * Dummy <tt>RepositoryFileManager</tt> for unit tests
  * 
@@ -53,9 +55,9 @@
 	/**
 	 * @see net.sf.statcvs.input.RepositoryFileManager#getLinesOfCode(String)
 	 */
-	public int getLinesOfCode(String filename) throws NoLineCountException {
+	public SlocMetrics getLinesOfCode(String filename) throws NoLineCountException {
 		if (linesForFile.containsKey(filename)) {
-			return ((Integer) linesForFile.get(filename)).intValue();
+			return new SlocMetrics(((Integer) linesForFile.get(filename)).intValue());
 		}
 		throw new NoLineCountException();
 	}
Index: tests-src/net/sf/statcvs/model/AuthorTest.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/tests-src/net/sf/statcvs/model/AuthorTest.java,v
retrieving revision 1.7
diff -u -r1.7 AuthorTest.java
--- tests-src/net/sf/statcvs/model/AuthorTest.java	22 Nov 2006 16:29:46 -0000	1.7
+++ tests-src/net/sf/statcvs/model/AuthorTest.java	26 May 2008 17:13:46 -0000
@@ -70,11 +70,11 @@
 		VersionedFile file2 = new VersionedFile("dir2/file", dir2);
 		VersionedFile file3 = new VersionedFile("dir3/file", dir3);
 		VersionedFile file4 = new VersionedFile("dir1/subdir/file", dir1subdir);
-		new Revision(file1, "1.1", Revision.TYPE_CREATION, author2, date, null, 0, 0, 0, null);
-		new Revision(file2, "1.2", Revision.TYPE_CHANGE, author1, date, null, 0, 0, 0, null);
-		new Revision(file2, "1.1", Revision.TYPE_CREATION, author1, date, null, 0, 0, 0, null);
-		new Revision(file3, "1.1", Revision.TYPE_CREATION, author2, date, null, 0, 0, 0, null);
-		new Revision(file4, "1.1", Revision.TYPE_CREATION, author1, date, null, 0, 0, 0, null);
+		new Revision(file1, "1.1", Revision.TYPE_CREATION, author2, date, null, null, 0, 0, null);
+		new Revision(file2, "1.2", Revision.TYPE_CHANGE, author1, date, null, null, 0, 0, null);
+		new Revision(file2, "1.1", Revision.TYPE_CREATION, author1, date, null, null, 0, 0, null);
+		new Revision(file3, "1.1", Revision.TYPE_CREATION, author2, date, null, null, 0, 0, null);
+		new Revision(file4, "1.1", Revision.TYPE_CREATION, author1, date, null, null, 0, 0, null);
 		assertTrue(author1.getDirectories().contains(dir2));
 		assertTrue(author1.getDirectories().contains(dir1subdir));
 		assertEquals(2, author1.getDirectories().size());
@@ -91,10 +91,10 @@
 		Date date3 = new Date(300000000);
 		VersionedFile file1 = new VersionedFile("file1", root);
 		VersionedFile file2 = new VersionedFile("file2", root);
-		Revision rev13 = new Revision(file1, "1.3", Revision.TYPE_CHANGE, author, date3, null, 0, 0, 0, null);
-		Revision rev12 = new Revision(file1, "1.2", Revision.TYPE_CHANGE, author, date2, null, 0, 0, 0, null);
-		Revision rev11 = new Revision(file1, "1.1", Revision.TYPE_CREATION, author, date1, null, 0, 0, 0, null);
-		Revision rev21 = new Revision(file2, "1.1", Revision.TYPE_CREATION, author, date2, null, 0, 0, 0, null);
+		Revision rev13 = new Revision(file1, "1.3", Revision.TYPE_CHANGE, author, date3, null, null, 0, 0, null);
+		Revision rev12 = new Revision(file1, "1.2", Revision.TYPE_CHANGE, author, date2, null, null, 0, 0, null);
+		Revision rev11 = new Revision(file1, "1.1", Revision.TYPE_CREATION, author, date1, null, null, 0, 0, null);
+		Revision rev21 = new Revision(file2, "1.1", Revision.TYPE_CREATION, author, date2, null, null, 0, 0, null);
 		Iterator it = author.getRevisions().iterator();
 		assertTrue(it.hasNext());
 		assertSame(rev11, it.next());
Index: tests-src/net/sf/statcvs/model/CommitTest.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/tests-src/net/sf/statcvs/model/CommitTest.java,v
retrieving revision 1.19
diff -u -r1.19 CommitTest.java
--- tests-src/net/sf/statcvs/model/CommitTest.java	22 Nov 2006 16:29:46 -0000	1.19
+++ tests-src/net/sf/statcvs/model/CommitTest.java	26 May 2008 17:13:46 -0000
@@ -150,6 +150,6 @@
 	}
 
 	private Revision createRevision(VersionedFile file, String revision, long time, Author author, String message) {
-		return new Revision(file, revision, Revision.TYPE_CHANGE, author, new Date(time), message, 0, 0, 0, null);
+		return new Revision(file, revision, Revision.TYPE_CHANGE, author, new Date(time), message, null, 0, 0, null);
 	}
 }
Index: tests-src/net/sf/statcvs/model/CvsContentTest.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/tests-src/net/sf/statcvs/model/CvsContentTest.java,v
retrieving revision 1.30
diff -u -r1.30 CvsContentTest.java
--- tests-src/net/sf/statcvs/model/CvsContentTest.java	8 Dec 2006 21:21:44 -0000	1.30
+++ tests-src/net/sf/statcvs/model/CvsContentTest.java	26 May 2008 17:13:46 -0000
@@ -68,17 +68,17 @@
 	 */
 	public void testGetDirectories() {
 		VersionedFile file1 = new VersionedFile("test/test1.java", dirTest);
-		file1.addInitialRevision("1.1", tester1, date, null, 0, null);
+		file1.addInitialRevision("1.1", tester1, date, null, null, null);
 		VersionedFile file2 = new VersionedFile("test2.java", dirRoot);
-		file2.addInitialRevision("1.1", tester1, date, null, 0, null);
+		file2.addInitialRevision("1.1", tester1, date, null, null, null);
 		VersionedFile file3 = new VersionedFile("test1/test3.java", dirTest1);
-		file3.addInitialRevision("1.1", tester1, date, null, 0, null);
+		file3.addInitialRevision("1.1", tester1, date, null, null, null);
 		VersionedFile file4 = new VersionedFile("test/test2.java", dirTest);
-		file4.addInitialRevision("1.1", tester1, date, null, 0, null);
+		file4.addInitialRevision("1.1", tester1, date, null, null, null);
 		VersionedFile file5 = new VersionedFile("test1/test1.java", dirTest1);
-		file5.addInitialRevision("1.1", tester1, date, null, 0, null);
+		file5.addInitialRevision("1.1", tester1, date, null, null, null);
 		VersionedFile file6 = new VersionedFile("test/test3.java", dirTest);
-		file6.addInitialRevision("1.1", tester1, date, null, 0, null);
+		file6.addInitialRevision("1.1", tester1, date, null, null, null);
 
 		Repository content = new Repository();
 		content.addFile(file1);
@@ -101,23 +101,23 @@
 	 */
 	public void testGetDirectoriesPerUser() {
 		VersionedFile file1 = new VersionedFile("test/test1.java", dirTest);
-		file1.addChangeRevision("1.2", tester1, date, null, 0, 0, 0, null);
-		file1.addInitialRevision("1.1", tester2, date, null, 0, null);
+		file1.addChangeRevision("1.2", tester1, date, null, null, 0, 0, null);
+		file1.addInitialRevision("1.1", tester2, date, null, null, null);
 		VersionedFile file2 = new VersionedFile("test2.java", dirRoot);
-		file2.addChangeRevision("2.3", tester1, date, null, 0, 0, 0, null);
-		file2.addChangeRevision("2.2", tester1, date, null, 0, 0, 0, null);
-		file2.addInitialRevision("2.1", tester3, date, null, 0, null);
+		file2.addChangeRevision("2.3", tester1, date, null, null, 0, 0, null);
+		file2.addChangeRevision("2.2", tester1, date, null, null, 0, 0, null);
+		file2.addInitialRevision("2.1", tester3, date, null, null, null);
 		VersionedFile file3 = new VersionedFile("test1/test3.java", dirTest1);
-		file3.addInitialRevision("3.1", tester2, date, null, 0, null);
+		file3.addInitialRevision("3.1", tester2, date, null, null, null);
 		VersionedFile file4 = new VersionedFile("test/test2.java", dirTest);
-		file4.addInitialRevision("4.1", tester2, date, null, 0, null);
+		file4.addInitialRevision("4.1", tester2, date, null, null, null);
 		VersionedFile file5 = new VersionedFile("test1/test1.java", dirTest1);
-		file5.addChangeRevision("5.3", tester2, date, null, 0, 0, 0, null);
-		file5.addChangeRevision("5.2", tester2, date, null, 0, 0, 0, null);
-		file5.addInitialRevision("5.1", tester2, date, null, 0, null);
+		file5.addChangeRevision("5.3", tester2, date, null, null, 0, 0, null);
+		file5.addChangeRevision("5.2", tester2, date, null, null, 0, 0, null);
+		file5.addInitialRevision("5.1", tester2, date, null, null, null);
 		VersionedFile file6 = new VersionedFile("test/test3.java", dirTest);
-		file6.addChangeRevision("6.2", tester1, date, null, 0, 0, 0, null);
-		file6.addInitialRevision("6.1", tester3, date, null, 0, null);
+		file6.addChangeRevision("6.2", tester1, date, null, null, 0, 0, null);
+		file6.addInitialRevision("6.1", tester3, date, null, null, null);
 
 
 		Repository content = new Repository();
@@ -149,17 +149,17 @@
 	 */
 	public void testUserNames() {
 		VersionedFile file1 = new VersionedFile("test/Burg.java", dirTest);
-		file1.addChangeRevision("1.3", tester1, date, null, 0, 0, 0, null);
-		file1.addChangeRevision("1.2", tester2, date, null, 0, 0, 0, null);
-		file1.addInitialRevision("1.1", tester1, date, null, 0, null);
+		file1.addChangeRevision("1.3", tester1, date, null, null, 0, 0, null);
+		file1.addChangeRevision("1.2", tester2, date, null, null, 0, 0, null);
+		file1.addInitialRevision("1.1", tester1, date, null, null, null);
 		VersionedFile file2 = new VersionedFile("test/History.java", dirTest);
-		file2.addChangeRevision("2.2", tester3, date, null, 0, 0, 0, null);
-		file2.addInitialRevision("2.1", tester4, date, null, 0, null);
+		file2.addChangeRevision("2.2", tester3, date, null, null, 0, 0, null);
+		file2.addInitialRevision("2.1", tester4, date, null, null, null);
 		VersionedFile file3 = new VersionedFile("test/Spieler.java", dirTest);
-		file3.addChangeRevision("3.4", tester2, date, null, 0, 0, 0, null);
-		file3.addChangeRevision("3.3", tester4, date, null, 0, 0, 0, null);
-		file3.addChangeRevision("3.2", tester1, date, null, 0, 0, 0, null);
-		file3.addInitialRevision("3.1", tester2, date, null, 0, null);
+		file3.addChangeRevision("3.4", tester2, date, null, null, 0, 0, null);
+		file3.addChangeRevision("3.3", tester4, date, null, null, 0, 0, null);
+		file3.addChangeRevision("3.2", tester1, date, null, null, 0, 0, null);
+		file3.addInitialRevision("3.1", tester2, date, null, null, null);
 		Repository content = new Repository();
 		content.addFile(file1);
 		content.addFile(file2);
@@ -174,7 +174,7 @@
 	 */
 	public void testIgnoreNullAuthor() {
 		VersionedFile file = new VersionedFile("test/file", dirTest);
-		file.addInitialRevision("0.0", null, date, null, 0, null);
+		file.addInitialRevision("0.0", null, date, null, null, null);
 		Repository content = new Repository();
 		content.addFile(file);
 
Index: tests-src/net/sf/statcvs/model/CvsFileTest.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/tests-src/net/sf/statcvs/model/CvsFileTest.java,v
retrieving revision 1.25
diff -u -r1.25 CvsFileTest.java
--- tests-src/net/sf/statcvs/model/CvsFileTest.java	22 Nov 2006 16:29:46 -0000	1.25
+++ tests-src/net/sf/statcvs/model/CvsFileTest.java	26 May 2008 17:13:46 -0000
@@ -64,7 +64,7 @@
 	 */
 	public void testCreation() {
 		VersionedFile file = new VersionedFile("file", dirRoot);
-		Revision rev1 = file.addInitialRevision("1.1", author, date1, "message", 0, null);
+		Revision rev1 = file.addInitialRevision("1.1", author, date1, "message", null, null);
 		assertEquals("file", file.getFilenameWithPath());
 		assertEquals(1, file.getRevisions().size());
 		assertSame(rev1, file.getLatestRevision());
@@ -78,9 +78,9 @@
 	 */
 	public void testMultipleRevisions() {
 		VersionedFile file = new VersionedFile("file", dirRoot);
-		Revision rev1 = file.addInitialRevision("1.1", author, date1, "message1", 0, null);
-		Revision rev2 = file.addChangeRevision("1.2", author, date2, "message2", 0, 0, 0, null);
-		Revision rev3 = file.addChangeRevision("1.3", author, date3, "message3", 0, 0, 0, null);
+		Revision rev1 = file.addInitialRevision("1.1", author, date1, "message1", null, null);
+		Revision rev2 = file.addChangeRevision("1.2", author, date2, "message2", null, 0, 0, null);
+		Revision rev3 = file.addChangeRevision("1.3", author, date3, "message3", null, 0, 0, null);
 		Iterator revIt = file.getRevisions().iterator();
 		assertEquals(rev1, revIt.next());
 		assertEquals(rev2, revIt.next());
@@ -99,9 +99,9 @@
 	 */
 	public void testMultipleRevisionsAnyOrder() {
 		VersionedFile file = new VersionedFile("file", dirRoot);
-		Revision rev2 = file.addChangeRevision("1.2", author, date2, null, 0, 0, 0, null);
-		Revision rev3 = file.addDeletionRevision("1.3", author, date3, null, 0, null);
-		Revision rev1 = file.addInitialRevision("1.1", author, date1, null, 0, null);
+		Revision rev2 = file.addChangeRevision("1.2", author, date2, null, null, 0, 0, null);
+		Revision rev3 = file.addDeletionRevision("1.3", author, date3, null, null, null);
+		Revision rev1 = file.addInitialRevision("1.1", author, date1, null, null, null);
 		Iterator revIt = file.getRevisions().iterator();
 		assertEquals(rev1, revIt.next());
 		assertEquals(rev2, revIt.next());
@@ -114,7 +114,7 @@
 	 */
 	public void testDirectories() {
 		VersionedFile file1 = new VersionedFile("rootfile.file", dirRoot);
-		file1.addInitialRevision("1.1", author, date1, null, 0, null);
+		file1.addInitialRevision("1.1", author, date1, null, null, null);
 		VersionedFile file2 = new VersionedFile("test/file.file", dirTest);
 		assertEquals(dirRoot, file1.getDirectory());
 		assertEquals(dirTest, file2.getDirectory());
@@ -138,9 +138,9 @@
 	 */
 	public void testGetPreviousRevision() {
 		VersionedFile file = new VersionedFile("file", dirRoot);
-		Revision rev1 = file.addInitialRevision("1.1", author, date1, "message1", 0, null);
-		Revision rev2 = file.addChangeRevision("1.2", author, date2, "message2", 0, 0, 0, null);
-		Revision rev3 = file.addChangeRevision("1.3", author, date3, "message3", 0, 0, 0, null);
+		Revision rev1 = file.addInitialRevision("1.1", author, date1, "message1", null, null);
+		Revision rev2 = file.addChangeRevision("1.2", author, date2, "message2", null, 0, 0, null);
+		Revision rev3 = file.addChangeRevision("1.3", author, date3, "message3", null, 0, 0, null);
 		assertNull(rev1.getPreviousRevision());
 		assertNull(file.getPreviousRevision(rev1));
 		assertEquals(rev1, rev2.getPreviousRevision());
@@ -148,7 +148,7 @@
 		assertEquals(rev2, rev3.getPreviousRevision());
 		assertEquals(rev2, file.getPreviousRevision(rev3));
 		try {
-			file.getPreviousRevision(new Revision(new VersionedFile("foo", dirRoot), "1.1", Revision.TYPE_CHANGE, null, date3, null, 0, 0, 0, null));
+			file.getPreviousRevision(new Revision(new VersionedFile("foo", dirRoot), "1.1", Revision.TYPE_CHANGE, null, date3, null, null, 0, 0, null));
 			fail("should have thrown IllegalArgumentException");
 		} catch (IllegalArgumentException expected) {
 			// expected
@@ -160,7 +160,7 @@
 	 */
 	public void testLinkToDirectory() {
 		VersionedFile file = new VersionedFile("test/file", dirTest);
-		file.addInitialRevision("1.1", author, date1, "message1", 0, null);
+		file.addInitialRevision("1.1", author, date1, "message1", null, null);
 		assertEquals(dirTest, file.getDirectory());		
 		assertTrue(dirTest.getFiles().contains(file));		
 	}
@@ -172,9 +172,9 @@
 	public void testIgnoreNullAuthor() {
 		VersionedFile file = new VersionedFile("file", dirRoot);
 		new Revision(file, "1.5", Revision.TYPE_CHANGE, new Author("author"),
-				new Date(200000000), null, 0, 0, 0, null);
+				new Date(200000000), null, null, 0, 0, null);
 		new Revision(file, "0.0", Revision.TYPE_BEGIN_OF_LOG, null,
-				new Date(100000000), null, 0, 0, 0, null);
+				new Date(100000000), null, null, 0, 0, null);
 
 		assertTrue(!file.hasAuthor(null));
 	}
Index: tests-src/net/sf/statcvs/model/DirectoryTest.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/tests-src/net/sf/statcvs/model/DirectoryTest.java,v
retrieving revision 1.18
diff -u -r1.18 DirectoryTest.java
--- tests-src/net/sf/statcvs/model/DirectoryTest.java	22 Nov 2006 16:29:46 -0000	1.18
+++ tests-src/net/sf/statcvs/model/DirectoryTest.java	26 May 2008 17:13:46 -0000
@@ -106,12 +106,12 @@
 	 */
 	public void testRevisions() {
 		VersionedFile file1 = new VersionedFile("src/net/sf/statcvs/Main.java", rootSrcNetSfStatcvs);
-		Revision rev11 = file1.addInitialRevision("1.1", author, date1, null, 0, null);
-		Revision rev12 = file1.addChangeRevision("1.2", author, date3, null, 0, 0, 0, null);
+		Revision rev11 = file1.addInitialRevision("1.1", author, date1, null, null, null);
+		Revision rev12 = file1.addChangeRevision("1.2", author, date3, null, null, 0, 0, null);
 		VersionedFile file2 = new VersionedFile("src/net/sf/statcvs/README", rootSrcNetSfStatcvs);
-		Revision rev21 = file2.addInitialRevision("2.1", author, date2, null, 0, null);
+		Revision rev21 = file2.addInitialRevision("2.1", author, date2, null, null, null);
 		VersionedFile file3 = new VersionedFile("fileInRoot", root);
-		file3.addInitialRevision("3.1", author, date4, null, 0, null);
+		file3.addInitialRevision("3.1", author, date4, null, null, null);
 		Iterator revIt = rootSrcNetSfStatcvs.getRevisions().iterator();
 		assertTrue(revIt.hasNext());
 		assertEquals(rev11, revIt.next());
@@ -173,7 +173,7 @@
 	
 	public void testNonEmptyRepository() {
 		VersionedFile file1 = new VersionedFile("src/README", rootSrc);
-		file1.addInitialRevision("1.1", author, date1, null, 100, null);
+		file1.addInitialRevision("1.1", author, date1, null, new SlocMetrics(100), null);
 		assertTrue(!root.isEmpty());
 		assertTrue(!rootSrc.isEmpty());
 		assertTrue(rootSrcNet.isEmpty());
@@ -187,8 +187,8 @@
 
 	public void testEmptyRepositoryWithDeletedFile() {
 		VersionedFile file1 = new VersionedFile("src/README", rootSrc);
-		file1.addInitialRevision("1.1", author, date1, null, 100, null);
-		file1.addDeletionRevision("1.2", author, date2, null, 100, null);
+		file1.addInitialRevision("1.1", author, date1, null, new SlocMetrics(100), null);
+		file1.addDeletionRevision("1.2", author, date2, null, new SlocMetrics(100), null);
 		assertTrue(root.isEmpty());
 		assertTrue(rootSrc.isEmpty());
 		assertTrue(rootSrcNet.isEmpty());
@@ -198,14 +198,14 @@
 
 	public void testNonEmptyRepositoryWithDeletedFile() {
 		VersionedFile file1 = new VersionedFile("src/README", rootSrc);
-		file1.addInitialRevision("1.1", author, date1, null, 100, null);
+		file1.addInitialRevision("1.1", author, date1, null,  new SlocMetrics(100), null);
 		VersionedFile file2 = new VersionedFile("src/README2", rootSrc);
-		file2.addInitialRevision("1.1", author, date1, null, 100, null);
+		file2.addInitialRevision("1.1", author, date1, null,  new SlocMetrics(100), null);
 		VersionedFile file3 = new VersionedFile("fileInRoot", root);
-		file3.addInitialRevision("1.1", author, date1, null, 100, null);
+		file3.addInitialRevision("1.1", author, date1, null,  new SlocMetrics(100), null);
 		VersionedFile file4 = new VersionedFile("src/deleted", rootSrc);
-		file4.addInitialRevision("1.1", author, date1, null, 100, null);
-		file4.addDeletionRevision("1.2", author, date2, null, 100, null);
+		file4.addInitialRevision("1.1", author, date1, null,  new SlocMetrics(100), null);
+		file4.addDeletionRevision("1.2", author, date2, null,  new SlocMetrics(100), null);
 		assertTrue(!root.isEmpty());
 		assertTrue(!rootSrc.isEmpty());
 		assertTrue(rootSrcNet.isEmpty());
Index: tests-src/net/sf/statcvs/model/RevisionTest.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/tests-src/net/sf/statcvs/model/RevisionTest.java,v
retrieving revision 1.5
diff -u -r1.5 RevisionTest.java
--- tests-src/net/sf/statcvs/model/RevisionTest.java	22 Nov 2006 16:29:46 -0000	1.5
+++ tests-src/net/sf/statcvs/model/RevisionTest.java	26 May 2008 17:13:46 -0000
@@ -50,10 +50,10 @@
 
 	public void testGetFileCountChange1() {
 		VersionedFile file = new VersionedFile("file", Directory.createRoot());
-		Revision rev4 = new Revision(file, "1.4", Revision.TYPE_CREATION, author, date4, null, 0, 0, 0, null);
-		Revision rev3 = new Revision(file, "1.3", Revision.TYPE_CHANGE, author, date3, null, 0, 0, 0, null);
-		Revision rev2 = new Revision(file, "1.2", Revision.TYPE_DELETION, author, date2, null, 0, 0, 0, null);
-		Revision rev1 = new Revision(file, "1.1", Revision.TYPE_CREATION, author, date1, null, 0, 0, 0, null);
+		Revision rev4 = new Revision(file, "1.4", Revision.TYPE_CREATION, author, date4, null, null, 0, 0, null);
+		Revision rev3 = new Revision(file, "1.3", Revision.TYPE_CHANGE, author, date3, null, null, 0, 0, null);
+		Revision rev2 = new Revision(file, "1.2", Revision.TYPE_DELETION, author, date2, null, null, 0, 0, null);
+		Revision rev1 = new Revision(file, "1.1", Revision.TYPE_CREATION, author, date1, null, null, 0, 0, null);
 		assertEquals(1, rev4.getFileCountDelta());
 		assertEquals(0, rev3.getFileCountDelta());
 		assertEquals(-1, rev2.getFileCountDelta());
@@ -62,7 +62,7 @@
 
 	public void testGetFileCountChange2() {
 		VersionedFile file = new VersionedFile("file", Directory.createRoot());
-		Revision rev = new Revision(file, null, Revision.TYPE_BEGIN_OF_LOG, author, date1, null, 0, 0, 0, null);
+		Revision rev = new Revision(file, null, Revision.TYPE_BEGIN_OF_LOG, author, date1, null, null, 0, 0, null);
 		assertEquals(0, rev.getFileCountDelta());
 	}
 }
Index: tests-src/net/sf/statcvs/output/WebRepositoryIntegrationTest.java
===================================================================
RCS file: /cvsroot/statcvs/statcvs/tests-src/net/sf/statcvs/output/WebRepositoryIntegrationTest.java,v
retrieving revision 1.20
diff -u -r1.20 WebRepositoryIntegrationTest.java
--- tests-src/net/sf/statcvs/output/WebRepositoryIntegrationTest.java	22 Nov 2006 16:29:46 -0000	1.20
+++ tests-src/net/sf/statcvs/output/WebRepositoryIntegrationTest.java	26 May 2008 17:13:46 -0000
@@ -78,7 +78,7 @@
 	public void testViewcvsForgivingBaseURL() {
 		ViewCvsIntegration viewcvs2 = new ViewCvsIntegration("http://example.com");
 		VersionedFile file = new VersionedFile("file", root);
-		file.addChangeRevision("1.1", null, date, null, 0, 0, 0, null);
+		file.addChangeRevision("1.1", null, date, null, null, 0, 0, null);
 		assertEquals("http://example.com/file", viewcvs2.getFileHistoryUrl(file));
 	}
 
@@ -87,7 +87,7 @@
 	 */
 	public void testViewcvsNormalFile() {
 		VersionedFile file = new VersionedFile("path/file", path);
-		file.addChangeRevision("1.1", null, date, null, 0, 0, 0, null);
+		file.addChangeRevision("1.1", null, date, null, null, 0, 0, null);
 		assertEquals(BASE + "path/file", viewcvs.getFileHistoryUrl(file));
 		assertEquals(BASE + "path/file?rev=HEAD&content-type=text/vnd.viewcvs-markup",
 				viewcvs.getFileViewUrl(file));
@@ -99,7 +99,7 @@
 	public void testViewcvsWithCvsroot() {
 		this.viewcvs = new ViewCvsIntegration("http://example.com/cgi-bin/viewcvs.cgi/module?cvsroot=CvsRoot");
 		VersionedFile file = new VersionedFile("path/file", this.path);
-		file.addChangeRevision("1.1", null, this.date, null, 0, 0, 0, null);
+		file.addChangeRevision("1.1", null, this.date, null, null, 0, 0, null);
 		assertEquals(
 				"http://example.com/cgi-bin/viewcvs.cgi/module/path/file?cvsroot=CvsRoot",
 				this.viewcvs.getFileHistoryUrl(file));
@@ -113,7 +113,7 @@
 	 */
 	public void testViewcvsAtticFile() {
 		VersionedFile file = new VersionedFile("path/file", path);
-		file.addChangeRevision("1.1", null, date, null, 0, 0, 0, null);
+		file.addChangeRevision("1.1", null, date, null, null, 0, 0, null);
 		HashSet atticFileNames = new HashSet();
 		atticFileNames.add("path/file");
 		viewcvs.setAtticFileNames(atticFileNames);
@@ -137,8 +137,8 @@
 	 */
 	public void testViewcvsDiff() {
 		VersionedFile file = new VersionedFile("file", root);
-		Revision rev1 = file.addChangeRevision("1.1", null, date, null, 0, 0, 0, null);
-		Revision rev2 = file.addChangeRevision("1.2", null, date, null, 0, 0, 0, null);
+		Revision rev1 = file.addChangeRevision("1.1", null, date, null, null, 0, 0, null);
+		Revision rev2 = file.addChangeRevision("1.2", null, date, null, null, 0, 0, null);
 		assertEquals(
 				"http://example.com/file.diff?r1=1.1&r2=1.2",
 				viewcvs.getDiffUrl(rev1, rev2));
@@ -150,8 +150,8 @@
 	public void testViewcvsDiffWithCvsroot() {
 		this.viewcvs = new ViewCvsIntegration("http://example.com/cgi-bin/viewcvs.cgi/module?cvsroot=CvsRoot");
 		VersionedFile file = new VersionedFile("file", this.root);
-		Revision rev1 = file.addChangeRevision("1.1", null, this.date, null, 0, 0, 0, null);
-		Revision rev2 = file.addChangeRevision("1.2", null, this.date, null, 0, 0, 0, null);
+		Revision rev1 = file.addChangeRevision("1.1", null, this.date, null, null, 0, 0, null);
+		Revision rev2 = file.addChangeRevision("1.2", null, this.date, null, null, 0, 0, null);
 		assertEquals(
 				"http://example.com/cgi-bin/viewcvs.cgi/module/file.diff?r1=1.1&r2=1.2&cvsroot=CvsRoot",
 				this.viewcvs.getDiffUrl(rev1, rev2));
@@ -172,7 +172,7 @@
 	public void testCvswebForgivingBaseURL() {
 		CvswebIntegration cvsweb2 = new CvswebIntegration("http://example.com");
 		VersionedFile file = new VersionedFile("file", root);
-		file.addChangeRevision("1.1", null, date, null, 0, 0, 0, null);
+		file.addChangeRevision("1.1", null, date, null, null, 0, 0, null);
 		assertEquals("http://example.com/file", cvsweb2.getFileHistoryUrl(file));
 	}
 
@@ -181,7 +181,7 @@
 	 */
 	public void testCvswebNormalFile() {
 		VersionedFile file = new VersionedFile("path/file", path);
-		file.addChangeRevision("1.1", null, date, null, 0, 0, 0, null);
+		file.addChangeRevision("1.1", null, date, null, null, 0, 0, null);
 		assertEquals(BASE + "path/file", cvsweb.getFileHistoryUrl(file));
 		assertEquals(BASE + "path/file?rev=HEAD&content-type=text/vnd.viewcvs-markup",
 				cvsweb.getFileViewUrl(file));
@@ -193,7 +193,7 @@
 	public void testCvswebWithCvsroot() {
 		this.cvsweb = new CvswebIntegration("http://example.com/cgi-bin/cvsweb.cgi/module?cvsroot=CvsRoot");
 		VersionedFile file = new VersionedFile("path/file", this.path);
-		file.addChangeRevision("1.1", null, this.date, null, 0, 0, 0, null);
+		file.addChangeRevision("1.1", null, this.date, null, null, 0, 0, null);
 		assertEquals(
 				"http://example.com/cgi-bin/cvsweb.cgi/module/path/file?cvsroot=CvsRoot",
 				this.cvsweb.getFileHistoryUrl(file));
@@ -207,7 +207,7 @@
 	 */
 	public void testCvswebAtticFile() {
 		VersionedFile file = new VersionedFile("path/file", path);
-		file.addChangeRevision("1.1", null, date, null, 0, 0, 0, null);
+		file.addChangeRevision("1.1", null, date, null, null, 0, 0, null);
 		HashSet atticFileNames = new HashSet();
 		atticFileNames.add("path/file");
 		cvsweb.setAtticFileNames(atticFileNames);
@@ -231,8 +231,8 @@
 	 */
 	public void testCvswebDiff() {
 		VersionedFile file = new VersionedFile("file", root);
-		Revision rev1 = file.addChangeRevision("1.1", null, date, null, 0, 0, 0, null);
-		Revision rev2 = file.addChangeRevision("1.2", null, date, null, 0, 0, 0, null);
+		Revision rev1 = file.addChangeRevision("1.1", null, date, null, null, 0, 0, null);
+		Revision rev2 = file.addChangeRevision("1.2", null, date, null, null, 0, 0, null);
 		assertEquals(
 				"http://example.com/file.diff?r1=1.1&r2=1.2&f=h",
 				cvsweb.getDiffUrl(rev1, rev2));
@@ -244,8 +244,8 @@
 	public void testCvswebDiffWithCvsroot() {
 		this.cvsweb = new CvswebIntegration("http://example.com/cgi-bin/cvsweb.cgi/module?cvsroot=CvsRoot");
 		VersionedFile file = new VersionedFile("file", this.root);
-		Revision rev1 = file.addChangeRevision("1.1", null, this.date, null, 0, 0, 0, null);
-		Revision rev2 = file.addChangeRevision("1.2", null, this.date, null, 0, 0, 0, null);
+		Revision rev1 = file.addChangeRevision("1.1", null, this.date, null, null, 0, 0, null);
+		Revision rev2 = file.addChangeRevision("1.2", null, this.date, null, null, 0, 0, null);
 		assertEquals(
 				"http://example.com/cgi-bin/cvsweb.cgi/module/file.diff?r1=1.1&r2=1.2&f=h&cvsroot=CvsRoot",
 				this.cvsweb.getDiffUrl(rev1, rev2));
@@ -266,7 +266,7 @@
 	public void testChoraForgivingBaseURL() {
 		ChoraIntegration chora2 = new ChoraIntegration("http://example.com");
 		VersionedFile file = new VersionedFile("file", root);
-		file.addChangeRevision("1.1", null, date, null, 0, 0, 0, null);
+		file.addChangeRevision("1.1", null, date, null, null, 0, 0, null);
 		assertEquals("http://example.com/file", chora2.getFileHistoryUrl(file));
 	}
 
@@ -275,7 +275,7 @@
 	 */
 	public void testChoraNormalFile() {
 		VersionedFile file = new VersionedFile("path/file", path);
-		file.addChangeRevision("1.1", null, date, null, 0, 0, 0, null);
+		file.addChangeRevision("1.1", null, date, null, null, 0, 0, null);
 		assertEquals(BASE + "path/file", chora.getFileHistoryUrl(file));
 		assertEquals(BASE + "path/file?r=HEAD", chora.getFileViewUrl(file));
 	}
@@ -285,7 +285,7 @@
 	 */
 	public void testChoraAtticFile() {
 		VersionedFile file = new VersionedFile("path/file", path);
-		file.addChangeRevision("1.1", null, date, null, 0, 0, 0, null);
+		file.addChangeRevision("1.1", null, date, null, null, 0, 0, null);
 		HashSet atticFileNames = new HashSet();
 		atticFileNames.add("path/file");
 		chora.setAtticFileNames(atticFileNames);
@@ -308,8 +308,8 @@
 	 */
 	public void testChoraDiff() {
 		VersionedFile file = new VersionedFile("file", root);
-		Revision rev1 = file.addChangeRevision("1.1", null, date, null, 0, 0, 0, null);
-		Revision rev2 = file.addChangeRevision("1.2", null, date, null, 0, 0, 0, null);
+		Revision rev1 = file.addChangeRevision("1.1", null, date, null, null, 0, 0, null);
+		Revision rev2 = file.addChangeRevision("1.2", null, date, null, null, 0, 0, null);
 		assertEquals(
 				"http://example.com/file?r1=1.1&r2=1.2",
 				chora.getDiffUrl(rev1, rev2));
