package com.github.signed.pmd;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.StringReader;
import java.nio.charset.Charset;
import java.util.List;
import org.javacc.parser.JavaCCParser;
import org.junit.Before;
import org.junit.Test;
import com.github.signed.pmd.rules.AlwaysComplain;
import com.google.common.io.Files;
import com.sun.codemodel.CodeWriter;
import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.JDefinedClass;
import com.sun.codemodel.JExpr;
import com.sun.codemodel.JMethod;
import com.sun.codemodel.writer.SingleStreamCodeWriter;
import joist.sourcegen.GClass;
import joist.sourcegen.GMethod;
import net.sourceforge.pmd.PMD;
import net.sourceforge.pmd.Report;
import net.sourceforge.pmd.RuleContext;
import net.sourceforge.pmd.RuleSet;
import net.sourceforge.pmd.RuleSets;
import net.sourceforge.pmd.lang.java.ast.ASTPackageDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression;
import net.sourceforge.pmd.lang.java.ast.JavaNode;
public class AstParser_Test {
private String sourceCode;
private AstParser astParser = new AstParser();
@Before
public void setUp() throws Exception {
File file;
if( new File("do not care").getAbsoluteFile().getParentFile().getName().equals("sandbox-pmd")){
file = new File("project-under-the-microscope/business/src/main/java/singletons/AccessSingleton.java");
}else{
file = new File("../project-under-the-microscope/business/src/main/java/singletons/AccessSingleton.java");
}
sourceCode = Files.toString(file, Charset.forName("UTF-8"));
}
@Test
public void justParseToRootNode() throws Exception {
JavaNode node = astParser.parse(sourceCode);
List<ASTPrimaryExpression> childrenOfType = node.findChildrenOfType(ASTPrimaryExpression.class);
List<ASTPackageDeclaration> packageDeclarations = node.findChildrenOfType(ASTPackageDeclaration.class);
System.out.println(node);
}
@Test
public void joist() throws Exception {
GClass singleton = new GClass("singletons.Singleton");
GMethod instanceMethod = singleton.getMethod("instance");
instanceMethod.returnType("singletons.Singleton");
instanceMethod.setStatic();
instanceMethod.setBody("return new Singleton()");
System.out.println(singleton.toCode());
GClass gClass = new GClass("apackage.DoNotCare");
gClass.addImports("singletons.Singleton");
GMethod method = gClass.getMethod("doNotCare");
method.setBody("Singleton.instance()");
}
@Test
public void codeModel() throws Exception {
JCodeModel model = new JCodeModel();
JDefinedClass singleton = model._class("singletons.Singleton");
JMethod instanceMethod = singleton.method(JavaCCParser.ModifierSet.PUBLIC| JavaCCParser.ModifierSet.STATIC, singleton, "instance");
instanceMethod.body()._return(JExpr._new(singleton));
JDefinedClass singletonAccessor = model._class("apackage.DoNotCare");
JMethod methodWithSingletonAccess = singletonAccessor.method(JavaCCParser.ModifierSet.PUBLIC, model.VOID, "doStuff");
methodWithSingletonAccess.body().add(singleton.staticInvoke(instanceMethod));
ByteArrayOutputStream out = new ByteArrayOutputStream();
CodeWriter codeWriter = new SingleStreamCodeWriter(out);
model.build(codeWriter);
}
@Test
public void runIntegrationTestWithPMD() throws Exception {
Report report = new Report();
PMD pmd = new PMD();
pmd.getConfiguration().setDefaultLanguageVersion(AstParser.JAVA_7);
RuleContext ctx = new RuleContext();
ctx.setReport(report);
ctx.setSourceCodeFilename("n/a");
ctx.setLanguageVersion(AstParser.JAVA_7);
// ctx.setIgnoreExceptions(false);
RuleSet rules = new RuleSet();
rules.addRule(new AlwaysComplain());
pmd.getSourceCodeProcessor().processSourceCode(new StringReader(sourceCode), new RuleSets(rules), ctx);
}
}