Skip to content

Commit d5b5256

Browse files
committed
Implemented @transactional with CodeModel
1 parent 54eceab commit d5b5256

File tree

2 files changed

+97
-30
lines changed

2 files changed

+97
-30
lines changed

AndroidAnnotations/src/main/java/com/googlecode/androidannotations/processing/TransactionalProcessor.java

Lines changed: 96 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -28,47 +28,114 @@
2828
import com.googlecode.androidannotations.model.Instruction;
2929
import com.googlecode.androidannotations.model.MetaActivity;
3030
import com.googlecode.androidannotations.model.MetaModel;
31+
import com.sun.codemodel.JBlock;
32+
import com.sun.codemodel.JCatchBlock;
33+
import com.sun.codemodel.JClass;
3134
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;
3241

3342
public class TransactionalProcessor implements ElementProcessor {
3443

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+
}
3948

40-
@Override
41-
public void process(Element element, MetaModel metaModel) {
49+
@Override
50+
public void process(Element element, MetaModel metaModel) {
4251

43-
String methodName = element.getSimpleName().toString();
52+
String methodName = element.getSimpleName().toString();
4453

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();
4958

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>();
5261

53-
ExecutableElement executableElement = (ExecutableElement) element;
62+
ExecutableElement executableElement = (ExecutableElement) element;
5463

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+
}
6170

62-
String returnType = executableElement.getReturnType().toString();
71+
String returnType = executableElement.getReturnType().toString();
6372

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+
}
6776

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+
}
73140

74141
}

HelloWorldEclipse/src/com/googlecode/androidannotations/helloworldeclipse/MyActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ void myTextView(MotionEvent event) {
125125
}
126126

127127
@Transactional
128-
int transactionalMethod(SQLiteDatabase db) {
128+
int transactionalMethod(SQLiteDatabase db, int someParam) {
129129
return 42;
130130
}
131131

0 commit comments

Comments
 (0)