1515 */
1616package 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+
1926import org .androidannotations .annotations .OrmLiteDao ;
27+ import org .androidannotations .helper .APTCodeModelHelper ;
2028import org .androidannotations .helper .CanonicalNameConstants ;
29+ import org .androidannotations .helper .OrmLiteHelper ;
2130import org .androidannotations .helper .TargetAnnotationHelper ;
2231import org .androidannotations .holder .EComponentHolder ;
2332import org .androidannotations .model .AnnotationElements ;
2433import 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
3643public 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}
0 commit comments