summaryrefslogtreecommitdiff
path: root/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/TransactionalHandler.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-compiler-plugin/src/main/java/io/trygvis/container/compiler/TransactionalHandler.java')
-rw-r--r--container-compiler-plugin/src/main/java/io/trygvis/container/compiler/TransactionalHandler.java126
1 files changed, 59 insertions, 67 deletions
diff --git a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/TransactionalHandler.java b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/TransactionalHandler.java
index 2877e15..d24a697 100644
--- a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/TransactionalHandler.java
+++ b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/TransactionalHandler.java
@@ -17,8 +17,6 @@ import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;
-import javax.lang.model.util.Elements;
-import javax.lang.model.util.Types;
import javax.tools.JavaFileObject;
import java.io.IOException;
import java.io.PrintWriter;
@@ -28,16 +26,10 @@ import java.util.List;
import static javax.lang.model.util.ElementFilter.constructorsIn;
import static org.springframework.util.StringUtils.collectionToDelimitedString;
-public class TransactionalHandler {
-
- private final ProcessingEnvironment processingEnv;
- private final Elements elements;
- private final Types types;
+public class TransactionalHandler extends AbstractHandler {
public TransactionalHandler(ProcessingEnvironment processingEnv) {
- this.processingEnv = processingEnv;
- this.elements = processingEnv.getElementUtils();
- this.types = processingEnv.getTypeUtils();
+ super(processingEnv);
}
public void processTransactional(TypeElement element) throws IOException {
@@ -46,80 +38,80 @@ public class TransactionalHandler {
Transactional transactional = element.getAnnotation(Transactional.class);
- String p = elements.getPackageOf(element).getQualifiedName().toString();
-
String className = targetClassName + "_Transactional";
- JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile(p + "." + className, element);
-
- try (PrintWriter w = new PrintWriter(sourceFile.openWriter())) {
- ClassG g = new ClassG(p, className, targetClassName.toString());
- FieldRef transactionManager = g.addField(PlatformTransactionManager.class, "transactionManager");
+ String p = elements.getPackageOf(element).getQualifiedName().toString();
- for (ExecutableElement constructor : constructorsIn(elements.getAllMembers(element))) {
- if (!constructor.getModifiers().contains(Modifier.PUBLIC)) {
- continue;
- }
+ ClassG g = new ClassG(p, className, targetClassName.toString());
+ FieldRef transactionManager = g.addField(PlatformTransactionManager.class, "transactionManager");
- constructor(g, constructor, transactionManager);
+ for (ExecutableElement constructor : constructorsIn(elements.getAllMembers(element))) {
+ if (!constructor.getModifiers().contains(Modifier.PUBLIC)) {
+ continue;
}
- Name javaLangObjectName = elements.getTypeElement("java.lang.Object").getQualifiedName();
+ constructor(g, constructor, transactionManager);
+ }
+
+ Name javaLangObjectName = elements.getTypeElement("java.lang.Object").getQualifiedName();
- for (Element e : elements.getAllMembers(element)) {
- if (!(e instanceof ExecutableElement)) {
- continue;
- }
+ for (Element e : elements.getAllMembers(element)) {
+ if (!(e instanceof ExecutableElement)) {
+ continue;
+ }
- ExecutableElement ee = (ExecutableElement) e;
+ ExecutableElement ee = (ExecutableElement) e;
- TypeElement enclosingElement = (TypeElement) ee.getEnclosingElement();
+ TypeElement enclosingElement = (TypeElement) ee.getEnclosingElement();
- if (enclosingElement.getQualifiedName().equals(javaLangObjectName)) {
- continue;
- }
+ if (enclosingElement.getQualifiedName().equals(javaLangObjectName)) {
+ continue;
+ }
- if (ee.getSimpleName().toString().equals("<init>")) {
- continue;
- }
+ if (ee.getSimpleName().toString().equals("<init>")) {
+ continue;
+ }
- TypeMirror returnTypeMirror = ee.getReturnType();
+ TypeMirror returnTypeMirror = ee.getReturnType();
- TypeKind kind = returnTypeMirror.getKind();
+ TypeKind kind = returnTypeMirror.getKind();
- boolean isVoid = kind == TypeKind.VOID;
- TypeRef returnType = isVoid ? TypeRef.VOID : g.addImport(returnTypeMirror);
+ boolean isVoid = kind == TypeKind.VOID;
+ TypeRef returnType = isVoid ? TypeRef.VOID : g.addImport(returnTypeMirror);
- List<ParameterRef> parameters = new ArrayList<>();
- List<String> arguments = new ArrayList<>();
- for (VariableElement ve : ee.getParameters()) {
+ List<ParameterRef> parameters = new ArrayList<>();
+ List<String> arguments = new ArrayList<>();
+ for (VariableElement ve : ee.getParameters()) {
// parameters.add("final " + ve.asType().toString() + " " + ve.getSimpleName().toString());
- TypeRef k = g.addImport(ve.asType());
- parameters.add(new ParameterRef(k, ve.getSimpleName().toString()));
- arguments.add(ve.getSimpleName().toString());
- }
-
- List<String> body = new ArrayList<>();
- body.add((isVoid ? "" : "return ") + "transactionManager.doInTransaction(");
- body.add(" PlatformTransactionManager.TransactionIsolation.ISOLATION_" + transactional.isolation() + ",");
- body.add(" PlatformTransactionManager.TransactionPropagation.PROPAGATION_" + transactional.propagation() + ",");
- body.add(" new PlatformTransactionManager.TransactionTemplate<" + (isVoid ? "Object" : returnTypeMirror) + ">() {");
- body.add(" @Override");
- body.add(" public " + (isVoid ? "Object" : returnTypeMirror) + " doInTransaction() {");
- String targetInvocation = className + ".super." + ee.getSimpleName() + "(" + collectionToDelimitedString(arguments, ", ") + ");";
-
- if (isVoid) {
- body.add(" " + targetInvocation);
- body.add(" return null;");
- } else {
- body.add(" return " + targetInvocation);
- }
-
- body.add(" }");
- body.add(" });");
-
- g.addMethod(body, returnType, ee.getSimpleName().toString(), parameters.toArray(new ParameterRef[arguments.size()]));
+ TypeRef k = g.addImport(ve.asType());
+ parameters.add(new ParameterRef(k, ve.getSimpleName().toString()));
+ arguments.add(ve.getSimpleName().toString());
}
+
+ List<String> body = new ArrayList<>();
+ body.add((isVoid ? "" : "return ") + "transactionManager.doInTransaction(");
+ body.add(" PlatformTransactionManager.TransactionIsolation.ISOLATION_" + transactional.isolation() + ",");
+ body.add(" PlatformTransactionManager.TransactionPropagation.PROPAGATION_" + transactional.propagation() + ",");
+ body.add(" new PlatformTransactionManager.TransactionTemplate<" + (isVoid ? "Object" : returnTypeMirror) + ">() {");
+ body.add(" @Override");
+ body.add(" public " + (isVoid ? "Object" : returnTypeMirror) + " doInTransaction() {");
+ String targetInvocation = className + ".super." + ee.getSimpleName() + "(" + collectionToDelimitedString(arguments, ", ") + ");";
+
+ if (isVoid) {
+ body.add(" " + targetInvocation);
+ body.add(" return null;");
+ } else {
+ body.add(" return " + targetInvocation);
+ }
+
+ body.add(" }");
+ body.add(" });");
+
+ g.addMethod(body, returnType, ee.getSimpleName().toString(), parameters.toArray(new ParameterRef[arguments.size()]));
+ }
+
+ JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile((p.length() == 0 ? "" : p + ".") + className, element);
+ try (PrintWriter w = new PrintWriter(sourceFile.openWriter())) {
g.write(w);
}
}