Skip to content

Commit c28d6ee

Browse files
committed
allow injection of custom RuntimeExceptionDao classes
1 parent 85f87d2 commit c28d6ee

4 files changed

Lines changed: 213 additions & 126 deletions

File tree

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/BaseAnnotationHandler.java‎

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515
*/
1616
package org.androidannotations.handler;
1717

18-
import com.sun.codemodel.JClass;
19-
import com.sun.codemodel.JCodeModel;
18+
import javax.annotation.processing.ProcessingEnvironment;
19+
import javax.lang.model.element.Element;
20+
import javax.lang.model.type.TypeMirror;
21+
2022
import org.androidannotations.helper.AndroidManifest;
2123
import org.androidannotations.helper.IdAnnotationHelper;
2224
import org.androidannotations.helper.IdValidatorHelper;
@@ -27,8 +29,8 @@
2729
import org.androidannotations.process.ProcessHolder;
2830
import org.androidannotations.rclass.IRClass;
2931

30-
import javax.annotation.processing.ProcessingEnvironment;
31-
import javax.lang.model.element.Element;
32+
import com.sun.codemodel.JClass;
33+
import com.sun.codemodel.JCodeModel;
3234

3335
public abstract class BaseAnnotationHandler<T extends GeneratedClassHolder> implements AnnotationHandler<T> {
3436

@@ -89,6 +91,10 @@ public JClass refClass(String fullyQualifiedClassName) {
8991
return processHolder.refClass(fullyQualifiedClassName);
9092
}
9193

94+
public JClass refClass(TypeMirror typeMirror) {
95+
return processHolder.refClass(typeMirror.toString());
96+
}
97+
9298
public JClass refClass(Class<?> clazz) {
9399
return processHolder.refClass(clazz);
94100
}

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/OrmLiteDaoHandler.java‎

Lines changed: 31 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -15,33 +15,42 @@
1515
*/
1616
package org.androidannotations.handler;
1717

18-
import com.sun.codemodel.*;
18+
import static com.sun.codemodel.JExpr._new;
19+
import static com.sun.codemodel.JExpr.cast;
20+
import static com.sun.codemodel.JExpr.ref;
21+
22+
import javax.annotation.processing.ProcessingEnvironment;
23+
import javax.lang.model.element.Element;
24+
import javax.lang.model.type.TypeMirror;
25+
1926
import org.androidannotations.annotations.OrmLiteDao;
27+
import org.androidannotations.helper.APTCodeModelHelper;
2028
import org.androidannotations.helper.CanonicalNameConstants;
29+
import org.androidannotations.helper.OrmLiteHelper;
2130
import org.androidannotations.helper.TargetAnnotationHelper;
2231
import org.androidannotations.holder.EComponentHolder;
2332
import org.androidannotations.model.AnnotationElements;
2433
import org.androidannotations.process.IsValid;
2534

26-
import javax.annotation.processing.ProcessingEnvironment;
27-
import javax.lang.model.element.Element;
28-
import javax.lang.model.element.TypeElement;
29-
import javax.lang.model.type.DeclaredType;
30-
import javax.lang.model.type.TypeKind;
31-
import javax.lang.model.type.TypeMirror;
32-
import java.util.List;
33-
34-
import static com.sun.codemodel.JExpr.ref;
35+
import com.sun.codemodel.JBlock;
36+
import com.sun.codemodel.JCatchBlock;
37+
import com.sun.codemodel.JClass;
38+
import com.sun.codemodel.JExpression;
39+
import com.sun.codemodel.JFieldVar;
40+
import com.sun.codemodel.JTryBlock;
41+
import com.sun.codemodel.JVar;
3542

3643
public class OrmLiteDaoHandler extends BaseAnnotationHandler<EComponentHolder> {
3744

38-
private TargetAnnotationHelper helper;
39-
private DeclaredType daoParametrizedType;
40-
private DeclaredType runtimeExceptionDaoParametrizedType;
45+
private final OrmLiteHelper ormLiteHelper;
46+
private final TargetAnnotationHelper helper;
47+
private final APTCodeModelHelper codeModelHelper;
4148

4249
public OrmLiteDaoHandler(ProcessingEnvironment processingEnvironment) {
4350
super(OrmLiteDao.class, processingEnvironment);
4451
helper = new TargetAnnotationHelper(processingEnv, getTarget());
52+
ormLiteHelper = new OrmLiteHelper(helper);
53+
codeModelHelper = new APTCodeModelHelper();
4554
}
4655

4756
@Override
@@ -52,37 +61,30 @@ public void validate(Element element, AnnotationElements validatedElements, IsVa
5261

5362
validatorHelper.isNotPrivate(element, valid);
5463

55-
validatorHelper.extendsOrmLiteDao(element, valid);
64+
validatorHelper.extendsOrmLiteDao(element, valid, ormLiteHelper);
5665

5766
validatorHelper.hasASqlLiteOpenHelperParameterizedType(element, valid);
5867
}
5968

6069
@Override
6170
public void process(Element element, EComponentHolder holder) {
62-
createDaoParametrizedTypes();
63-
6471
String fieldName = element.getSimpleName().toString();
6572

66-
JClass modelClass = getEntityAndIdClass(element, holder);
73+
JClass modelClass = refClass(ormLiteHelper.getEntityType(element));
74+
JClass idClass = refClass(ormLiteHelper.getEntityIdType(element));
6775
JExpression modelClassDotClass = modelClass.dotclass();
6876

77+
JClass daoClass = refClass(CanonicalNameConstants.DAO).narrow(modelClass, idClass);
78+
6979
TypeMirror databaseHelperTypeMirror = helper.extractAnnotationParameter(element, "helper");
7080
JFieldVar databaseHelperRef = holder.getDatabaseHelperRef(databaseHelperTypeMirror);
7181

7282
JBlock initBody = holder.getInitBody();
7383

74-
JExpression injectExpr;
84+
JExpression injectExpr = databaseHelperRef.invoke("getDao").arg(modelClassDotClass);
7585
if (elementExtendsRuntimeExceptionDao(element)) {
76-
77-
injectExpr = classes().RUNTIME_EXCEPTION_DAO//
78-
.staticInvoke("createDao") //
79-
.arg(databaseHelperRef.invoke("getConnectionSource")) //
80-
.arg(modelClassDotClass);
81-
82-
} else {
83-
84-
injectExpr = databaseHelperRef.invoke("getDao").arg(modelClassDotClass);
85-
86+
JClass daoImplClass = codeModelHelper.typeMirrorToJClass(element.asType(), holder);
87+
injectExpr = _new(daoImplClass).arg(cast(daoClass, injectExpr));
8688
}
8789

8890
JTryBlock tryBlock = initBody._try();
@@ -100,46 +102,6 @@ public void process(Element element, EComponentHolder holder) {
100102

101103
private boolean elementExtendsRuntimeExceptionDao(Element element) {
102104
TypeMirror elementType = element.asType();
103-
return helper.isSubtype(elementType, runtimeExceptionDaoParametrizedType);
104-
}
105-
106-
private JClass getEntityAndIdClass(Element element, EComponentHolder holder) {
107-
if (isSubtypeOfDao(element.asType())) {
108-
DeclaredType declaredType = (DeclaredType) element.asType();
109-
List<? extends TypeMirror> typeArguments = declaredType.getTypeArguments();
110-
if (typeArguments.size() == 2) {
111-
return holder.refClass(typeArguments.get(0).toString());
112-
}
113-
}
114-
115-
List<? extends TypeMirror> superTypes = helper.directSupertypes(element.asType());
116-
for (TypeMirror superType : superTypes) {
117-
118-
if (superType.getKind() == TypeKind.DECLARED && isSubtypeOfDao(superType)) {
119-
120-
DeclaredType superDeclaredType = (DeclaredType) superType;
121-
List<? extends TypeMirror> typeArguments = superDeclaredType.getTypeArguments();
122-
if (typeArguments.size() == 2) {
123-
return holder.refClass(typeArguments.get(0).toString());
124-
}
125-
}
126-
}
127-
return null;
128-
}
129-
130-
private boolean isSubtypeOfDao(TypeMirror type) {
131-
return helper.isSubtype(type, daoParametrizedType) || helper.isSubtype(type, runtimeExceptionDaoParametrizedType);
132-
}
133-
134-
/*
135-
* This method is not in the constructor because it prevents tests from
136-
* succeeding
137-
*/
138-
private void createDaoParametrizedTypes() {
139-
TypeMirror wildcardType = helper.getTypeUtils().getWildcardType(null, null);
140-
TypeElement daoTypeElement = helper.typeElementFromQualifiedName(CanonicalNameConstants.DAO);
141-
daoParametrizedType = helper.getTypeUtils().getDeclaredType(daoTypeElement, wildcardType, wildcardType);
142-
TypeElement runtimeExceptionDaoTypeElement = helper.typeElementFromQualifiedName(CanonicalNameConstants.RUNTIME_EXCEPTION_DAO);
143-
runtimeExceptionDaoParametrizedType = helper.getTypeUtils().getDeclaredType(runtimeExceptionDaoTypeElement, wildcardType, wildcardType);
105+
return helper.isSubtype(elementType, ormLiteHelper.getRuntimeExceptionDaoParametrizedType());
144106
}
145107
}

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/OrmLiteHelper.java‎

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,15 @@
1717

1818
import static com.sun.codemodel.JExpr._null;
1919

20+
import java.util.List;
21+
22+
import javax.lang.model.element.Element;
23+
import javax.lang.model.element.TypeElement;
24+
import javax.lang.model.type.DeclaredType;
25+
import javax.lang.model.type.TypeKind;
26+
import javax.lang.model.type.TypeMirror;
27+
import javax.lang.model.util.Types;
28+
2029
import org.androidannotations.holder.HasLifecycleMethods;
2130
import org.androidannotations.process.ProcessHolder;
2231

@@ -25,6 +34,92 @@
2534

2635
public class OrmLiteHelper {
2736

37+
private final TargetAnnotationHelper helper;
38+
39+
private DeclaredType daoParametrizedType;
40+
private DeclaredType runtimeExceptionDaoParametrizedType;
41+
42+
private TypeElement daoTypeElement;
43+
private TypeElement runtimeExceptionDaoTypeElement;
44+
45+
public OrmLiteHelper(TargetAnnotationHelper helper) {
46+
this.helper = helper;
47+
}
48+
49+
public TypeMirror getEntityType(Element element) {
50+
return getEntityOrIdType(element, 0);
51+
}
52+
53+
public TypeMirror getEntityIdType(Element element) {
54+
return getEntityOrIdType(element, 1);
55+
}
56+
57+
private TypeMirror getEntityOrIdType(Element element, int index) {
58+
if (isSubtypeOfDao(element.asType())) {
59+
DeclaredType declaredType = (DeclaredType) element.asType();
60+
List<? extends TypeMirror> typeArguments = declaredType.getTypeArguments();
61+
if (typeArguments.size() == 2) {
62+
return typeArguments.get(index);
63+
}
64+
}
65+
66+
List<? extends TypeMirror> superTypes = helper.directSupertypes(element.asType());
67+
for (TypeMirror superType : superTypes) {
68+
69+
if (superType.getKind() == TypeKind.DECLARED && isSubtypeOfDao(superType)) {
70+
71+
DeclaredType superDeclaredType = (DeclaredType) superType;
72+
List<? extends TypeMirror> typeArguments = superDeclaredType.getTypeArguments();
73+
if (typeArguments.size() == 2) {
74+
return typeArguments.get(index);
75+
}
76+
}
77+
}
78+
return null;
79+
}
80+
81+
private boolean isSubtypeOfDao(TypeMirror type) {
82+
return helper.isSubtype(type, daoParametrizedType) || helper.isSubtype(type, runtimeExceptionDaoParametrizedType);
83+
}
84+
85+
public DeclaredType getDaoParametrizedType() {
86+
if (daoParametrizedType == null) {
87+
createDaoParametrizedTypes();
88+
}
89+
return daoParametrizedType;
90+
}
91+
92+
public DeclaredType getRuntimeExceptionDaoParametrizedType() {
93+
if (runtimeExceptionDaoParametrizedType == null) {
94+
createDaoParametrizedTypes();
95+
}
96+
return runtimeExceptionDaoParametrizedType;
97+
}
98+
99+
public DeclaredType getTypedDao(Element element) {
100+
if (daoTypeElement == null) {
101+
createDaoParametrizedTypes();
102+
}
103+
return helper.getTypeUtils().getDeclaredType(daoTypeElement, getEntityType(element), getEntityIdType(element));
104+
}
105+
106+
public DeclaredType getTypedRuntimeExceptionDao(Element element) {
107+
if (runtimeExceptionDaoTypeElement == null) {
108+
createDaoParametrizedTypes();
109+
}
110+
return helper.getTypeUtils().getDeclaredType(runtimeExceptionDaoTypeElement, getEntityType(element), getEntityIdType(element));
111+
}
112+
113+
private void createDaoParametrizedTypes() {
114+
daoTypeElement = helper.typeElementFromQualifiedName(CanonicalNameConstants.DAO);
115+
runtimeExceptionDaoTypeElement = helper.typeElementFromQualifiedName(CanonicalNameConstants.RUNTIME_EXCEPTION_DAO);
116+
117+
Types typeUtils = helper.getTypeUtils();
118+
TypeMirror wildcardType = typeUtils.getWildcardType(null, null);
119+
daoParametrizedType = helper.getTypeUtils().getDeclaredType(daoTypeElement, wildcardType, wildcardType);
120+
runtimeExceptionDaoParametrizedType = helper.getTypeUtils().getDeclaredType(runtimeExceptionDaoTypeElement, wildcardType, wildcardType);
121+
}
122+
28123
public static void injectReleaseInDestroy(JFieldVar databaseHelperRef, HasLifecycleMethods holder, ProcessHolder.Classes classes) {
29124
JBlock destroyBody = holder.getOnDestroyBeforeSuperBlock();
30125

0 commit comments

Comments
 (0)