From 2de8ad9c204e222ac941287867bf9fa4c1eb56a8 Mon Sep 17 00:00:00 2001 From: Yoann Delouis Date: Wed, 12 Jun 2013 17:45:50 +0200 Subject: [PATCH] Handle RuntimeExceptionDao in @OrmLiteDao --- .../helper/CanonicalNameConstants.java | 1 + .../helper/ValidatorHelper.java | 10 ++++-- .../processing/EBeansHolder.java | 1 + .../processing/OrmLiteDaoProcessor.java | 33 ++++++++++++++++--- .../test15/ormlite/OrmLiteActivity.java | 4 +++ 5 files changed, 42 insertions(+), 7 deletions(-) diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/CanonicalNameConstants.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/CanonicalNameConstants.java index 587607d52f..2c3bc8bb26 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/CanonicalNameConstants.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/CanonicalNameConstants.java @@ -155,6 +155,7 @@ public final class CanonicalNameConstants { public static final String DAO_MANAGER = "com.j256.ormlite.dao.DaoManager"; public static final String CONNECTION_SOURCE = "com.j256.ormlite.support.ConnectionSource"; public static final String OPEN_HELPER_MANAGER = "com.j256.ormlite.android.apptools.OpenHelperManager"; + public static final String RUNTIME_EXCEPTION_DAO = "com.j256.ormlite.dao.RuntimeExceptionDao"; /* * HttpClient diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java index f9b372f963..39bb3e79e3 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java @@ -522,15 +522,19 @@ public void extendsOrmLiteDaoWithValidModelParameter(Element element, IsValid va TypeMirror modelTypeMirror = annotationHelper.extractAnnotationParameter(element, "model"); TypeElement daoTypeElement = annotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.DAO); + TypeElement runtimeExceptionDaoTypeElement = annotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.RUNTIME_EXCEPTION_DAO); + if (daoTypeElement != null) { TypeMirror wildcardType = annotationHelper.getTypeUtils().getWildcardType(null, null); DeclaredType daoParameterizedType = annotationHelper.getTypeUtils().getDeclaredType(daoTypeElement, modelTypeMirror, wildcardType); + DeclaredType runtimeExceptionDaoParameterizedType = annotationHelper.getTypeUtils().getDeclaredType(runtimeExceptionDaoTypeElement, modelTypeMirror, wildcardType); - // Checks that elementType extends Dao - if (!annotationHelper.isSubtype(elementType, daoParameterizedType)) { + // Checks that elementType extends Dao or RuntimeExceptionDao + if (!annotationHelper.isSubtype(elementType, daoParameterizedType) && !annotationHelper.isSubtype(elementType, runtimeExceptionDaoParameterizedType)) { valid.invalidate(); - annotationHelper.printAnnotationError(element, "%s can only be used on an element that extends " + daoParameterizedType.toString()); + annotationHelper.printAnnotationError(element, "%s can only be used on an element that extends " + daoParameterizedType.toString() // + + " or " + runtimeExceptionDaoParameterizedType.toString()); } } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeansHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeansHolder.java index bfc5e4137c..9f864686df 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeansHolder.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeansHolder.java @@ -136,6 +136,7 @@ public class Classes { */ public final JClass CONNECTION_SOURCE = refClass(CanonicalNameConstants.CONNECTION_SOURCE); public final JClass OPEN_HELPER_MANAGER = refClass(CanonicalNameConstants.OPEN_HELPER_MANAGER); + public final JClass RUNTIME_EXCEPTION_DAO = refClass(CanonicalNameConstants.RUNTIME_EXCEPTION_DAO); public final JClass DAO_MANAGER = refClass(CanonicalNameConstants.DAO_MANAGER); /* diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OrmLiteDaoProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OrmLiteDaoProcessor.java index bb87480891..924e6c1c9f 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OrmLiteDaoProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OrmLiteDaoProcessor.java @@ -20,9 +20,12 @@ import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.DeclaredType; import javax.lang.model.type.TypeMirror; import org.androidannotations.annotations.OrmLiteDao; +import org.androidannotations.helper.CanonicalNameConstants; import org.androidannotations.helper.TargetAnnotationHelper; import org.androidannotations.processing.EBeansHolder.Classes; @@ -82,13 +85,27 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { .arg(dbHelperClass)); } + + JExpression modelClass = holder.refClass(modelObjectTypeMirror.toString()).dotclass(); + + JExpression injectExpr; + if (elementExtendsRuntimeExceptionDao(element, modelObjectTypeMirror)) { + + injectExpr = classes.RUNTIME_EXCEPTION_DAO// + .staticInvoke("createDao") // + .arg(databaseHelperRef.invoke("getConnectionSource")) // + .arg(modelClass); + + } else { + + injectExpr = databaseHelperRef.invoke("getDao").arg(modelClass); + + } + // create dao from database helper JTryBlock tryBlock = initBody._try(); - JExpression modelClass = holder.refClass(modelObjectTypeMirror.toString()).dotclass(); - tryBlock.body().assign(ref(fieldName), // - databaseHelperRef.invoke("getDao"). // - arg(modelClass)); + tryBlock.body().assign(ref(fieldName), injectExpr); JCatchBlock catchBlock = tryBlock._catch(classes.SQL_EXCEPTION); JVar exception = catchBlock.param("e"); @@ -99,4 +116,12 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { .arg("Could not create DAO " + fieldName) // .arg(exception); } + + private boolean elementExtendsRuntimeExceptionDao(Element element, TypeMirror modelObjectTypeMirror) { + TypeMirror elementType = element.asType(); + TypeElement runtimeExceptionDaoTypeElement = helper.typeElementFromQualifiedName(CanonicalNameConstants.RUNTIME_EXCEPTION_DAO); + TypeMirror wildcardType = helper.getTypeUtils().getWildcardType(null, null); + DeclaredType runtimeExceptionDaoParameterizedType = helper.getTypeUtils().getDeclaredType(runtimeExceptionDaoTypeElement, modelObjectTypeMirror, wildcardType); + return helper.isSubtype(elementType, runtimeExceptionDaoParameterizedType); + } } diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ormlite/OrmLiteActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ormlite/OrmLiteActivity.java index d290cea18e..efd8076aa0 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ormlite/OrmLiteActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ormlite/OrmLiteActivity.java @@ -21,6 +21,7 @@ import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.OrmLiteDao; import com.j256.ormlite.dao.Dao; +import com.j256.ormlite.dao.RuntimeExceptionDao; @EActivity public class OrmLiteActivity extends Activity { @@ -30,6 +31,9 @@ public class OrmLiteActivity extends Activity { @OrmLiteDao(helper = DatabaseHelper.class, model = Car.class) Dao carDao; + @OrmLiteDao(helper = DatabaseHelper.class, model = Car.class) + RuntimeExceptionDao runtimeExceptionDao; + @Bean OrmLiteBean ormLiteBean; }