From 3a4ea0a7bb6a52e4ab9a4a459249046bb5eb1778 Mon Sep 17 00:00:00 2001 From: Makoto Yamazaki Date: Thu, 2 Feb 2017 01:02:41 +0900 Subject: [PATCH] add a constructor to RealmTransformer which takes file path of configuration in order to support OkBuck --- .../main/groovy/io/realm/gradle/Realm.groovy | 28 ++++++- .../realm/transformer/RealmTransformer.groovy | 77 ++++++++++++++----- .../TransformerConfigProvider.groovy | 26 +++++++ realm/realm-library/build.gradle | 28 ++++++- 4 files changed, 139 insertions(+), 20 deletions(-) create mode 100644 realm-transformer/src/main/groovy/io/realm/transformer/TransformerConfigProvider.groovy diff --git a/gradle-plugin/src/main/groovy/io/realm/gradle/Realm.groovy b/gradle-plugin/src/main/groovy/io/realm/gradle/Realm.groovy index 43bf3f89cd..0c9ec9e721 100644 --- a/gradle-plugin/src/main/groovy/io/realm/gradle/Realm.groovy +++ b/gradle-plugin/src/main/groovy/io/realm/gradle/Realm.groovy @@ -20,6 +20,7 @@ import com.android.build.gradle.AppPlugin import com.android.build.gradle.LibraryPlugin import com.neenbedankt.gradle.androidapt.AndroidAptPlugin import io.realm.transformer.RealmTransformer +import io.realm.transformer.TransformerConfigProvider import org.gradle.api.GradleException import org.gradle.api.Plugin import org.gradle.api.Project @@ -54,7 +55,32 @@ class Realm implements Plugin { usesAptPlugin = true } - project.android.registerTransform(new RealmTransformer(project)) + // note that project.android.bootClasspath is not ready here. + project.android.registerTransform(new RealmTransformer(new TransformerConfigProvider() { + @Override + boolean getSyncEnabled() { + return project.realm.syncEnabled != null && project.realm.syncEnabled + } + + @Override + List getBootClassPathList() { + List bootClassPathList = [] + project.android.bootClasspath.each { + bootClassPathList.add(it.absolutePath) + } + return bootClassPathList + } + + @Override + String getTargetSdkVersion() { + return project.android.defaultConfig?.targetSdkVersion?.mApiLevel as String; + } + + @Override + String getMinSdkVersion() { + return project.android.defaultConfig?.minSdkVersion?.mApiLevel as String; + } + })) project.repositories.add(project.getRepositories().jcenter()) project.dependencies.add("compile", "io.realm:realm-annotations:${Version.VERSION}") diff --git a/realm-transformer/src/main/groovy/io/realm/transformer/RealmTransformer.groovy b/realm-transformer/src/main/groovy/io/realm/transformer/RealmTransformer.groovy index 94ee5af4f4..ce82564156 100644 --- a/realm-transformer/src/main/groovy/io/realm/transformer/RealmTransformer.groovy +++ b/realm-transformer/src/main/groovy/io/realm/transformer/RealmTransformer.groovy @@ -26,8 +26,6 @@ import io.realm.annotations.Ignore import io.realm.annotations.RealmClass import javassist.ClassPool import javassist.CtClass -import javassist.LoaderClassPath -import org.gradle.api.Project import org.slf4j.Logger import org.slf4j.LoggerFactory @@ -44,10 +42,54 @@ import static com.android.build.api.transform.QualifiedContent.* class RealmTransformer extends Transform { private Logger logger = LoggerFactory.getLogger('realm-logger') - private Project project + TransformerConfigProvider provider - public RealmTransformer(Project project) { - this.project = project + public RealmTransformer(TransformerConfigProvider provider) { + this.provider = provider + } + + // constructor for OkBuck + public RealmTransformer(File configFile) { + if (!configFile.exists()) { + throw new FileNotFoundException(configFile.absolutePath) + } + + Properties properties = new Properties() + configFile.withInputStream { + properties.load(it) + } + boolean syncEnabled = Boolean.valueOf(properties.getProperty("realm.syncEnabled", "false")) + boolean targetSdkVersion = properties.getProperty('android.targetSdkVersion', '25') + boolean minSdkVersion = properties.getProperty('android.minSdkVersion', '19') + + def bootClassPath = properties.getProperty("realm.bootClassPath") + List bootClassPathList = [] + if (!(bootClassPath == null || bootClassPath.empty)) { + bootClassPath.split(',').each { + bootClassPathList.add(it.trim()) + } + } + provider = new TransformerConfigProvider() { + @Override + boolean getSyncEnabled() { + return syncEnabled + } + + @Override + List getBootClassPathList() { + return bootClassPathList + } + + @Override + String getTargetSdkVersion() { + return targetSdkVersion + } + + @Override + String getMinSdkVersion() { + return minSdkVersion + } + } } @Override @@ -174,14 +216,13 @@ class RealmTransformer extends Transform { it.getPackageName() } - def targetSdk = project?.android?.defaultConfig?.targetSdkVersion?.mApiLevel as String; - def minSdk = project?.android?.defaultConfig?.minSdkVersion?.mApiLevel as String; - def env = System.getenv() def disableAnalytics = env["REALM_DISABLE_ANALYTICS"] if (disableAnalytics == null || disableAnalytics != "true") { - boolean sync = project?.realm?.syncEnabled != null && project.realm.syncEnabled - def analytics = new RealmAnalytics(packages as Set, containsKotlin, sync, targetSdk, minSdk) + def analytics = new RealmAnalytics(packages as Set, containsKotlin, + provider.syncEnabled, + provider.targetSdkVersion, + provider.minSdkVersion) analytics.execute() } } @@ -225,10 +266,10 @@ class RealmTransformer extends Transform { private static Set getClassNames(Collection inputs) { Set classNames = new HashSet() - inputs.each { - it.directoryInputs.each { - def dirPath = it.file.absolutePath - it.file.eachFileRecurse(FileType.FILES) { + for (TransformInput input : inputs) { + for (DirectoryInput directoryInput : input.directoryInputs) { + def dirPath = directoryInput.file.absolutePath + directoryInput.file.eachFileRecurse(FileType.FILES) { if (it.absolutePath.endsWith(SdkConstants.DOT_CLASS)) { def className = it.absolutePath.substring( @@ -240,8 +281,8 @@ class RealmTransformer extends Transform { } } - it.jarInputs.each { - def jarFile = new JarFile(it.file) + for (JarInput jarInput : input.jarInputs) { + def jarFile = new JarFile(jarInput.file) jarFile.entries().findAll { !it.directory && it.name.endsWith(SdkConstants.DOT_CLASS) }.each { @@ -294,8 +335,8 @@ class RealmTransformer extends Transform { // See https://code.google.com/p/android/issues/detail?id=209426 private void addBootClassesToClassPool(ClassPool classPool) { try { - project.android.bootClasspath.each { - String path = it.absolutePath + provider.bootClassPathList.each { + String path = it logger.debug "Add boot class " + path + " to class pool." classPool.appendClassPath(path) } diff --git a/realm-transformer/src/main/groovy/io/realm/transformer/TransformerConfigProvider.groovy b/realm-transformer/src/main/groovy/io/realm/transformer/TransformerConfigProvider.groovy new file mode 100644 index 0000000000..25ae049692 --- /dev/null +++ b/realm-transformer/src/main/groovy/io/realm/transformer/TransformerConfigProvider.groovy @@ -0,0 +1,26 @@ +/* + * Copyright 2017 Realm Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * 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 io.realm.transformer + +interface TransformerConfigProvider { + boolean getSyncEnabled() + List getBootClassPathList() + + String getTargetSdkVersion() + String getMinSdkVersion() + +} \ No newline at end of file diff --git a/realm/realm-library/build.gradle b/realm/realm-library/build.gradle index ac7f1affbd..919297add5 100644 --- a/realm/realm-library/build.gradle +++ b/realm/realm-library/build.gradle @@ -116,8 +116,34 @@ android { coveralls.jacocoReportPath = "${buildDir}/reports/coverage/debug/report.xml" import io.realm.transformer.RealmTransformer +import io.realm.transformer.TransformerConfigProvider -android.registerTransform(new RealmTransformer()) +android.registerTransform(new RealmTransformer(new TransformerConfigProvider() { + @Override + boolean getSyncEnabled() { + return false + } + + @Override + List getBootClassPathList() { + List bootClassPathList = [] + project.android.bootClasspath.each { + bootClassPathList.add(it.absolutePath) + } + return bootClassPathList + } + + @Override + String getTargetSdkVersion() { + return project.android.defaultConfig?.targetSdkVersion?.mApiLevel as String; + } + + @Override + String getMinSdkVersion() { + return project.android.defaultConfig?.minSdkVersion?.mApiLevel as String; + } + +})) repositories { maven { url "https://jitpack.io" }