Skip to content

Instantly share code, notes, and snippets.

@csokol
Created April 10, 2012 16:27
Show Gist options
  • Save csokol/2352637 to your computer and use it in GitHub Desktop.
Save csokol/2352637 to your computer and use it in GitHub Desktop.
CCMetric.java
package tasks.metric.cc;
import japa.parser.JavaParser;
import japa.parser.ast.CompilationUnit;
import java.io.InputStream;
import model.SourceCode;
import tasks.metric.ClassInfoVisitor;
import tasks.metric.Metric;
public class CCMetric implements Metric {
private CCVisitor visitor;
private ClassInfoVisitor classInfo;
public String header() {
return "path;project;class;cc;average cc";
}
public Object resultToPersistOf(SourceCode sourceCode) {
return new CCMetricResultToPersist(sourceCode, cc(), avgCc());
}
public void calculate(InputStream is) {
try {
CompilationUnit cunit = JavaParser.parse(is);
classInfo = new ClassInfoVisitor();
classInfo.visit(cunit, null);
visitor = new CCVisitor();
visitor.visit(cunit, null);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public double avgCc() {
double avgCc = visitor.getAvgCc();
if (Double.isNaN(avgCc))
avgCc = -1.0;
return avgCc;
}
public int cc() {
return visitor.getCc();
}
public int cc(String method) {
return visitor.getCc(method);
}
@Override
public boolean shouldCalculateMetricOf(String fileName) {
return fileName.endsWith(".java");
}
}
package tasks;
import java.io.ByteArrayInputStream;
import java.util.List;
import model.Project;
import model.SourceCode;
import model.Task;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import tasks.metric.Metric;
import tasks.runner.RunnableTask;
import br.com.caelum.revolution.domain.Artifact;
public class CalculateMetricTask implements RunnableTask {
private Task task;
private Metric metric;
private Session session;
private static Logger log = Logger.getLogger(CalculateMetricTask.class);
public CalculateMetricTask(Task task, Metric metric, Session session) {
this.task = task;
this.metric = metric;
this.session = session;
}
@Override
public void run() {
Project project = task.getProject();
List<Artifact> artifacts = project.getArtifacts();
for (Artifact artifact : artifacts) {
List<SourceCode> sources = artifact.getSources();
for (SourceCode sourceCode : sources) {
if (metric.shouldCalculateMetricOf(sourceCode.getName())) {
log.info("Calculating metrics for: " + sourceCode.getName() + " - "
+ sourceCode.getCommit().getCommitId());
try {
metric.calculate(new ByteArrayInputStream(sourceCode.getSourceBytesArray()));
session.save(metric.resultToPersistOf(sourceCode));
} catch (Exception e) {
log.error("Unable to calculate CC metric: ", e);
}
}
}
}
}
}
10:30:16,412 INFO [CalculateMetricTask ] Calculating metrics for: jdktools/modules/jdktools/src/test/java/org/apache/harmony/tests/tools/javah/Test02.java - 5ce5fd50769a5ddc32bd316839a71dfe0ded9290
10:30:16,559 ERROR [TaskLogger ] Tasktasks.runner.TaskRunner was failed
org.quartz.JobExecutionException: org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: japa.parser.TokenMgrError: Lexical error at line 23, column 35. Encountered: "\ufffd" (65533), after : ""] [See nested exception: org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: japa.parser.TokenMgrError: Lexical error at line 23, column 35. Encountered: "\ufffd" (65533), after : ""]]
at org.quartz.core.JobRunShell.run(JobRunShell.java:229)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
Caused by: org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: japa.parser.TokenMgrError: Lexical error at line 23, column 35. Encountered: "\ufffd" (65533), after : ""]
at org.quartz.core.JobRunShell.run(JobRunShell.java:224)
... 1 more
Caused by: japa.parser.TokenMgrError: Lexical error at line 23, column 35. Encountered: "\ufffd" (65533), after : ""
at japa.parser.ASTParserTokenManager.getNextToken(ASTParserTokenManager.java:2247)
at japa.parser.ASTParser.jj_scan_token(ASTParser.java:9932)
at japa.parser.ASTParser.jj_3R_64(ASTParser.java:5411)
at japa.parser.ASTParser.jj_3_5(ASTParser.java:5562)
at japa.parser.ASTParser.jj_2_5(ASTParser.java:4853)
at japa.parser.ASTParser.ClassOrInterfaceBodyDeclaration(ASTParser.java:1027)
at japa.parser.ASTParser.ClassOrInterfaceBody(ASTParser.java:961)
at japa.parser.ASTParser.ClassOrInterfaceDeclaration(ASTParser.java:604)
at japa.parser.ASTParser.TypeDeclaration(ASTParser.java:524)
at japa.parser.ASTParser.CompilationUnit(ASTParser.java:269)
at japa.parser.JavaParser.parse(JavaParser.java:81)
at japa.parser.JavaParser.parse(JavaParser.java:94)
at tasks.metric.cc.CCMetric.calculate(CCMetric.java:27)
at tasks.CalculateMetricTask.run(CalculateMetricTask.java:41)
at tasks.runner.TaskRunner.execute(TaskRunner.java:41)
at br.com.caelum.vraptor.tasks.jobs.simple.ConcurrentJobWrapper.execute(ConcurrentJobWrapper.java:18)
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
... 1 more
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment