package com.github.signed.pmd.abstractions; import com.github.signed.pmd.CodeModelToPmdAst; import com.sun.codemodel.JBlock; import com.sun.codemodel.JClassAlreadyExistsException; import com.sun.codemodel.JCodeModel; import com.sun.codemodel.JDefinedClass; import com.sun.codemodel.JInvocation; import com.sun.codemodel.JMethod; import net.sourceforge.pmd.PMDException; import net.sourceforge.pmd.lang.java.ast.JavaNode; import org.javacc.parser.JavaCCParser; import java.io.IOException; public class SingletonAccessBuilder { private final CodeModelToPmdAst converter = new CodeModelToPmdAst(); private final JDefinedClass singleton; private final JMethod instanceMethod; private final JCodeModel model; public SingletonAccessBuilder(JDefinedClass singleton, JMethod instanceMethod, JCodeModel model) { this.singleton = singleton; this.instanceMethod = instanceMethod; this.model = model; } public void invokeInstanceMethodInAnyMethod() throws JClassAlreadyExistsException { JDefinedClass singletonAccessor = model._class("apackage.SingletonAccess"); JMethod methodWithSingletonAccess = singletonAccessor.method(JavaCCParser.ModifierSet.PUBLIC, model.VOID, "doStuff"); methodWithSingletonAccess.body().add(instanceMethodCall()); } public void invokeInstanceMethodAndAssignedToLocalVariableInAnyMethod() throws JClassAlreadyExistsException{ JDefinedClass singletonAccessor = model._class("apackage.SingletonAccess"); JMethod methodWithSingletonAccess = singletonAccessor.method(JavaCCParser.ModifierSet.PUBLIC, model.VOID, "doStuff"); JBlock body = methodWithSingletonAccess.body(); body.decl(singleton, "instance", instanceMethodCall()); } private JInvocation instanceMethodCall() { return singleton.staticInvoke(instanceMethod); } public JavaNode toPmdAst() throws IOException, PMDException { return converter.convertClassToJavaNode("SingletonAccess", model); } }