From 8bcb84eacc67832bd41d58140b11bbd027b99749 Mon Sep 17 00:00:00 2001
From: Peter Vincent <39063789+dev4vin@users.noreply.github.com>
Date: Sun, 2 Aug 2020 21:49:18 +0300
Subject: [PATCH 01/34] Adding typeconverter
---
.idea/gradle.xml | 2 +-
commons/build.gradle | 3 -
.../src/main/java/promise/db/ColumnInfo.kt | 8 +-
compiler/build.gradle | 37 -----
.../java/promise/db/ompiler/ClassProcessor.kt | 22 +++
...CodeBlockGenerator.kt => CodeGenerator.kt} | 2 +-
...kt => DatabaseAbstractMethodsGenerator.kt} | 5 +-
.../DatabaseAnnotationGenerator.kt | 9 +-
...kt => DatabaseCrudStubMethodsGenerator.kt} | 4 +-
.../db/ompiler/DatabaseEntityProcessor.kt | 89 +++++++++++
....kt => DatabaseMigrationFieldGenerator.kt} | 8 +-
.../promise/db/ompiler/DatabaseProcessor.kt | 150 ------------------
...r.kt => DatabaseStaticMethodsGenerator.kt} | 25 ++-
.../promise/db/ompiler/EntityProcessor.kt | 107 +++----------
.../java/promise/db/ompiler/JavaUtils.java | 84 +++++++---
.../db/ompiler/PersistableEntityUtils.kt | 83 +++++++++-
.../db/ompiler/PromiseDatabaseCompiler.kt | 98 ++++++++++++
.../{relations => }/RelationsGenerator.kt | 5 +-
.../TableAnnotationGenerator.java | 6 +-
...rator.kt => TableColumnFieldsGenerator.kt} | 122 ++++++++------
...kt => TableDeserializerMethodGenerator.kt} | 4 +-
... TableRegisteredColumnsMethodGenerator.kt} | 7 +-
...r.kt => TableSerializerMethodGenerator.kt} | 4 +-
.../db/ompiler/TypeConverterProcessor.kt | 119 ++++++++++++++
.../src/main/java/promise/db/ompiler/Utils.kt | 1 +
.../ompiler/PersistableEntityUtilsKtTest.kt | 30 ++++
database/build.gradle | 1 -
27 files changed, 647 insertions(+), 388 deletions(-)
create mode 100644 compiler/src/main/java/promise/db/ompiler/ClassProcessor.kt
rename compiler/src/main/java/promise/db/ompiler/{CodeBlockGenerator.kt => CodeGenerator.kt} (94%)
rename compiler/src/main/java/promise/db/ompiler/{DatabaseAbstractFuncsGenerator.kt => DatabaseAbstractMethodsGenerator.kt} (97%)
rename compiler/src/main/java/promise/db/ompiler/{annotation => }/DatabaseAnnotationGenerator.kt (87%)
rename compiler/src/main/java/promise/db/ompiler/{DatabaseCrudStubsGenerator.kt => DatabaseCrudStubMethodsGenerator.kt} (90%)
create mode 100644 compiler/src/main/java/promise/db/ompiler/DatabaseEntityProcessor.kt
rename compiler/src/main/java/promise/db/ompiler/{migration/MigrationGenerator.kt => DatabaseMigrationFieldGenerator.kt} (94%)
delete mode 100644 compiler/src/main/java/promise/db/ompiler/DatabaseProcessor.kt
rename compiler/src/main/java/promise/db/ompiler/{DatabaseCompanionPropsGenerator.kt => DatabaseStaticMethodsGenerator.kt} (94%)
create mode 100644 compiler/src/main/java/promise/db/ompiler/PromiseDatabaseCompiler.kt
rename compiler/src/main/java/promise/db/ompiler/{relations => }/RelationsGenerator.kt (93%)
rename compiler/src/main/java/promise/db/ompiler/{annotation => }/TableAnnotationGenerator.java (97%)
rename compiler/src/main/java/promise/db/ompiler/{TableColumnPropsGenerator.kt => TableColumnFieldsGenerator.kt} (55%)
rename compiler/src/main/java/promise/db/ompiler/{DeserializerGenerator.kt => TableDeserializerMethodGenerator.kt} (97%)
rename compiler/src/main/java/promise/db/ompiler/{RegisterColumnsGenerator.kt => TableRegisteredColumnsMethodGenerator.kt} (89%)
rename compiler/src/main/java/promise/db/ompiler/{SerializerGenerator.kt => TableSerializerMethodGenerator.kt} (96%)
create mode 100644 compiler/src/main/java/promise/db/ompiler/TypeConverterProcessor.kt
create mode 100644 compiler/src/test/java/promise/db/ompiler/PersistableEntityUtilsKtTest.kt
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index ecfc06b..a018472 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -11,10 +11,10 @@
diff --git a/commons/build.gradle b/commons/build.gradle
index ecc89a1..35e2feb 100644
--- a/commons/build.gradle
+++ b/commons/build.gradle
@@ -13,12 +13,9 @@
apply plugin: 'java-library'
apply plugin: 'kotlin'
-
apply plugin: 'maven'
-
dependencies {
- implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}
diff --git a/commons/src/main/java/promise/db/ColumnInfo.kt b/commons/src/main/java/promise/db/ColumnInfo.kt
index 8d69f50..788f778 100644
--- a/commons/src/main/java/promise/db/ColumnInfo.kt
+++ b/commons/src/main/java/promise/db/ColumnInfo.kt
@@ -12,6 +12,7 @@
*/
package promise.db
+import kotlin.reflect.KClass
@Target(AnnotationTarget.FIELD)
@Retention(AnnotationRetention.SOURCE)
@@ -64,8 +65,13 @@ annotation class Migrate(val fromVersion: Int,
val action: MigrationOptions)
-
@Target(AnnotationTarget.FIELD)
@Retention(AnnotationRetention.SOURCE)
annotation class Migrations(val values: Array)
+@Target(AnnotationTarget.FIELD, AnnotationTarget.CLASS)
+@Retention(AnnotationRetention.SOURCE)
+annotation class TypeConverter
+
+
+
diff --git a/compiler/build.gradle b/compiler/build.gradle
index df1b268..6a3f654 100644
--- a/compiler/build.gradle
+++ b/compiler/build.gradle
@@ -16,45 +16,8 @@ import org.gradle.internal.jvm.Jvm
apply plugin: 'java-library'
apply plugin: 'kotlin'
apply plugin: 'kotlin-kapt'
-
-
apply plugin: 'maven'
-
-
-//android {
-// compileSdkVersion 29
-// buildToolsVersion "29.0.2"
-//
-// defaultConfig {
-// minSdkVersion 21
-// targetSdkVersion 29
-// versionCode 1
-// versionName "1.0"
-//
-// testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
-// consumerProguardFiles 'consumer-rules.pro'
-// }
-//
-// buildTypes {
-// release {
-// minifyEnabled false
-// proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
-// }
-//
-// debug {
-//
-// }
-// }
-//
-//
-// compileOptions {
-// sourceCompatibility = '1.8'
-// targetCompatibility = '1.8'
-// }
-//
-//}
-
dependencies {
compileOnly project(path: ':commons')
//compileOnly files(Jvm.current().getJre().homeDir.getAbsolutePath()+'/lib/rt.jar')
diff --git a/compiler/src/main/java/promise/db/ompiler/ClassProcessor.kt b/compiler/src/main/java/promise/db/ompiler/ClassProcessor.kt
new file mode 100644
index 0000000..4b02275
--- /dev/null
+++ b/compiler/src/main/java/promise/db/ompiler/ClassProcessor.kt
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2017, Peter Vincent
+ * Licensed under the Apache License, Version 2.0, Android Promise.
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package promise.db.ompiler
+
+import com.squareup.javapoet.JavaFile
+import javax.annotation.processing.ProcessingEnvironment
+import javax.annotation.processing.RoundEnvironment
+
+abstract class ClassProcessor {
+ abstract fun process( environment: RoundEnvironment?): List?
+}
\ No newline at end of file
diff --git a/compiler/src/main/java/promise/db/ompiler/CodeBlockGenerator.kt b/compiler/src/main/java/promise/db/ompiler/CodeGenerator.kt
similarity index 94%
rename from compiler/src/main/java/promise/db/ompiler/CodeBlockGenerator.kt
rename to compiler/src/main/java/promise/db/ompiler/CodeGenerator.kt
index d99b4f6..ac32e65 100644
--- a/compiler/src/main/java/promise/db/ompiler/CodeBlockGenerator.kt
+++ b/compiler/src/main/java/promise/db/ompiler/CodeGenerator.kt
@@ -14,7 +14,7 @@
package promise.db.ompiler
-interface CodeBlockGenerator {
+interface CodeGenerator {
@Throws(Exception::class)
fun generate(): T
}
\ No newline at end of file
diff --git a/compiler/src/main/java/promise/db/ompiler/DatabaseAbstractFuncsGenerator.kt b/compiler/src/main/java/promise/db/ompiler/DatabaseAbstractMethodsGenerator.kt
similarity index 97%
rename from compiler/src/main/java/promise/db/ompiler/DatabaseAbstractFuncsGenerator.kt
rename to compiler/src/main/java/promise/db/ompiler/DatabaseAbstractMethodsGenerator.kt
index 59980f8..6d584c1 100644
--- a/compiler/src/main/java/promise/db/ompiler/DatabaseAbstractFuncsGenerator.kt
+++ b/compiler/src/main/java/promise/db/ompiler/DatabaseAbstractMethodsGenerator.kt
@@ -29,10 +29,9 @@ import javax.lang.model.type.TypeKind
import javax.lang.model.util.ElementFilter
import javax.tools.Diagnostic
-
-class DatabaseAbstractFuncsGenerator(
+class DatabaseAbstractMethodsGenerator(
private val element: TypeElement,
- private val processingEnv: ProcessingEnvironment) : CodeBlockGenerator?> {
+ private val processingEnv: ProcessingEnvironment) : CodeGenerator?> {
override fun generate(): List? {
diff --git a/compiler/src/main/java/promise/db/ompiler/annotation/DatabaseAnnotationGenerator.kt b/compiler/src/main/java/promise/db/ompiler/DatabaseAnnotationGenerator.kt
similarity index 87%
rename from compiler/src/main/java/promise/db/ompiler/annotation/DatabaseAnnotationGenerator.kt
rename to compiler/src/main/java/promise/db/ompiler/DatabaseAnnotationGenerator.kt
index c949ffb..e4b73a4 100644
--- a/compiler/src/main/java/promise/db/ompiler/annotation/DatabaseAnnotationGenerator.kt
+++ b/compiler/src/main/java/promise/db/ompiler/DatabaseAnnotationGenerator.kt
@@ -11,16 +11,11 @@
* limitations under the License.
*/
-package promise.db.ompiler.annotation
+package promise.db.ompiler
import com.squareup.javapoet.AnnotationSpec
import com.squareup.javapoet.ClassName
import com.squareup.javapoet.CodeBlock
-import promise.db.ompiler.CodeBlockGenerator
-import promise.db.ompiler.Utils
-import promise.db.ompiler.getClassName
-import promise.db.ompiler.getDatabaseVersion
-import promise.db.ompiler.getTableEntities
import javax.annotation.processing.ProcessingEnvironment
import javax.lang.model.element.Element
import javax.lang.model.element.TypeElement
@@ -29,7 +24,7 @@ import javax.tools.Diagnostic
class DatabaseAnnotationGenerator(
private val processingEnv: ProcessingEnvironment,
- private val element: Element) : CodeBlockGenerator {
+ private val element: Element) : CodeGenerator {
/*
@Database(
tables = [
diff --git a/compiler/src/main/java/promise/db/ompiler/DatabaseCrudStubsGenerator.kt b/compiler/src/main/java/promise/db/ompiler/DatabaseCrudStubMethodsGenerator.kt
similarity index 90%
rename from compiler/src/main/java/promise/db/ompiler/DatabaseCrudStubsGenerator.kt
rename to compiler/src/main/java/promise/db/ompiler/DatabaseCrudStubMethodsGenerator.kt
index a1239c2..0512480 100644
--- a/compiler/src/main/java/promise/db/ompiler/DatabaseCrudStubsGenerator.kt
+++ b/compiler/src/main/java/promise/db/ompiler/DatabaseCrudStubMethodsGenerator.kt
@@ -18,10 +18,10 @@ import javax.annotation.processing.ProcessingEnvironment
import javax.lang.model.element.Element
import javax.lang.model.element.TypeElement
-class DatabaseCrudStubsGenerator(
+class DatabaseCrudStubMethodsGenerator(
private val typeSpec: TypeSpec.Builder,
private val element: Element,
- private val processingEnv: ProcessingEnvironment) : CodeBlockGenerator {
+ private val processingEnv: ProcessingEnvironment) : CodeGenerator {
override fun generate(): String {
val pack = processingEnv.elementUtils.getPackageOf(element).toString()
diff --git a/compiler/src/main/java/promise/db/ompiler/DatabaseEntityProcessor.kt b/compiler/src/main/java/promise/db/ompiler/DatabaseEntityProcessor.kt
new file mode 100644
index 0000000..7f6d06e
--- /dev/null
+++ b/compiler/src/main/java/promise/db/ompiler/DatabaseEntityProcessor.kt
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2017, Peter Vincent
+ * Licensed under the Apache License, Version 2.0, Android Promise.
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package promise.db.ompiler
+
+import com.squareup.javapoet.ClassName
+import com.squareup.javapoet.FieldSpec
+import com.squareup.javapoet.JavaFile
+import com.squareup.javapoet.MethodSpec
+import com.squareup.javapoet.TypeSpec
+import promise.db.DatabaseEntity
+import javax.annotation.processing.ProcessingEnvironment
+import javax.annotation.processing.RoundEnvironment
+import javax.lang.model.element.Element
+import javax.lang.model.element.ElementKind
+import javax.lang.model.element.Modifier
+import javax.lang.model.element.TypeElement
+import javax.tools.Diagnostic
+
+class DatabaseEntityProcessor(private val processingEnv: ProcessingEnvironment): ClassProcessor() {
+
+ override fun process(environment: RoundEnvironment?): List? {
+ return environment?.getElementsAnnotatedWith(DatabaseEntity::class.java)
+ ?.map { element ->
+ if (element.kind != ElementKind.CLASS) {
+ processingEnv.messager.printMessage(Diagnostic.Kind.ERROR, "Only classes can be annotated")
+ return null
+ }
+// if (JavaUtils.isSubtypeOfType(element.asType(), "promise.db.PromiseDatabase")) {
+// processElement(element)
+// }
+// processingEnv.messager.printMessage(Diagnostic.Kind.ERROR, "Database class must extend from promise.db.PromiseDatabase")
+// null
+
+ processElement(element)
+ }
+ }
+
+ private fun processElement(element: Element): JavaFile.Builder {
+ processingEnv.messager.printMessage(Diagnostic.Kind.OTHER, "DatabaseProcessor Processing: ${element.simpleName}")
+
+ val className = element.simpleName.toString()
+ val pack = processingEnv.elementUtils.getPackageOf(element).toString()
+
+ val fileName = "${className}_Impl"
+
+ val tableAnnotationSpec = DatabaseAnnotationGenerator(processingEnv, element).generate()
+
+ val classBuilder = TypeSpec.classBuilder(fileName)
+
+ val constructorMethod = MethodSpec.constructorBuilder()
+ .addParameter(ClassName.get("promise.db", "FastDatabase"),
+ "fastDatabase")
+ .addModifiers(Modifier.PRIVATE)
+ .addStatement("super()")
+ .addStatement("this.instance = fastDatabase")
+ if (TypeConverterProcessor.typeConverter != null) {
+ JavaUtils.generateAddConverterStatementInDatabaseConstructorMethod(processingEnv, constructorMethod, TypeConverterProcessor.typeConverter!!)
+ }
+ classBuilder.superclass(ClassName.get(pack, className))
+ .addAnnotation(tableAnnotationSpec)
+ .addModifiers(Modifier.PUBLIC, Modifier.FINAL)
+ .addMethod(constructorMethod
+ .build())
+
+ DatabaseStaticMethodsGenerator(classBuilder, element, processingEnv).generate()
+
+ val abstractFuncsBuilder = DatabaseAbstractMethodsGenerator((element as TypeElement), processingEnv)
+
+ abstractFuncsBuilder.generate()?.forEach {
+ classBuilder.addMethod(it)
+ }
+
+ DatabaseCrudStubMethodsGenerator(classBuilder, element, processingEnv).generate()
+
+ return JavaFile.builder(pack, classBuilder.build())
+
+ }
+}
\ No newline at end of file
diff --git a/compiler/src/main/java/promise/db/ompiler/migration/MigrationGenerator.kt b/compiler/src/main/java/promise/db/ompiler/DatabaseMigrationFieldGenerator.kt
similarity index 94%
rename from compiler/src/main/java/promise/db/ompiler/migration/MigrationGenerator.kt
rename to compiler/src/main/java/promise/db/ompiler/DatabaseMigrationFieldGenerator.kt
index a082e25..98fdc90 100644
--- a/compiler/src/main/java/promise/db/ompiler/migration/MigrationGenerator.kt
+++ b/compiler/src/main/java/promise/db/ompiler/DatabaseMigrationFieldGenerator.kt
@@ -11,7 +11,7 @@
* limitations under the License.
*/
-package promise.db.ompiler.migration
+package promise.db.ompiler
import com.squareup.javapoet.AnnotationSpec
import com.squareup.javapoet.ClassName
@@ -21,13 +21,11 @@ import org.jetbrains.annotations.NotNull
import promise.db.Migrate
import promise.db.MigrationOptions
import promise.db.Migrations
-import promise.db.ompiler.CodeBlockGenerator
-import promise.db.ompiler.getNameOfColumn
import javax.lang.model.element.Element
import javax.lang.model.element.Modifier
-class MigrationGenerator(
- private val elements: Map) : CodeBlockGenerator {
+class DatabaseMigrationFieldGenerator(
+ private val elements: Map) : CodeGenerator {
init {
//fileSpec.addImport("android.content", "ContentValues")
}
diff --git a/compiler/src/main/java/promise/db/ompiler/DatabaseProcessor.kt b/compiler/src/main/java/promise/db/ompiler/DatabaseProcessor.kt
deleted file mode 100644
index 75cf95a..0000000
--- a/compiler/src/main/java/promise/db/ompiler/DatabaseProcessor.kt
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright 2017, Peter Vincent
- * Licensed under the Apache License, Version 2.0, Android Promise.
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package promise.db.ompiler
-
-import com.squareup.javapoet.ClassName
-import com.squareup.javapoet.JavaFile
-import com.squareup.javapoet.MethodSpec
-import com.squareup.javapoet.TypeSpec
-import promise.db.DatabaseEntity
-import promise.db.ompiler.annotation.DatabaseAnnotationGenerator
-import javax.annotation.processing.ProcessingEnvironment
-import javax.annotation.processing.RoundEnvironment
-import javax.lang.model.element.Element
-import javax.lang.model.element.ElementKind
-import javax.lang.model.element.Modifier
-import javax.lang.model.element.TypeElement
-import javax.tools.Diagnostic
-
-class DatabaseProcessor(private val processingEnv: ProcessingEnvironment) {
- fun process(_mutableSet: MutableSet?, environment: RoundEnvironment?): Boolean {
- environment?.getElementsAnnotatedWith(DatabaseEntity::class.java)
- ?.forEach { element ->
- if (element.kind != ElementKind.CLASS) {
- processingEnv.messager.printMessage(Diagnostic.Kind.ERROR, "Only classes can be annotated")
- return false
- }
-// val promiseDatabaseInterface = processingEnv.elementUtils.getTypeElement("promise.db.PromiseDatabase")
-// if (JavaUtils.implementsInterface(processingEnv, element as TypeElement, promiseDatabaseInterface.asType())) {
-// processElement(element)
-// }
-// else {
-// processingEnv.messager.printMessage(Diagnostic.Kind.ERROR, "The database class ${element.simpleName} must implement PromiseDatabase")
-// return false
-// }
- processElement(element)
- }
- return true
- }
-
- private fun processElement(element: Element) {
- processingEnv.messager.printMessage(Diagnostic.Kind.OTHER, "DatabaseProcessor Processing: ${element.simpleName}")
-
- val className = element.simpleName.toString()
- val pack = processingEnv.elementUtils.getPackageOf(element).toString()
-
- val fileName = "${className}_Impl"
-
- //fileBuilder.addComment("Generated by Promise database compiler")
-
- //fileBuilder.addImport(pack, className)
- val tableAnnotationSpec = DatabaseAnnotationGenerator(processingEnv, element).generate()
-
- val classBuilder = TypeSpec.classBuilder(fileName)
- classBuilder.superclass(ClassName.get(pack, className))
- .addAnnotation(tableAnnotationSpec)
- .addModifiers(Modifier.PUBLIC, Modifier.FINAL)
- .addMethod(MethodSpec.constructorBuilder()
- .addParameter(ClassName.get("promise.db", "FastDatabase"),"instance")
- .addModifiers(Modifier.PRIVATE)
- .addStatement("super()")
- .addStatement("this.instance = instance")
- .build())
- DatabaseCompanionPropsGenerator(classBuilder, element, processingEnv).generate()
-
- val abstractFuncsBuilder = DatabaseAbstractFuncsGenerator((element as TypeElement), processingEnv)
-
- abstractFuncsBuilder.generate()?.forEach {
- classBuilder.addMethod(it)
- }
-
- DatabaseCrudStubsGenerator(classBuilder, element, processingEnv).generate()
-
-// // static column block generation
-// val columnsGenerator: ColumnsGenerator = ColumnsGenerator(fileBuilder, processingEnv, element.enclosedElements)
-// val companionBuilder = TypeSpec.companionObjectBuilder()
-//
-// val idColumnSpec = PropertySpec.builder("idColumn", ClassName("promise.db", "Column")
-// .parameterizedBy(Int::class.asTypeName()))
-// .initializer(CodeBlock.of("""
-// id
-// """.trimIndent())
-// )
-// .build()
-//
-// companionBuilder.addProperty(idColumnSpec)
-//
-// val columnSpecs = columnsGenerator.generate()
-//
-// columnSpecs.values.forEach {
-// companionBuilder.addProperty(it)
-// }
-//
-// classBuilder.addType(companionBuilder.build())
-//
-// // column register generation
-// val columnRegSpecGenerator = RegisterColumnsGenerator(fileBuilder, columnsGenerator.genColValues.map { it.second })
-// classBuilder.addProperty(columnRegSpecGenerator.generate())
-//
-// // serializer generator
-// val serializerGenerator = SerializerGenerator(fileBuilder, pack, className, columnsGenerator.genColValues)
-// classBuilder.addFunction(serializerGenerator.generate())
-//
-// // deserializer generator
-// val deserializerGenerator = DeserializerGenerator(fileBuilder, processingEnv,
-// pack, className, columnsGenerator.genColValues)
-// classBuilder.addFunction(deserializerGenerator.generate())
-//
-// // migrations
-// val elemMap = HashMap()
-// columnSpecs.forEach {
-// elemMap[it.key.first] = it.key.second
-// }
-// val migrationGenerator = MigrationGenerator(fileBuilder, elemMap)
-// val migrationFunc = migrationGenerator.generate()
-// if (migrationFunc != null) classBuilder.addFunction(migrationFunc)
-
- val fileBuilder = JavaFile.builder(pack, classBuilder.build())
- val file = fileBuilder
- .indent(" ")
- .skipJavaLangImports(true)
- .addFileComment(
- """
- Copyright 2017, Android Promise Database
- Licensed under the Apache License, Version 2.0, Android Promise.
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an AS IS BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied
- See the License for the specific language governing permissions and
- limitations under the License
- """.trimIndent()
- )
- .build()
- //val kaptKotlinGeneratedDir = processingEnv.options[EntityProcessor.KAPT_JAVA_GENERATED_OPTION_NAME]!!
- file.writeTo(processingEnv.filer)
- }
-}
\ No newline at end of file
diff --git a/compiler/src/main/java/promise/db/ompiler/DatabaseCompanionPropsGenerator.kt b/compiler/src/main/java/promise/db/ompiler/DatabaseStaticMethodsGenerator.kt
similarity index 94%
rename from compiler/src/main/java/promise/db/ompiler/DatabaseCompanionPropsGenerator.kt
rename to compiler/src/main/java/promise/db/ompiler/DatabaseStaticMethodsGenerator.kt
index 2d2f0f6..e375e40 100644
--- a/compiler/src/main/java/promise/db/ompiler/DatabaseCompanionPropsGenerator.kt
+++ b/compiler/src/main/java/promise/db/ompiler/DatabaseStaticMethodsGenerator.kt
@@ -25,10 +25,10 @@ import javax.lang.model.element.Modifier
import javax.lang.model.element.TypeElement
import javax.tools.Diagnostic
-class DatabaseCompanionPropsGenerator(
+class DatabaseStaticMethodsGenerator(
private val typeSpec: TypeSpec.Builder,
private val element: Element,
- private val processingEnv: ProcessingEnvironment) : CodeBlockGenerator {
+ private val processingEnv: ProcessingEnvironment) : CodeGenerator {
override fun generate(): String {
val className = element.simpleName.toString()
@@ -43,18 +43,7 @@ class DatabaseCompanionPropsGenerator(
val entities = (element as TypeElement).getTableEntities(processingEnv)
- /**
- * private static Migration getMigration() {
- return new Migration() {
- @Override
- public void onMigrate(@NotNull FastDatabase database, @NotNull SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
- if (oldVersion == 2 && newVersion == 3) {
- database.add(sqLiteDatabase, database.obtain(PersonFastTable.class));
- }
- }
- };
- }
- */
+
var migrationInitialzer = """
return new Migration() {
@Override
@@ -92,6 +81,14 @@ class DatabaseCompanionPropsGenerator(
.addModifiers(Modifier.PRIVATE)
.build())
+ if (TypeConverterProcessor.typeConverter != null) {
+ typeSpec.addField(FieldSpec.builder(
+ TypeConverterProcessor.typeConverter!!.toTypeName(),
+ "typeConverter")
+ .addModifiers(Modifier.PRIVATE)
+ .build())
+ }
+
typeSpec.addField(FieldSpec.builder(Boolean::class.javaPrimitiveType,"initialized")
.initializer("false")
.addModifiers(Modifier.PRIVATE, Modifier.VOLATILE, Modifier.STATIC)
diff --git a/compiler/src/main/java/promise/db/ompiler/EntityProcessor.kt b/compiler/src/main/java/promise/db/ompiler/EntityProcessor.kt
index f1a08f4..6afad03 100644
--- a/compiler/src/main/java/promise/db/ompiler/EntityProcessor.kt
+++ b/compiler/src/main/java/promise/db/ompiler/EntityProcessor.kt
@@ -13,7 +13,6 @@
package promise.db.ompiler
-import com.google.auto.service.AutoService
import com.squareup.javapoet.AnnotationSpec
import com.squareup.javapoet.ClassName
import com.squareup.javapoet.CodeBlock
@@ -22,69 +21,40 @@ import com.squareup.javapoet.JavaFile
import com.squareup.javapoet.MethodSpec
import com.squareup.javapoet.ParameterizedTypeName
import com.squareup.javapoet.TypeSpec
-import net.ltgt.gradle.incap.IncrementalAnnotationProcessor
-import net.ltgt.gradle.incap.IncrementalAnnotationProcessorType
import org.jetbrains.annotations.NotNull
-import promise.db.DatabaseEntity
import promise.db.Entity
-import promise.db.ompiler.annotation.TableAnnotationGenerator
-import promise.db.ompiler.migration.MigrationGenerator
-import java.util.*
-import javax.annotation.processing.AbstractProcessor
import javax.annotation.processing.ProcessingEnvironment
-import javax.annotation.processing.Processor
import javax.annotation.processing.RoundEnvironment
-import javax.annotation.processing.SupportedOptions
-import javax.annotation.processing.SupportedSourceVersion
-import javax.lang.model.SourceVersion
import javax.lang.model.element.Element
import javax.lang.model.element.ElementKind
import javax.lang.model.element.Modifier
import javax.lang.model.element.TypeElement
import javax.tools.Diagnostic
-
-@AutoService(Processor::class) // For registering the service
-@IncrementalAnnotationProcessor(IncrementalAnnotationProcessorType.DYNAMIC)
-@SupportedSourceVersion(SourceVersion.RELEASE_7) // to support Java 8
-@SupportedOptions(EntityProcessor.KAPT_JAVA_GENERATED_OPTION_NAME)
-class EntityProcessor : AbstractProcessor() {
-
- override fun init(processingEnv: ProcessingEnvironment?) {
- super.init(processingEnv)
- }
-
- override fun process(mutableSet: MutableSet?, environment: RoundEnvironment?): Boolean {
- try {
- environment?.getElementsAnnotatedWith(Entity::class.java)
- ?.forEach { element ->
- if (element.kind != ElementKind.CLASS) {
- processingEnv.messager.printMessage(Diagnostic.Kind.ERROR, "Only classes can be annotated")
- return false
- }
+class EntityProcessor(private val processingEnv: ProcessingEnvironment) : ClassProcessor() {
+ override fun process(environment: RoundEnvironment?): List? {
+ return environment?.getElementsAnnotatedWith(Entity::class.java)
+ ?.map { element ->
+ if (element.kind != ElementKind.CLASS) {
+ processingEnv.messager.printMessage(Diagnostic.Kind.ERROR, "Only classes can be annotated")
+ return null
+ }
// val identifiableInterface = processingEnv.elementUtils.getTypeElement("promise.commons.model.Identifiable")
// processingEnv.messager.printMessage(Diagnostic.Kind.NOTE, "Entity class ${element.simpleName}, interfaceType ${identifiableInterface.toString()}")
// if (JavaUtils.implementsInterface(processingEnv, element as TypeElement, identifiableInterface.asType())) {
// processAnnotation(element)
// }
- processAnnotation(element)
+ processAnnotation(element)
// else {
// processingEnv.messager.printMessage(Diagnostic.Kind.ERROR, "The Entity class ${element.simpleName} must implement Identifiable")
// return false
// }
- }
- //return true
- return DatabaseProcessor(processingEnv).process(mutableSet, environment)
- } catch (e: Throwable) {
- processingEnv.messager.printMessage(Diagnostic.Kind.ERROR,
- //"EntityProcessor: ${Utils.getStackTraceString(e)} " +
- "EntityProcessor Trace: ${Arrays.toString(e.stackTrace)}")
- return false
- }
+ }
}
- private fun processAnnotation(element: Element) {
+
+ private fun processAnnotation(element: Element): JavaFile.Builder {
processingEnv.messager.printMessage(Diagnostic.Kind.OTHER, "Entity Processing: ${element.simpleName}")
val className = element.simpleName.toString()
@@ -113,15 +83,15 @@ class EntityProcessor : AbstractProcessor() {
if (Utils.elementExtendsSuperClass((element as TypeElement), "promise.db.ActiveRecord"))
classBuilder.addMethod(MethodSpec.methodBuilder("createEntityInstance")
- .addAnnotation(Override::class.java)
- .addAnnotation(NotNull::class.java)
- .addModifiers(Modifier.PUBLIC, Modifier.FINAL)
- .returns(ClassName.get(pack, className))
- .addCode("return new $className();")
- .build())
+ .addAnnotation(Override::class.java)
+ .addAnnotation(NotNull::class.java)
+ .addModifiers(Modifier.PUBLIC, Modifier.FINAL)
+ .returns(ClassName.get(pack, className))
+ .addCode("return new $className();")
+ .build())
// static column block generation
- val tableColumnPropsGenerator = TableColumnPropsGenerator(classBuilder, processingEnv, element.enclosedElements)
+ val tableColumnPropsGenerator = TableColumnFieldsGenerator(processingEnv, element.enclosedElements)
val idColumnSpec = FieldSpec.builder(
ParameterizedTypeName.get(
@@ -150,15 +120,15 @@ class EntityProcessor : AbstractProcessor() {
}
// column register generation
- val columnRegSpecGenerator = RegisterColumnsGenerator(tableColumnPropsGenerator.genColValues.map { it.second })
+ val columnRegSpecGenerator = TableRegisteredColumnsMethodGenerator(tableColumnPropsGenerator.genColValues.map { it.second })
classBuilder.addMethod(columnRegSpecGenerator.generate())
// serializer generator
- val serializerGenerator = SerializerGenerator(pack, className, tableColumnPropsGenerator.genColValues)
+ val serializerGenerator = TableSerializerMethodGenerator(pack, className, tableColumnPropsGenerator.genColValues)
classBuilder.addMethod(serializerGenerator.generate())
// deserializer generator
- val deserializerGenerator = DeserializerGenerator(pack, className,
+ val deserializerGenerator = TableDeserializerMethodGenerator(pack, className,
tableColumnPropsGenerator.genColValues)
classBuilder.addMethod(deserializerGenerator.generate())
@@ -167,41 +137,12 @@ class EntityProcessor : AbstractProcessor() {
columnSpecs.forEach {
elemMap[it.key.first] = it.key.second
}
- val migrationGenerator = MigrationGenerator(elemMap)
+ val migrationGenerator = DatabaseMigrationFieldGenerator(elemMap)
val migrationFunc = migrationGenerator.generate()
if (migrationFunc != null) classBuilder.addMethod(migrationFunc)
- val fileBuilder = JavaFile.builder(pack, classBuilder.build())
- //val kaptKotlinGeneratedDir = processingEnv.options[KAPT_JAVA_GENERATED_OPTION_NAME]!!
-
- fileBuilder
- .indent(" ")
- .skipJavaLangImports(true)
- .addFileComment(
- """
- Copyright 2017, Android Promise Database
- Licensed under the Apache License, Version 2.0, Android Promise.
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an AS IS BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied
- See the License for the specific language governing permissions and
- limitations under the License
- """.trimIndent()
- )
- .build()
- .writeTo(processingEnv.filer)
+ return JavaFile.builder(pack, classBuilder.build())
}
- override fun getSupportedAnnotationTypes(): MutableSet = mutableSetOf(
- Entity::class.java.name,
- DatabaseEntity::class.java.name
- )
-
- companion object {
- const val KAPT_JAVA_GENERATED_OPTION_NAME = "kapt.java.generated"
- }
}
\ No newline at end of file
diff --git a/compiler/src/main/java/promise/db/ompiler/JavaUtils.java b/compiler/src/main/java/promise/db/ompiler/JavaUtils.java
index ad97721..6e3429a 100644
--- a/compiler/src/main/java/promise/db/ompiler/JavaUtils.java
+++ b/compiler/src/main/java/promise/db/ompiler/JavaUtils.java
@@ -15,13 +15,20 @@
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.CodeBlock;
+import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeName;
+import org.jetbrains.annotations.Nullable;
+
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
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.TypeKind;
import javax.lang.model.type.TypeMirror;
public class JavaUtils {
@@ -38,6 +45,17 @@ public class JavaUtils {
put(void.class, Void.class);
}};
+ public static void generateAddConverterStatementInDatabaseConstructorMethod(
+ ProcessingEnvironment processingEnvironment,
+ MethodSpec.Builder constructorMethod,
+ TypeElement converter) {
+ String pack = processingEnvironment.getElementUtils().getPackageOf(converter).toString();
+ constructorMethod.addStatement("this.typeConverter = $T.provider($T.create(new $T())).get()",
+ ClassName.get("promise.commons", "SingletonInstanceProvider"),
+ ClassName.get(pack, TypeConverterProcessorKt.getTypeConverterClassName(converter)),
+ UtilsKt.toTypeName(converter));
+ }
+
public static void generateIfStatementObtainClassString(
ProcessingEnvironment processingEnv,
CodeBlock.Builder codeBlock,
@@ -54,27 +72,57 @@ public static Class wrap(Class c) {
return c.isPrimitive() ? (Class) PRIMITIVES_TO_WRAPPERS.get(c) : c;
}
- public static boolean implementsInterface(
- ProcessingEnvironment processingEnv,
- TypeElement myTypeElement,
- TypeMirror desiredInterface) {
- boolean found = false;
- while (myTypeElement.getSuperclass()
- != processingEnv.getElementUtils().getTypeElement("java.lang.Object").asType()
- && !found) {
- for (TypeMirror t : myTypeElement.getInterfaces()) {
- if (processingEnv.getTypeUtils().isAssignable(t, desiredInterface)){
- found = true;
- break;
- }
- else {
- TypeElement elem = (TypeElement) processingEnv.getTypeUtils().asElement(t);
- return implementsInterface(processingEnv, elem, desiredInterface);
+
+ public static TypeElement getSuperClass(TypeElement typeElement) {
+ TypeMirror type = typeElement.getSuperclass();
+ if (type.getKind() == TypeKind.NONE) {
+ return null;
+ }
+ return (TypeElement) ((DeclaredType) type).asElement();
+ }
+
+ static boolean isTypeEqual(TypeMirror typeMirror, TypeName otherType) {
+ return otherType.toString().equals(TypeName.get(typeMirror).toString());
+ }
+
+ static boolean isSubtypeOfType(TypeMirror typeMirror, TypeName otherType) {
+ if (isTypeEqual(typeMirror, otherType)) {
+ return true;
+ }
+ if (typeMirror.getKind() != TypeKind.DECLARED) {
+ return false;
+ }
+ DeclaredType declaredType = (DeclaredType) typeMirror;
+ List extends TypeMirror> typeArguments = declaredType.getTypeArguments();
+ if (typeArguments.size() > 0) {
+ StringBuilder typeString = new StringBuilder(declaredType.asElement().toString());
+ typeString.append('<');
+ for (int i = 0; i < typeArguments.size(); i++) {
+ if (i > 0) {
+ typeString.append(',');
}
+ typeString.append('?');
+ }
+ typeString.append('>');
+ if (typeString.toString().equals(otherType)) {
+ return true;
}
}
-
- return found;
+ Element element = declaredType.asElement();
+ if (!(element instanceof TypeElement)) {
+ return false;
+ }
+ TypeElement typeElement = (TypeElement) element;
+ TypeMirror superType = typeElement.getSuperclass();
+ if (isSubtypeOfType(superType, otherType)) {
+ return true;
+ }
+ for (TypeMirror interfaceType : typeElement.getInterfaces()) {
+ if (isSubtypeOfType(interfaceType, otherType)) {
+ return true;
+ }
+ }
+ return false;
}
public static boolean extendsClass(
diff --git a/compiler/src/main/java/promise/db/ompiler/PersistableEntityUtils.kt b/compiler/src/main/java/promise/db/ompiler/PersistableEntityUtils.kt
index a3083ef..99c5872 100644
--- a/compiler/src/main/java/promise/db/ompiler/PersistableEntityUtils.kt
+++ b/compiler/src/main/java/promise/db/ompiler/PersistableEntityUtils.kt
@@ -14,18 +14,23 @@
package promise.db.ompiler
import com.squareup.javapoet.ClassName
+import com.squareup.javapoet.TypeName
import com.sun.tools.javac.code.Attribute
import org.atteo.evo.inflector.English
import promise.db.DatabaseEntity
import promise.db.Entity
import promise.db.ForeignKey
+import promise.db.HasMany
+import promise.db.HasOne
import promise.db.Index
import java.io.IOException
import javax.annotation.processing.ProcessingEnvironment
import javax.lang.model.element.Element
+import javax.lang.model.element.ExecutableElement
import javax.lang.model.element.TypeElement
import javax.lang.model.type.TypeMirror
import javax.lang.model.util.ElementFilter
+import javax.tools.Diagnostic
/**
* gets the className for type element
@@ -148,4 +153,80 @@ fun Element.getNameOfColumn(): String {
fun String.capitalizeFirst(): String = this.replaceFirst(this.first(), this.first().toUpperCase())
-fun String.camelCase(): String = this.replaceFirst(this.first(), this.first().toLowerCase())
\ No newline at end of file
+fun String.camelCase(): String = this.replaceFirst(this.first(), this.first().toLowerCase())
+
+fun Element.checkIfHasTypeConverter(): Boolean {
+ //return true
+ if (TypeConverterProcessor.typeConverter != null)
+ return this.getConverterCompatibleMethod(ConverterTypes.SERIALIZER) != null &&
+ this.getConverterCompatibleMethod(ConverterTypes.DESERIALIZER) != null
+ return false
+}
+
+fun Element.checkIfHasTypeConverter(processingEnv: ProcessingEnvironment): Boolean {
+ //return true
+ if (TypeConverterProcessor.typeConverter != null)
+ return this.getConverterCompatibleMethod(ConverterTypes.SERIALIZER, processingEnv) != null &&
+ this.getConverterCompatibleMethod(ConverterTypes.DESERIALIZER, processingEnv) != null
+ return false
+}
+
+enum class ConverterTypes {
+ DESERIALIZER,
+ SERIALIZER
+}
+
+fun Element.getConverterCompatibleMethod(converterTypes: ConverterTypes): ExecutableElement? {
+ if (TypeConverterProcessor.typeConverter != null) {
+ val methods =
+ ElementFilter.methodsIn(TypeConverterProcessor.typeConverter!!.enclosedElements)
+ .filter { it.parameters.size == 1 }
+ return methods.find {
+ when(converterTypes) {
+ ConverterTypes.DESERIALIZER -> {
+ JavaUtils.isTypeEqual(it.parameters[0].asType(), TypeName.get(String::class.java)) &&
+ JavaUtils.isTypeEqual(it.returnType, TypeName.get(this.asType()))
+ }
+ ConverterTypes.SERIALIZER -> {
+ JavaUtils.isTypeEqual(it.parameters[0].asType(), TypeName.get(this.asType())) &&
+ JavaUtils.isTypeEqual(it.returnType, TypeName.get(String::class.java))
+ }
+ }
+ }
+ }
+ else return null
+}
+
+
+fun Element.getConverterCompatibleMethod(converterTypes: ConverterTypes, processingEnv: ProcessingEnvironment): ExecutableElement? {
+ if (TypeConverterProcessor.typeConverter != null) {
+ val methods =
+ ElementFilter.methodsIn(TypeConverterProcessor.typeConverter!!.enclosedElements)
+ .filter {
+ it.parameters.size == 1 }
+ return methods.find {
+// processingEnv.messager.printMessage(Diagnostic.Kind.NOTE, "Type converter: " +
+// " method: ${it}, " +
+// " returnType: ${TypeName.get(it.returnType)}" +
+// " parameter: ${TypeName.get(it.parameters[0].asType())}" +
+// " elementType ${TypeName.get(this.asType())}")
+ when(converterTypes) {
+ ConverterTypes.DESERIALIZER -> {
+
+ JavaUtils.isTypeEqual(it.parameters[0].asType(), TypeName.get(String::class.java)) &&
+ JavaUtils.isTypeEqual(it.returnType, TypeName.get(this.asType()))
+ }
+ ConverterTypes.SERIALIZER -> {
+ JavaUtils.isTypeEqual(it.parameters[0].asType(), TypeName.get(this.asType())) &&
+ JavaUtils.isTypeEqual(it.returnType, TypeName.get(String::class.java))
+ }
+ }
+ }
+ }
+ else return null
+}
+fun Element.isElementAnnotatedAsRelation(): Boolean {
+ //return false
+ return this.getAnnotation(HasMany::class.java) != null ||
+ this.getAnnotation(HasOne::class.java) != null
+}
\ No newline at end of file
diff --git a/compiler/src/main/java/promise/db/ompiler/PromiseDatabaseCompiler.kt b/compiler/src/main/java/promise/db/ompiler/PromiseDatabaseCompiler.kt
new file mode 100644
index 0000000..9ffa645
--- /dev/null
+++ b/compiler/src/main/java/promise/db/ompiler/PromiseDatabaseCompiler.kt
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2017, Peter Vincent
+ * Licensed under the Apache License, Version 2.0, Android Promise.
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package promise.db.ompiler
+
+import com.google.auto.service.AutoService
+import com.squareup.javapoet.JavaFile
+import net.ltgt.gradle.incap.IncrementalAnnotationProcessor
+import net.ltgt.gradle.incap.IncrementalAnnotationProcessorType
+import promise.db.DatabaseEntity
+import promise.db.Entity
+import promise.db.TypeConverter
+import java.util.*
+import javax.annotation.processing.AbstractProcessor
+import javax.annotation.processing.Processor
+import javax.annotation.processing.RoundEnvironment
+import javax.annotation.processing.SupportedOptions
+import javax.annotation.processing.SupportedSourceVersion
+import javax.lang.model.SourceVersion
+import javax.lang.model.element.TypeElement
+import javax.tools.Diagnostic
+import kotlin.collections.ArrayList
+
+@AutoService(Processor::class) // For registering the service
+@IncrementalAnnotationProcessor(IncrementalAnnotationProcessorType.DYNAMIC)
+@SupportedSourceVersion(SourceVersion.RELEASE_7) // to support Java 8
+@SupportedOptions(PromiseDatabaseCompiler.KAPT_JAVA_GENERATED_OPTION_NAME)
+class PromiseDatabaseCompiler : AbstractProcessor() {
+
+ override fun process(mutableSet: MutableSet?, environment: RoundEnvironment?): Boolean {
+ try {
+ val javaFiles: ArrayList = ArrayList()
+ val processors: ArrayList = ArrayList()
+
+ processors.add(TypeConverterProcessor(processingEnv))
+ processors.add(EntityProcessor(processingEnv))
+ processors.add(DatabaseEntityProcessor(processingEnv))
+
+ processors.forEach {
+ val builder = it.process(environment)
+ if (builder != null) {
+ javaFiles.addAll(builder.filterNotNull())
+ }
+ }
+ javaFiles.forEach {
+ val file = it
+ .indent(" ")
+ .skipJavaLangImports(true)
+ .addFileComment(
+ """
+ Copyright 2017, Android Promise Database
+ Licensed under the Apache License, Version 2.0, Android Promise.
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an AS IS BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied
+ See the License for the specific language governing permissions and
+ limitations under the License
+
+ Code Resource https://github.com/android-promise
+
+ """.trimIndent()
+ )
+ .build()
+ file.writeTo(processingEnv.filer)
+ }
+ return true
+ } catch (e: Throwable) {
+ processingEnv.messager.printMessage(Diagnostic.Kind.ERROR,
+ //"EntityProcessor: ${Utils.getStackTraceString(e)} " +
+ "EntityProcessor Trace: ${Arrays.toString(e.stackTrace)}")
+ return false
+ }
+ }
+
+ override fun getSupportedAnnotationTypes(): MutableSet = mutableSetOf(
+ Entity::class.java.name,
+ DatabaseEntity::class.java.name,
+ TypeConverter::class.java.name
+ )
+
+ companion object {
+ const val KAPT_JAVA_GENERATED_OPTION_NAME = "kapt.java.generated"
+ }
+
+}
\ No newline at end of file
diff --git a/compiler/src/main/java/promise/db/ompiler/relations/RelationsGenerator.kt b/compiler/src/main/java/promise/db/ompiler/RelationsGenerator.kt
similarity index 93%
rename from compiler/src/main/java/promise/db/ompiler/relations/RelationsGenerator.kt
rename to compiler/src/main/java/promise/db/ompiler/RelationsGenerator.kt
index 7ba879d..7023a13 100644
--- a/compiler/src/main/java/promise/db/ompiler/relations/RelationsGenerator.kt
+++ b/compiler/src/main/java/promise/db/ompiler/RelationsGenerator.kt
@@ -11,12 +11,11 @@
* limitations under the License.
*/
-package promise.db.ompiler.relations
+package promise.db.ompiler
import com.squareup.javapoet.MethodSpec
import promise.db.HasMany
import promise.db.HasOne
-import promise.db.ompiler.CodeBlockGenerator
import java.util.*
import javax.annotation.processing.ProcessingEnvironment
import javax.lang.model.element.Element
@@ -27,7 +26,7 @@ class RelationsGenerator(
private val processingEnvironment: ProcessingEnvironment
,
private val setElements: List
-) : CodeBlockGenerator?> {
+) : CodeGenerator?> {
override fun generate(): List? {
val funSpecs = ArrayList()
diff --git a/compiler/src/main/java/promise/db/ompiler/annotation/TableAnnotationGenerator.java b/compiler/src/main/java/promise/db/ompiler/TableAnnotationGenerator.java
similarity index 97%
rename from compiler/src/main/java/promise/db/ompiler/annotation/TableAnnotationGenerator.java
rename to compiler/src/main/java/promise/db/ompiler/TableAnnotationGenerator.java
index db8a52e..6e9f3c3 100644
--- a/compiler/src/main/java/promise/db/ompiler/annotation/TableAnnotationGenerator.java
+++ b/compiler/src/main/java/promise/db/ompiler/TableAnnotationGenerator.java
@@ -11,7 +11,7 @@
* limitations under the License.
*/
-package promise.db.ompiler.annotation;
+package promise.db.ompiler;
import com.squareup.javapoet.AnnotationSpec;
import com.squareup.javapoet.CodeBlock;
@@ -27,10 +27,10 @@
import promise.db.Entity;
import promise.db.Table;
-import promise.db.ompiler.CodeBlockGenerator;
+import promise.db.ompiler.CodeGenerator;
import promise.db.ompiler.PersistableEntityUtilsKt;
-public class TableAnnotationGenerator implements CodeBlockGenerator {
+public class TableAnnotationGenerator implements CodeGenerator {
private Element element;
private ProcessingEnvironment processingEnvironment;
diff --git a/compiler/src/main/java/promise/db/ompiler/TableColumnPropsGenerator.kt b/compiler/src/main/java/promise/db/ompiler/TableColumnFieldsGenerator.kt
similarity index 55%
rename from compiler/src/main/java/promise/db/ompiler/TableColumnPropsGenerator.kt
rename to compiler/src/main/java/promise/db/ompiler/TableColumnFieldsGenerator.kt
index fdace1c..2ce4d86 100644
--- a/compiler/src/main/java/promise/db/ompiler/TableColumnPropsGenerator.kt
+++ b/compiler/src/main/java/promise/db/ompiler/TableColumnFieldsGenerator.kt
@@ -18,7 +18,6 @@ import com.squareup.javapoet.CodeBlock
import com.squareup.javapoet.FieldSpec
import com.squareup.javapoet.ParameterizedTypeName
import com.squareup.javapoet.TypeName
-import com.squareup.javapoet.TypeSpec
import promise.db.Ignore
import promise.db.PrimaryKey
import promise.db.PrimaryKeyAutoIncrement
@@ -30,60 +29,89 @@ import javax.tools.Diagnostic
import kotlin.collections.ArrayList
import kotlin.collections.HashMap
-class TableColumnPropsGenerator(
- private val classBuilder: TypeSpec.Builder,
- private val processingEnvironment: ProcessingEnvironment
- ,
- private val setElements: List) : CodeBlockGenerator