From 4e794b5ed03e5020770becb068d11e6838feec64 Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Fri, 2 Aug 2013 21:57:54 +0200 Subject: wip --- .../container/compiler/TransactionalHandler.java | 126 ++++++++++----------- 1 file changed, 59 insertions(+), 67 deletions(-) (limited to 'container-compiler-plugin/src/main/java/io/trygvis/container/compiler/TransactionalHandler.java') 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("")) { - continue; - } + if (ee.getSimpleName().toString().equals("")) { + 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 parameters = new ArrayList<>(); - List arguments = new ArrayList<>(); - for (VariableElement ve : ee.getParameters()) { + List parameters = new ArrayList<>(); + List 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 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 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); } } -- cgit v1.2.3