package net.sourceforge.cobertura.javancss;
import net.sourceforge.cobertura.javancss.ccl.Exitable;
import net.sourceforge.cobertura.javancss.ccl.Init;
import net.sourceforge.cobertura.javancss.ccl.Util;
import net.sourceforge.cobertura.javancss.parser.*;
import net.sourceforge.cobertura.javancss.parser.debug.JavaParserDebug;
import net.sourceforge.cobertura.javancss.parser.java15.JavaParser15;
import net.sourceforge.cobertura.javancss.parser.java15.debug.JavaParser15Debug;
import java.io.*;
import java.util.*;
public class Javancss implements Exitable {
private static final String S_INIT__FILE_CONTENT = "[Init]\n"
+ "Author=Chr. Clemens Lee\n"
+ "\n"
+ "[Help]\n"
+ "; Please do not edit the Help section\n"
+ "HelpUsage=@srcfiles.txt | *.java | <stdin>\n"
+ "Options=ncss,package,object,function,all,gui,xml,out,recursive,check,encoding,parser15\n"
+ "ncss=b,o,Counts the program NCSS (default).\n"
+ "package=b,o,Assembles a statistic on package level.\n"
+ "object=b,o,Counts the object NCSS.\n"
+ "function=b,o,Counts the function NCSS.\n"
+ "all=b,o,The same as '-function -object -package'.\n"
+ "gui=b,o,Opens a gui to present the '-all' output in tabbed panels.\n"
+ "xml=b,o,Output in xml format.\n"
+ "out=s,o,Output file name. By default output goes to standard out.\n"
+ "recursive=b,o,Recurse to subdirs.\n"
+ "check=b,o,Triggers a javancss self test.\n"
+ "encoding=s,o,Encoding used while reading source files (default: platform encoding).\n"
+ "parser15=b,o,Use new experimental Java 1.5 parser.\n" + "\n"
+ "[Colors]\n" + "UseSystemColors=true\n";
private boolean _bExit = false;
private List_vJavaSourceFiles = null;
private String encoding = null;
private String _sErrorMessage = null;
private Throwable _thrwError = null;
private JavaParserInterface _pJavaParser = null;
private int _ncss = 0;
private int _loc = 0;
private List_vFunctionMetrics = new ArrayList();
private List_vObjectMetrics = new ArrayList();
private List_vPackageMetrics = null;
private List _vImports = null;
private Map_htPackages = null;
private Object[] _aoPackage = null;
private File _sJavaSourceFile = null;
private Reader createSourceReader(File sSourceFile_) {
try {
return newReader(sSourceFile_);
} catch (IOException pIOException) {
if (Util.isEmpty(_sErrorMessage)) {
_sErrorMessage = "";
} else {
_sErrorMessage += "\n";
}
_sErrorMessage += "File not found: "
+ sSourceFile_.getAbsolutePath();
_thrwError = pIOException;
return null;
}
}
private void _measureSource(File sSourceFile_) throws IOException,
Exception, Error {
Reader reader = null;
try {
reader = newReader(sSourceFile_);
} catch (IOException pIOException) {
if (Util.isEmpty(_sErrorMessage)) {
_sErrorMessage = "";
} else {
_sErrorMessage += "\n";
}
_sErrorMessage += "File not found: "
+ sSourceFile_.getAbsolutePath();
_thrwError = pIOException;
throw pIOException;
}
String sTempErrorMessage = _sErrorMessage;
try {
_measureSource(reader);
} catch (Exception pParseException) {
if (sTempErrorMessage == null) {
sTempErrorMessage = "";
}
sTempErrorMessage += "ParseException in "
+ sSourceFile_.getAbsolutePath()
+ "\nLast useful checkpoint: \""
+ _pJavaParser.getLastFunction() + "\"\n";
sTempErrorMessage += pParseException.getMessage() + "\n";
_sErrorMessage = sTempErrorMessage;
_thrwError = pParseException;
throw pParseException;
} catch (Error pTokenMgrError) {
if (sTempErrorMessage == null) {
sTempErrorMessage = "";
}
sTempErrorMessage += "TokenMgrError in "
+ sSourceFile_.getAbsolutePath() + "\n"
+ pTokenMgrError.getMessage() + "\n";
_sErrorMessage = sTempErrorMessage;
_thrwError = pTokenMgrError;
throw pTokenMgrError;
}
}
private void _measureSource(Reader reader) throws IOException, Exception,
Error {
Util.debug("_measureSource(Reader).ENTER");
Util.debug("_measureSource(Reader).ENTER2");
try {
boolean parser15 = _pInit != null && _pInit.getOptions() != null
&& _pInit.getOptions().get("parser15") != null;
if (Util.isDebug()) {
if (parser15) {
Util.debug("creating JavaParser15Debug");
_pJavaParser = new JavaParser15Debug(reader);
} else {
Util.debug("creating JavaParserDebug");
_pJavaParser = new JavaParserDebug(reader);
}
} else {
if (parser15) {
Util.debug("creating JavaParser15");
_pJavaParser = new JavaParser15(reader);
} else {
Util.debug("creating JavaParser");
_pJavaParser = new JavaParser(reader);
}
}
_pJavaParser.parse();
Util
.debug("Javancss._measureSource(DataInputStream).SUCCESSFULLY_PARSED");
_ncss += _pJavaParser.getNcss();
_loc += _pJavaParser.getLOC();
_vFunctionMetrics.addAll(_pJavaParser.getFunction());
_vObjectMetrics.addAll(_pJavaParser.getObject());
Map htNewPackages = _pJavaParser.getPackage();
for (Iterator ePackages = htNewPackages.entrySet().iterator(); ePackages
.hasNext();) {
String sPackage = (String) ((Map.Entry) ePackages.next())
.getKey();
PackageMetric pckmNext = (PackageMetric) htNewPackages
.get(sPackage);
pckmNext.name = sPackage;
PackageMetric pckmPrevious = (PackageMetric) _htPackages
.get(sPackage);
pckmNext.add(pckmPrevious);
_htPackages.put(sPackage, pckmNext);
}
} catch (Exception pParseException) {
if (_sErrorMessage == null) {
_sErrorMessage = "";
}
_sErrorMessage += "ParseException in STDIN";
if (_pJavaParser != null) {
_sErrorMessage += "\nLast useful checkpoint: \""
+ _pJavaParser.getLastFunction() + "\"\n";
}
_sErrorMessage += pParseException.getMessage() + "\n";
_thrwError = pParseException;
throw pParseException;
} catch (Error pTokenMgrError) {
if (_sErrorMessage == null) {
_sErrorMessage = "";
}
_sErrorMessage += "TokenMgrError in STDIN\n";
_sErrorMessage += pTokenMgrError.getMessage() + "\n";
_thrwError = pTokenMgrError;
throw pTokenMgrError;
}
}
private void _measureFiles(ListvJavaSourceFiles_)
throws IOException, ParseException, TokenMgrError {
for (Iterator e = vJavaSourceFiles_.iterator(); e.hasNext();) {
File file = (File) e.next();
try {
_measureSource(file);
} catch (Throwable pThrowable) {
}
}
}
private void _measureRoot(Reader reader) throws IOException, Exception,
Error {
_htPackages = new HashMap();
if (_vJavaSourceFiles == null) {
_measureSource(reader);
} else {
_measureFiles(_vJavaSourceFiles);
}
_vPackageMetrics = new ArrayList();
for (Iterator ePackages = _htPackages.keySet().iterator(); ePackages
.hasNext();) {
String sPackage = (String) ePackages.next();
PackageMetric pckmNext = (PackageMetric) _htPackages.get(sPackage);
_vPackageMetrics.add(pckmNext);
}
}
public List getImports() {
return _vImports;
}
public Object[] getPackage() {
return _aoPackage;
}
public ListgetFunctions() {
return _vFunctionMetrics;
}
public Javancss(ListvJavaSourceFiles_) {
_vJavaSourceFiles = vJavaSourceFiles_;
try {
_measureRoot(newReader(System.in));
} catch (Exception e) {
e.printStackTrace();
} catch (TokenMgrError pError) {
pError.printStackTrace();
}
}
public Javancss(File sJavaSourceFile_) {
Util.debug("Javancss.<init>(String).sJavaSourceFile_: "
+ sJavaSourceFile_);
_sErrorMessage = null;
_vJavaSourceFiles = new ArrayList();
_vJavaSourceFiles.add(sJavaSourceFile_);
try {
_measureRoot(newReader(System.in));
} catch (Exception e) {
Util.debug("Javancss.<init>(String).e: " + e);
e.printStackTrace();
} catch (TokenMgrError pError) {
Util.debug("Javancss.<init>(String).pError: " + pError);
pError.printStackTrace();
}
}
public Javancss(InputStream isJavaSource_, String encoding) {
Util.debug("Javancss.<init>(InputStream).sJavaSourceFile_: "
+ isJavaSource_);
_sErrorMessage = null;
_vJavaSourceFiles = null;
this.encoding = encoding;
try {
_measureRoot(newReader(isJavaSource_));
} catch (Exception e) {
Util.debug("Javancss.<init>(InputStream).e: " + e);
e.printStackTrace();
} catch (TokenMgrError pError) {
Util.debug("Javancss.<init>(InputStream).pError: " + pError);
pError.printStackTrace();
}
}
public Javancss() {
super();
_sErrorMessage = null;
_thrwError = null;
}
public boolean parseImports() {
if (_sJavaSourceFile == null) {
Util.debug("Javancss.parseImports().NO_FILE");
return true;
}
Reader reader = createSourceReader(_sJavaSourceFile);
if (reader == null) {
Util.debug("Javancss.parseImports().NO_DIS");
return true;
}
try {
Util.debug("Javancss.parseImports().START_PARSING");
if (Util.isDebug() == false) {
_pJavaParser = (JavaParserInterface) (new JavaParser(reader));
} else {
_pJavaParser = (JavaParserInterface) (new JavaParserDebug(
reader));
}
_pJavaParser.parseImportUnit();
_vImports = _pJavaParser.getImports();
_aoPackage = _pJavaParser.getPackageObjects();
Util.debug("Javancss.parseImports().END_PARSING");
} catch (Exception pParseException) {
Util.debug("Javancss.parseImports().PARSE_EXCEPTION");
if (_sErrorMessage == null) {
_sErrorMessage = "";
}
_sErrorMessage += "ParseException in STDIN";
if (_pJavaParser != null) {
_sErrorMessage += "\nLast useful checkpoint: \""
+ _pJavaParser.getLastFunction() + "\"\n";
}
_sErrorMessage += pParseException.getMessage() + "\n";
_thrwError = pParseException;
return true;
} catch (Error pTokenMgrError) {
Util.debug("Javancss.parseImports().TOKEN_ERROR");
if (_sErrorMessage == null) {
_sErrorMessage = "";
}
_sErrorMessage += "TokenMgrError in STDIN\n";
_sErrorMessage += pTokenMgrError.getMessage() + "\n";
_thrwError = pTokenMgrError;
return true;
}
return false;
}
public void setSourceFile(File javaSourceFile_) {
_sJavaSourceFile = javaSourceFile_;
_vJavaSourceFiles = new ArrayList();
_vJavaSourceFiles.add(javaSourceFile_);
}
private Init _pInit = null;
public int getNcss() {
return _ncss;
}
public int getLOC() {
return _loc;
}
public int getJvdc() {
return _pJavaParser.getJvdc();
}
public int getJdcl() {
return JavaParserTokenManager._iFormalComments;
}
public int getSl() {
return JavaParserTokenManager._iSingleComments;
}
public int getMl() {
return JavaParserTokenManager._iMultiComments;
}
public List getFunctionMetrics() {
return (_vFunctionMetrics);
}
public ListgetObjectMetrics() {
return (_vObjectMetrics);
}
public List getPackageMetrics() {
return (_vPackageMetrics);
}
public String getLastErrorMessage() {
if (_sErrorMessage == null) {
return null;
}
return _sErrorMessage;
}
public Throwable getLastError() {
return _thrwError;
}
public void setExit() {
_bExit = true;
}
public String getEncoding() {
return encoding;
}
public void setEncoding(String encoding) {
this.encoding = encoding;
}
private Reader newReader(InputStream stream)
throws UnsupportedEncodingException {
return (encoding == null)
? new InputStreamReader(stream)
: new InputStreamReader(stream, encoding);
}
private Reader newReader(File file) throws FileNotFoundException,
UnsupportedEncodingException {
return newReader(new FileInputStream(file));
}
}