move testable agent generation to EnableTestableProcessor

This commit is contained in:
金戟 2020-07-20 23:18:54 +08:00
parent 0f007c6d96
commit e51da09824
2 changed files with 39 additions and 42 deletions

View File

@ -3,7 +3,6 @@ package com.alibaba.testable.processor;
import com.alibaba.testable.annotation.EnableTestableInject; import com.alibaba.testable.annotation.EnableTestableInject;
import com.alibaba.testable.translator.EnableTestableInjectTranslator; import com.alibaba.testable.translator.EnableTestableInjectTranslator;
import com.alibaba.testable.translator.MethodRecordTranslator; import com.alibaba.testable.translator.MethodRecordTranslator;
import com.alibaba.testable.util.ResourceUtil;
import com.sun.tools.javac.code.Symbol; import com.sun.tools.javac.code.Symbol;
import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree;
@ -13,10 +12,6 @@ import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion; import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element; import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement; import javax.lang.model.element.TypeElement;
import javax.tools.FileObject;
import javax.tools.StandardLocation;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Set; import java.util.Set;
/** /**
@ -26,15 +21,9 @@ import java.util.Set;
@SupportedSourceVersion(SourceVersion.RELEASE_7) @SupportedSourceVersion(SourceVersion.RELEASE_7)
public class EnableTestableInjectProcessor extends BaseProcessor { public class EnableTestableInjectProcessor extends BaseProcessor {
private static final String AGENT_TARGET_FOLDER = "";
private static final String AGENT_TARGET_FILE = "testable.jar";
private static final String AGENT_SOURCE_FILE = "testable-agent.jar";
private static boolean hasFirstClassCompiled = false;
@Override @Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(EnableTestableInject.class); Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(EnableTestableInject.class);
createStaticNewClass();
for (Element element : elements) { for (Element element : elements) {
if (element.getKind().isClass()) { if (element.getKind().isClass()) {
processClassElement((Symbol.ClassSymbol)element); processClassElement((Symbol.ClassSymbol)element);
@ -43,24 +32,6 @@ public class EnableTestableInjectProcessor extends BaseProcessor {
return true; return true;
} }
private void createStaticNewClass() {
if (!checkFirstClassCompiled()) {
byte[] bytes = ResourceUtil.fetchBinary(AGENT_SOURCE_FILE);
if (bytes.length == 0) {
cx.logger.error("Failed to generate testable agent jar");
}
writeBinaryFile(AGENT_TARGET_FOLDER, AGENT_TARGET_FILE, bytes);
}
}
private boolean checkFirstClassCompiled() {
if (!hasFirstClassCompiled) {
hasFirstClassCompiled = true;
return false;
}
return true;
}
private void processClassElement(Symbol.ClassSymbol clazz) { private void processClassElement(Symbol.ClassSymbol clazz) {
JCTree tree = cx.trees.getTree(clazz); JCTree tree = cx.trees.getTree(clazz);
MethodRecordTranslator methodRecordTranslator = new MethodRecordTranslator(); MethodRecordTranslator methodRecordTranslator = new MethodRecordTranslator();
@ -68,17 +39,4 @@ public class EnableTestableInjectProcessor extends BaseProcessor {
tree.accept(new EnableTestableInjectTranslator(cx, methodRecordTranslator.getMethods())); tree.accept(new EnableTestableInjectTranslator(cx, methodRecordTranslator.getMethods()));
} }
private void writeBinaryFile(String path, String fileName, byte[] content) {
try {
FileObject resource = cx.filter.createResource(StandardLocation.SOURCE_OUTPUT, path, fileName);
OutputStream out = resource.openOutputStream();
out.write(content);
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
cx.logger.error("Failed to write " + fileName);
}
}
} }

View File

@ -2,6 +2,7 @@ package com.alibaba.testable.processor;
import com.alibaba.testable.annotation.EnableTestable; import com.alibaba.testable.annotation.EnableTestable;
import com.alibaba.testable.translator.EnableTestableTranslator; import com.alibaba.testable.translator.EnableTestableTranslator;
import com.alibaba.testable.util.ResourceUtil;
import com.sun.tools.javac.code.Symbol; import com.sun.tools.javac.code.Symbol;
import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree;
@ -12,6 +13,10 @@ import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element; import javax.lang.model.element.Element;
import javax.lang.model.element.Name; import javax.lang.model.element.Name;
import javax.lang.model.element.TypeElement; import javax.lang.model.element.TypeElement;
import javax.tools.FileObject;
import javax.tools.StandardLocation;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Set; import java.util.Set;
/** /**
@ -21,8 +26,12 @@ import java.util.Set;
@SupportedSourceVersion(SourceVersion.RELEASE_7) @SupportedSourceVersion(SourceVersion.RELEASE_7)
public class EnableTestableProcessor extends BaseProcessor { public class EnableTestableProcessor extends BaseProcessor {
private static final String TESTABLE_AGENT_JAR = "testable-agent.jar";
private static boolean hasFirstClassCompiled = false;
@Override @Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
createTestableAgentJar();
Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(EnableTestable.class); Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(EnableTestable.class);
for (Element element : elements) { for (Element element : elements) {
if (element.getKind().isClass() && isTestClass(element.getSimpleName())) { if (element.getKind().isClass() && isTestClass(element.getSimpleName())) {
@ -50,4 +59,34 @@ public class EnableTestableProcessor extends BaseProcessor {
return testClassName.substring(0, testClassName.length() - "Test".length()); return testClassName.substring(0, testClassName.length() - "Test".length());
} }
private void createTestableAgentJar() {
if (!checkFirstClassCompiled()) {
byte[] bytes = ResourceUtil.fetchBinary(TESTABLE_AGENT_JAR);
if (bytes.length == 0) {
cx.logger.error("Failed to generate testable agent jar");
}
writeBinaryFile("", TESTABLE_AGENT_JAR, bytes);
}
}
private boolean checkFirstClassCompiled() {
if (!hasFirstClassCompiled) {
hasFirstClassCompiled = true;
return false;
}
return true;
}
private void writeBinaryFile(String path, String fileName, byte[] content) {
try {
FileObject resource = cx.filter.createResource(StandardLocation.SOURCE_OUTPUT, path, fileName);
OutputStream out = resource.openOutputStream();
out.write(content);
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
cx.logger.error("Failed to write " + fileName);
}
}
} }