|
28 | 28 | import com.googlecode.androidannotations.model.Instruction; |
29 | 29 | import com.googlecode.androidannotations.model.MetaActivity; |
30 | 30 | import com.googlecode.androidannotations.model.MetaModel; |
| 31 | +import com.sun.codemodel.JBlock; |
| 32 | +import com.sun.codemodel.JCatchBlock; |
| 33 | +import com.sun.codemodel.JClass; |
31 | 34 | import com.sun.codemodel.JCodeModel; |
| 35 | +import com.sun.codemodel.JExpr; |
| 36 | +import com.sun.codemodel.JInvocation; |
| 37 | +import com.sun.codemodel.JMethod; |
| 38 | +import com.sun.codemodel.JMod; |
| 39 | +import com.sun.codemodel.JTryBlock; |
| 40 | +import com.sun.codemodel.JVar; |
32 | 41 |
|
33 | 42 | public class TransactionalProcessor implements ElementProcessor { |
34 | 43 |
|
35 | | - @Override |
36 | | - public Class<? extends Annotation> getTarget() { |
37 | | - return Transactional.class; |
38 | | - } |
| 44 | + @Override |
| 45 | + public Class<? extends Annotation> getTarget() { |
| 46 | + return Transactional.class; |
| 47 | + } |
39 | 48 |
|
40 | | - @Override |
41 | | - public void process(Element element, MetaModel metaModel) { |
| 49 | + @Override |
| 50 | + public void process(Element element, MetaModel metaModel) { |
42 | 51 |
|
43 | | - String methodName = element.getSimpleName().toString(); |
| 52 | + String methodName = element.getSimpleName().toString(); |
44 | 53 |
|
45 | | - Element enclosingElement = element.getEnclosingElement(); |
46 | | - MetaActivity metaActivity = metaModel.getMetaActivities().get(enclosingElement); |
47 | | - String className = metaActivity.getClassSimpleName(); |
48 | | - List<Instruction> memberInstructions = metaActivity.getMemberInstructions(); |
| 54 | + Element enclosingElement = element.getEnclosingElement(); |
| 55 | + MetaActivity metaActivity = metaModel.getMetaActivities().get(enclosingElement); |
| 56 | + String className = metaActivity.getClassSimpleName(); |
| 57 | + List<Instruction> memberInstructions = metaActivity.getMemberInstructions(); |
49 | 58 |
|
50 | | - List<String> methodArguments = new ArrayList<String>(); |
51 | | - List<String> methodParameters = new ArrayList<String>(); |
| 59 | + List<String> methodArguments = new ArrayList<String>(); |
| 60 | + List<String> methodParameters = new ArrayList<String>(); |
52 | 61 |
|
53 | | - ExecutableElement executableElement = (ExecutableElement) element; |
| 62 | + ExecutableElement executableElement = (ExecutableElement) element; |
54 | 63 |
|
55 | | - for (VariableElement parameter : executableElement.getParameters()) { |
56 | | - String parameterName = parameter.getSimpleName().toString(); |
57 | | - String parameterType = parameter.asType().toString(); |
58 | | - methodArguments.add(parameterType + " " + parameterName); |
59 | | - methodParameters.add(parameterName); |
60 | | - } |
| 64 | + for (VariableElement parameter : executableElement.getParameters()) { |
| 65 | + String parameterName = parameter.getSimpleName().toString(); |
| 66 | + String parameterType = parameter.asType().toString(); |
| 67 | + methodArguments.add(parameterType + " " + parameterName); |
| 68 | + methodParameters.add(parameterName); |
| 69 | + } |
61 | 70 |
|
62 | | - String returnType = executableElement.getReturnType().toString(); |
| 71 | + String returnType = executableElement.getReturnType().toString(); |
63 | 72 |
|
64 | | - Instruction instruction = new TransactionalInstruction(methodName, className, methodArguments, methodParameters, returnType); |
65 | | - memberInstructions.add(instruction); |
66 | | - } |
| 73 | + Instruction instruction = new TransactionalInstruction(methodName, className, methodArguments, methodParameters, returnType); |
| 74 | + memberInstructions.add(instruction); |
| 75 | + } |
67 | 76 |
|
68 | | - @Override |
69 | | - public void process(Element element, JCodeModel codeModel, ActivitiesHolder activitiesHolder) { |
70 | | - // TODO Auto-generated method stub |
71 | | - |
72 | | - } |
| 77 | + @Override |
| 78 | + public void process(Element element, JCodeModel codeModel, ActivitiesHolder activitiesHolder) { |
| 79 | + ActivityHolder holder = activitiesHolder.getActivityHolder(element); |
| 80 | + |
| 81 | + String methodName = element.getSimpleName().toString(); |
| 82 | + ExecutableElement executableElement = (ExecutableElement) element; |
| 83 | + |
| 84 | + String returnTypeName = executableElement.getReturnType().toString(); |
| 85 | + JClass returnType = holder.refClass(returnTypeName); |
| 86 | + |
| 87 | + JMethod method = holder.activity.method(JMod.PUBLIC, returnType, methodName); |
| 88 | + method.annotate(Override.class); |
| 89 | + |
| 90 | + List<JVar> params = new ArrayList<JVar>(); |
| 91 | + for (VariableElement parameter : executableElement.getParameters()) { |
| 92 | + String parameterName = parameter.getSimpleName().toString(); |
| 93 | + String parameterType = parameter.asType().toString(); |
| 94 | + JVar param = method.param(holder.refClass(parameterType), parameterName); |
| 95 | + params.add(param); |
| 96 | + } |
| 97 | + |
| 98 | + JVar db = params.get(0); |
| 99 | + |
| 100 | + JBlock body = method.body(); |
| 101 | + |
| 102 | + body.invoke(db, "beginTransaction"); |
| 103 | + |
| 104 | + JTryBlock tryBlock = body._try(); |
| 105 | + |
| 106 | + JInvocation superCall = JExpr.invoke(JExpr._super(), method); |
| 107 | + for(JVar param : params) { |
| 108 | + superCall.arg(param); |
| 109 | + } |
| 110 | + JBlock tryBody = tryBlock.body(); |
| 111 | + if (returnTypeName.equals("void")) { |
| 112 | + tryBody.add(superCall); |
| 113 | + tryBody.invoke(db, "setTransactionSuccessful"); |
| 114 | + tryBody._return(); |
| 115 | + } else { |
| 116 | + JVar result = tryBody.decl(returnType, "result_", superCall); |
| 117 | + tryBody.invoke(db, "setTransactionSuccessful"); |
| 118 | + tryBody._return(result); |
| 119 | + } |
| 120 | + |
| 121 | + JCatchBlock catchBlock = tryBlock._catch(codeModel.ref(RuntimeException.class)); |
| 122 | + |
| 123 | + JVar exceptionParam = catchBlock.param("e"); |
| 124 | + |
| 125 | + JBlock catchBody = catchBlock.body(); |
| 126 | + |
| 127 | + JClass logClass = holder.refClass("android.util.Log"); |
| 128 | + JInvocation errorInvoke = catchBody.staticInvoke(logClass, "e"); |
| 129 | + |
| 130 | + errorInvoke.arg(holder.activity.name()); |
| 131 | + errorInvoke.arg("Error in transaction"); |
| 132 | + errorInvoke.arg(exceptionParam); |
| 133 | + |
| 134 | + catchBody._throw(exceptionParam); |
| 135 | + |
| 136 | + tryBlock._finally().invoke(db, "endTransaction"); |
| 137 | + |
| 138 | + |
| 139 | + } |
73 | 140 |
|
74 | 141 | } |
0 commit comments