Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 27 additions & 1 deletion gradle-plugin/src/main/groovy/io/realm/gradle/Realm.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -54,7 +55,32 @@ class Realm implements Plugin<Project> {
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<String> getBootClassPathList() {
List<String> 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}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can expect this to always exist. Transform-cli does that check if a config file is specified: uber/okbuck@ebcea6f#diff-10fc19e7dd1e6127839942575e0a0ba1R59

}

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<String> bootClassPathList = []
if (!(bootClassPath == null || bootClassPath.empty)) {
bootClassPath.split(',').each {
bootClassPathList.add(it.trim())
}
}
provider = new TransformerConfigProvider() {
@Override
boolean getSyncEnabled() {
return syncEnabled
}

@Override
List<String> getBootClassPathList() {
return bootClassPathList
Copy link
Copy Markdown

@malbano malbano Feb 1, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The boot classpaths are already passed in the transform invocation as referenced input jar, so you just need to add those to your class loader.

}

@Override
String getTargetSdkVersion() {
return targetSdkVersion
}

@Override
String getMinSdkVersion() {
return minSdkVersion
}
}
}

@Override
Expand Down Expand Up @@ -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()
}
}
Expand Down Expand Up @@ -225,10 +266,10 @@ class RealmTransformer extends Transform {
private static Set<String> getClassNames(Collection<TransformInput> inputs) {
Set<String> classNames = new HashSet<String>()

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(
Expand All @@ -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 {
Expand Down Expand Up @@ -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)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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<String> getBootClassPathList()

String getTargetSdkVersion()
String getMinSdkVersion()

}
28 changes: 27 additions & 1 deletion realm/realm-library/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> getBootClassPathList() {
List<String> 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" }
Expand Down