diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 95599fd8d..f2f625c66 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -14,15 +14,15 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Gradle Wrapper Validation - uses: gradle/actions/wrapper-validation@v3 + uses: gradle/actions/wrapper-validation@v4 - - name: Set up JDK 11 - uses: actions/setup-java@v3 + - name: Set up JDK 21 + uses: actions/setup-java@v4 with: - java-version: '11' + java-version: '21' distribution: 'zulu' - name: Set up Python @@ -83,16 +83,16 @@ jobs: needs: [build] steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Gradle Wrapper Validation - uses: gradle/actions/wrapper-validation@v3 + uses: gradle/actions/wrapper-validation@v4 - - name: Install JDK 11 - uses: actions/setup-java@v3 + - name: Install JDK 21 + uses: actions/setup-java@v4 with: distribution: 'zulu' - java-version: 11 + java-version: 21 - name: Set up Python uses: actions/setup-python@v3 @@ -107,7 +107,7 @@ jobs: run: ./update-submodules - name: Upload Artifacts - run: ./gradlew publishAllPublicationsToMavenCentralRepository --no-daemon --no-parallel --no-configuration-cache --stacktrace + run: ./gradlew publishToMavenCentral --no-daemon --no-parallel --no-configuration-cache --stacktrace env: ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.OSSRH_USERNAME }} ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.OSSRH_PASSWORD }} @@ -119,7 +119,7 @@ jobs: echo "VERSION_NAME=$(cat gradle.properties | grep -w "VERSION_NAME" | cut -d'=' -f2)" >> $GITHUB_ENV - name: Publish Release to Maven Central - run: ./gradlew closeAndReleaseRepository --no-daemon --no-parallel + run: ./gradlew publishAndReleaseToMavenCentral --no-daemon --no-parallel if: "!endsWith(env.VERSION_NAME, '-SNAPSHOT')" env: ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.OSSRH_USERNAME }} diff --git a/README.md b/README.md index 500750209..906f7167e 100644 --- a/README.md +++ b/README.md @@ -284,7 +284,7 @@ If you leverage jettifier and see the following errors then please add `android. Failed to transform jackson-core-2.15.0.jar (com.fasterxml.jackson.core:jackson-core:2.15.0) to match attributes {artifactType=android-classes-jar, org.gradle.category=library, org.gradle.dependency.bundling=external, org.gradle.libraryelements=jar, org.gradle.status=release, org.gradle.usage=java-api}. ``` -The Android code in this SDK is written in Kotlin (as of 5.4.x) and Kotlin is now a runtime dependency. If you do not already have Kotlin in your project, you will need to add `implementation("org.jetbrains.kotlin:kotlin-stdlib:1.6.21")` to your dependencies block in order to avoid a runtime exception. +The Android code in this SDK is written in Kotlin (as of 5.4.x) and Kotlin is now a runtime dependency. If you do not already have Kotlin in your project, you will need to add `implementation("org.jetbrains.kotlin:kotlin-stdlib:2.4.0")` to your dependencies block in order to avoid a runtime exception. If the [official Dropbox App](https://play.google.com/store/apps/details?id=com.dropbox.android) is installed, it will attempt to use it to do authorization. If it is not, a web authentication flow is launched in-browser. @@ -370,7 +370,7 @@ dependencies { The JAR's manifest has the following line: ``` -Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=11))" +Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))" ``` Most OSGi containers should provide this capability. Unfortunately, some OSGi containers don't do this correctly and will reject the bundle JAR in the OSGi subsystem context. @@ -440,4 +440,3 @@ OkHttpClient httpClient = OkHttpRequestor.defaultOkHttpClient().clone() .setCertificatePinner(myCertificatePinner) .build(); ``` - diff --git a/android/build.gradle b/android/build.gradle index 72777ebf5..b3cb3750f 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,8 +1,10 @@ -import com.vanniktech.maven.publish.SonatypeHost +import com.vanniktech.maven.publish.AndroidSingleVariantLibrary +import kotlinx.validation.KotlinApiBuildTask +import kotlinx.validation.KotlinApiCompareTask +import kotlinx.validation.SyncFile plugins { id 'com.android.library' - id 'org.jetbrains.kotlin.android' id "org.jetbrains.kotlinx.binary-compatibility-validator" id "com.vanniktech.maven.publish" id "com.github.ben-manes.versions" @@ -11,14 +13,26 @@ plugins { android { namespace = "com.dropbox.core.sdk.android" - compileSdk dropboxJavaSdkLibs.versions.android.compile.sdk.get().toInteger() + compileSdk = dropboxJavaSdkLibs.versions.android.compile.sdk.get().toInteger() + + buildFeatures { + buildConfig = true + } + defaultConfig { - minSdk dropboxJavaSdkLibs.versions.android.min.sdk.get().toInteger() - targetSdk dropboxJavaSdkLibs.versions.android.target.sdk.get().toInteger() + minSdk = dropboxJavaSdkLibs.versions.android.min.sdk.get().toInteger() + targetSdk = dropboxJavaSdkLibs.versions.android.target.sdk.get().toInteger() } - kotlinOptions { - freeCompilerArgs += '-Xexplicit-api=strict' + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } +} + +kotlin { + compilerOptions { + freeCompilerArgs.add('-Xexplicit-api=strict') } } @@ -26,11 +40,56 @@ dependencies { api(project(path: ":core", configuration: "withoutOsgi")) } +configurations { + androidApiValidationRuntime +} + +dependencies { + androidApiValidationRuntime("org.jetbrains.kotlinx:binary-compatibility-validator:${dropboxJavaSdkLibs.versions.binary.compatibility.validator.get()}") + androidApiValidationRuntime(dropboxJavaSdkLibs.kotlin.stdlib) + androidApiValidationRuntime("org.jetbrains.kotlin:kotlin-metadata-jvm:${dropboxJavaSdkLibs.versions.kotlin.asProvider().get()}") +} + +def androidApiBuild = tasks.register("apiBuild", KotlinApiBuildTask) { + description = "Builds Kotlin API for release variant of ${project.name}." + + def bundleReleaseClassesJar = tasks.named("bundleLibCompileToJarRelease") + dependsOn(bundleReleaseClassesJar) + inputJar.set(bundleReleaseClassesJar.flatMap { it.output }) + inputDependencies.from(configurations.named("releaseCompileClasspath")) + ignoredClasses.add("com.dropbox.core.sdk.android.R") + outputApiFile.set(layout.buildDirectory.file("api/${project.name}.api")) + runtimeClasspath.from(configurations.named("androidApiValidationRuntime")) +} + +tasks.register("apiCheck", KotlinApiCompareTask) { + group = "verification" + description = "Checks signatures of public API against the golden value in API folder for ${project.name}." + + dependsOn(androidApiBuild) + projectApiFile.set(layout.projectDirectory.file("api/${project.name}.api")) + generatedApiFile.set(androidApiBuild.flatMap { it.outputApiFile }) +} + +tasks.register("apiDump", SyncFile) { + group = "verification" + description = "Syncs the API file for ${project.name}." + + dependsOn(androidApiBuild) + from.set(androidApiBuild.flatMap { it.outputApiFile }) + to.set(layout.projectDirectory.file("api/${project.name}.api")) +} + +tasks.named("check") { + dependsOn(tasks.named("apiCheck")) +} + dependencyGuard { configuration("releaseRuntimeClasspath") } mavenPublishing { - publishToMavenCentral(SonatypeHost.S01) + configure(new AndroidSingleVariantLibrary("release", true, true)) + publishToMavenCentral() signAllPublications() -} \ No newline at end of file +} diff --git a/android/dependencies/releaseRuntimeClasspath.txt b/android/dependencies/releaseRuntimeClasspath.txt index a2cb92815..3714582e4 100644 --- a/android/dependencies/releaseRuntimeClasspath.txt +++ b/android/dependencies/releaseRuntimeClasspath.txt @@ -2,8 +2,5 @@ ch.randelshofer:fastdoubleparser:0.8.0 com.fasterxml.jackson.core:jackson-core:2.15.0 com.fasterxml.jackson:jackson-bom:2.15.0 com.google.code.findbugs:jsr305:3.0.2 -org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -org.jetbrains.kotlin:kotlin-stdlib:1.6.21 +org.jetbrains.kotlin:kotlin-stdlib:2.4.0 org.jetbrains:annotations:13.0 diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index 7894a720e..972508b8a 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -1,9 +1,8 @@ - + - \ No newline at end of file + diff --git a/build.gradle b/build.gradle index 9fb6f6279..fd7f49fa5 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ plugins { alias(dropboxJavaSdkLibs.plugins.dependency.guard) alias(dropboxJavaSdkLibs.plugins.maven.publish.plugin) apply false alias(dropboxJavaSdkLibs.plugins.gradle.version.plugin) apply false - alias(dropboxJavaSdkLibs.plugins.blind.pirate.osgi) apply false + alias(dropboxJavaSdkLibs.plugins.bnd.builder) apply false alias(dropboxJavaSdkLibs.plugins.binary.compatibility.validator) apply false } diff --git a/core/build.gradle b/core/build.gradle index cfee3c2e7..06cf5e7a5 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -1,11 +1,10 @@ import com.dropbox.stone.java.StoneTask import com.dropbox.stone.java.model.ClientSpec import com.dropbox.stone.java.model.StoneConfig -import com.vanniktech.maven.publish.SonatypeHost plugins { id 'java-library' - id "com.github.blindpirate.osgi" + id "biz.aQute.bnd.builder" id "org.jetbrains.kotlin.jvm" id "com.vanniktech.maven.publish" id "com.github.ben-manes.versions" @@ -18,8 +17,10 @@ dependencyGuard { configuration("runtimeClasspath") } -sourceCompatibility = JavaVersion.VERSION_1_8 -targetCompatibility = JavaVersion.VERSION_1_8 +java { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} ext { mavenName = 'Official Dropbox Java SDK' @@ -28,6 +29,27 @@ ext { authInfoPropertyName = 'com.dropbox.test.authInfoFile' } +def toOsgiBundleVersion(Object versionValue) { + String version = versionValue.toString() + if (version == Project.DEFAULT_VERSION) { + return "0.0.0.${Project.DEFAULT_VERSION}" + } + + def matcher = version =~ /^(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:[-.]?(.+))?$/ + if (!matcher.matches()) { + return "0.0.0.${version.replaceAll(/[^A-Za-z0-9_-]/, '_')}" + } + + String major = matcher[0][1] + String minor = matcher[0][2] ?: "0" + String micro = matcher[0][3] ?: "0" + String qualifier = matcher[0][4] + ? ".${matcher[0][4].replaceAll(/[^A-Za-z0-9_-]/, '_')}" + : "" + + return "${major}.${minor}.${micro}${qualifier}" +} + tasks.register('versionWriterTask') { String versionName if (project.hasProperty("VERSION_NAME")) { @@ -82,6 +104,10 @@ configurations { withoutOsgi.extendsFrom api } +tasks.withType(JavaCompile).configureEach { + options.release.set(8) +} + tasks.named("compileJava", JavaCompile) { options.compilerArgs << '-Xlint:all' options.warnings = true @@ -97,8 +123,8 @@ tasks.named("test", Test) { useTestNG() // TestNG specific options - options.parallel 'methods' - options.threadCount 4 + options.parallel = 'methods' + options.threadCount = 4 // exclude integration tests exclude '**/IT*.class' @@ -150,7 +176,7 @@ tasks.register('integrationTest', Test) { reports { html { - destination = file("${buildDir}/reports/integration-tests") + outputLocation = layout.buildDirectory.dir("reports/integration-tests") } } @@ -178,8 +204,8 @@ tasks.named("javadoc", Javadoc) { versionName = "" } - title "${project.mavenName} ${versionName} API" - failOnError true + title = "${project.mavenName} ${versionName} API" + failOnError = true // JDK 8's javadoc has an on-by-default lint called "missing", which requires that everything // be documented. Disable this lint because we intentionally don't document some things. @@ -193,25 +219,29 @@ tasks.named("javadoc", Javadoc) { } tasks.named("jar", Jar) { - // OsgiManifest since we import 'osgi' plugin - manifest { - name project.name - description project.description - license 'http://opensource.org/licenses/MIT' - instruction 'Import-Package', - 'android.*;resolution:=optional', - 'com.google.appengine.*;resolution:=optional', - 'com.squareup.okhttp;resolution:=optional', - 'okhttp3;resolution:=optional', - 'okio;resolution:=optional', - 'kotlin.*;resolution:=optional', - '*' - - def noeeProp = 'osgi.bnd.noee' - def noee = providers.gradleProperty(noeeProp).forUseAtConfigurationTime().getOrElse( - providers.systemProperty(noeeProp).forUseAtConfigurationTime().getOrElse('false') - ) - instruction '-noee', noee + bundle { + def bndProperties = [ + 'Bundle-SymbolicName': "${rootProject.name}.${project.name}", + 'Bundle-Version' : toOsgiBundleVersion(project.version), + 'Bundle-Name' : project.name, + 'Bundle-License' : 'http://opensource.org/licenses/MIT', + 'Export-Package' : 'com.dropbox.core,com.dropbox.core.*', + 'Import-Package' : [ + 'com.google.appengine.*;resolution:=optional', + 'com.squareup.okhttp;resolution:=optional', + 'okhttp3;resolution:=optional', + 'okio;resolution:=optional', + '*', + ].join(','), + '-noee' : providers.gradleProperty('osgi.bnd.noee') + .orElse(providers.systemProperty('osgi.bnd.noee')) + .orElse('false') + .get() + ] + if (project.description != null) { + bndProperties['Bundle-Description'] = project.description + } + bnd(bndProperties) } } @@ -234,11 +264,13 @@ tasks.register('javadocJar', Jar) { } artifacts { - archives sourcesJar - archives javadocJar withoutOsgi jarWithoutOsgi } +tasks.named("assemble") { + dependsOn(tasks.named("sourcesJar"), tasks.named("javadocJar")) +} + // reject dependencyUpdates candidates with alpha or beta in their names: tasks.named("dependencyUpdates") { resolutionStrategy { @@ -294,7 +326,6 @@ tasks.named("generateStone", StoneTask) { ]) outputDir.set(project.layout.buildDirectory.dir("generated_stone_source/main/src")) - sourceSets { main { java.srcDir(outputDir) } } } tasks.named("generateTestStone", StoneTask) { @@ -315,10 +346,9 @@ tasks.named("generateTestStone", StoneTask) { ), ]) outputDir.set(project.layout.buildDirectory.dir("generated_stone_source/test/src")) - sourceSets { test { java.srcDir(outputDir) } } } mavenPublishing { - publishToMavenCentral(SonatypeHost.S01) + publishToMavenCentral() signAllPublications() } diff --git a/core/src/test/java/com/dropbox/core/v2/files/TagObjectIT.java b/core/src/test/java/com/dropbox/core/v2/files/TagObjectIT.java index a9a03605e..af80389d6 100644 --- a/core/src/test/java/com/dropbox/core/v2/files/TagObjectIT.java +++ b/core/src/test/java/com/dropbox/core/v2/files/TagObjectIT.java @@ -6,6 +6,7 @@ import org.testng.annotations.Test; import java.io.ByteArrayInputStream; +import java.util.Collections; import java.util.List; import java.util.Random; @@ -18,7 +19,7 @@ public class TagObjectIT { private List getTagsForPath(DbxClientV2 client, String dropboxPath) throws DbxException { - List pathToTags = client.files().tagsGet(List.of(dropboxPath)).getPathsToTags(); + List pathToTags = client.files().tagsGet(Collections.singletonList(dropboxPath)).getPathsToTags(); assertEquals(1, pathToTags.size()); // There is only one path (the one we asked for) PathToTags pathToTag = pathToTags.get(0); assertEquals(dropboxPath, pathToTag.getPath()); // This is the path we are looking for diff --git a/core/src/test/java/com/dropbox/core/v2/teamlog/GetTeamEventsResultTest.java b/core/src/test/java/com/dropbox/core/v2/teamlog/GetTeamEventsResultTest.java index 18871bc63..c1a7b4204 100644 --- a/core/src/test/java/com/dropbox/core/v2/teamlog/GetTeamEventsResultTest.java +++ b/core/src/test/java/com/dropbox/core/v2/teamlog/GetTeamEventsResultTest.java @@ -6,7 +6,6 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; -import java.nio.file.Path; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertTrue; @@ -68,6 +67,6 @@ private GetTeamEventsResult readGetTeamEventsResultFromFile(String filename) thr private String readJsonFromFile(String filename) throws IOException { File file = new File("src/test/java/com/dropbox/core/v2/teamlog/" + filename); System.out.println(file.getCanonicalPath()); - return Files.readString(Path.of(file.toURI()), StandardCharsets.US_ASCII); + return new String(Files.readAllBytes(file.toPath()), StandardCharsets.US_ASCII); } -} \ No newline at end of file +} diff --git a/dependencies/classpath.txt b/dependencies/classpath.txt index 43ea88ee8..8447090e3 100644 --- a/dependencies/classpath.txt +++ b/dependencies/classpath.txt @@ -1,168 +1,149 @@ -androidx.databinding:databinding-common:7.4.2 -androidx.databinding:databinding-compiler-common:7.4.2 -biz.aQute.bnd:biz.aQute.bndlib:5.2.0 -com.android.databinding:baseLibrary:7.4.2 -com.android.tools.analytics-library:crash:30.4.2 -com.android.tools.analytics-library:protos:30.4.2 -com.android.tools.analytics-library:shared:30.4.2 -com.android.tools.analytics-library:tracker:30.4.2 +androidx.databinding:databinding-common:9.2.1 +androidx.databinding:databinding-compiler-common:9.2.1 +biz.aQute.bnd.builder:biz.aQute.bnd.builder.gradle.plugin:7.3.0 +biz.aQute.bnd:biz.aQute.bnd.embedded-repo:7.3.0 +biz.aQute.bnd:biz.aQute.bnd.gradle:7.3.0 +biz.aQute.bnd:biz.aQute.bnd.util:7.3.0 +biz.aQute.bnd:biz.aQute.bndlib:7.3.0 +biz.aQute.bnd:biz.aQute.repository:7.3.0 +biz.aQute.bnd:biz.aQute.resolve:7.3.0 +com.android.databinding:baseLibrary:9.2.1 +com.android.tools.analytics-library:crash:32.2.1 +com.android.tools.analytics-library:protos:32.2.1 +com.android.tools.analytics-library:shared:32.2.1 +com.android.tools.analytics-library:tracker:32.2.1 com.android.tools.build.jetifier:jetifier-core:1.0.0-beta10 com.android.tools.build.jetifier:jetifier-processor:1.0.0-beta10 -com.android.tools.build:aapt2-proto:7.4.2-8841542 -com.android.tools.build:aaptcompiler:7.4.2 -com.android.tools.build:apksig:7.4.2 -com.android.tools.build:apkzlib:7.4.2 -com.android.tools.build:builder-model:7.4.2 -com.android.tools.build:builder-test-api:7.4.2 -com.android.tools.build:builder:7.4.2 -com.android.tools.build:bundletool:1.11.4 -com.android.tools.build:gradle-api:7.4.2 -com.android.tools.build:gradle-settings-api:7.4.2 -com.android.tools.build:gradle:7.4.2 -com.android.tools.build:manifest-merger:30.4.2 -com.android.tools.build:transform-api:2.0.0-deprecated-use-gradle-api -com.android.tools.ddms:ddmlib:30.4.2 -com.android.tools.layoutlib:layoutlib-api:30.4.2 -com.android.tools.lint:lint-model:30.4.2 -com.android.tools.lint:lint-typedef-remover:30.4.2 -com.android.tools.utp:android-device-provider-ddmlib-proto:30.4.2 -com.android.tools.utp:android-device-provider-gradle-proto:30.4.2 -com.android.tools.utp:android-test-plugin-host-additional-test-output-proto:30.4.2 -com.android.tools.utp:android-test-plugin-host-coverage-proto:30.4.2 -com.android.tools.utp:android-test-plugin-host-retention-proto:30.4.2 -com.android.tools.utp:android-test-plugin-result-listener-gradle-proto:30.4.2 -com.android.tools:annotations:30.4.2 -com.android.tools:common:30.4.2 -com.android.tools:dvlib:30.4.2 -com.android.tools:repository:30.4.2 -com.android.tools:sdk-common:30.4.2 -com.android.tools:sdklib:30.4.2 -com.android:signflinger:7.4.2 -com.android:zipflinger:7.4.2 -com.dropbox.dependency-guard:com.dropbox.dependency-guard.gradle.plugin:0.4.3 -com.dropbox.dependency-guard:dependency-guard:0.4.3 -com.github.ben-manes.versions:com.github.ben-manes.versions.gradle.plugin:0.42.0 -com.github.ben-manes:gradle-versions-plugin:0.42.0 -com.github.blindpirate.osgi:com.github.blindpirate.osgi.gradle.plugin:0.0.6 -com.github.gundy:semver4j:0.16.4 -com.google.android:annotations:4.1.1.4 -com.google.api.grpc:proto-google-common-protos:2.0.1 +com.android.tools.build:aapt2-proto:9.2.1-15009934 +com.android.tools.build:aaptcompiler:9.2.1 +com.android.tools.build:apksig:9.2.1 +com.android.tools.build:apkzlib:9.2.1 +com.android.tools.build:builder-model:9.2.1 +com.android.tools.build:builder-test-api:9.2.1 +com.android.tools.build:builder:9.2.1 +com.android.tools.build:bundletool:1.18.3 +com.android.tools.build:gradle-api:9.2.1 +com.android.tools.build:gradle-common-api:9.2.1 +com.android.tools.build:gradle-settings-api:9.2.1 +com.android.tools.build:gradle:9.2.1 +com.android.tools.build:manifest-merger:32.2.1 +com.android.tools.ddms:ddmlib:32.2.1 +com.android.tools.layoutlib:layoutlib-api:32.2.1 +com.android.tools.lint:lint-model:32.2.1 +com.android.tools.lint:lint-typedef-remover:32.2.1 +com.android.tools.utp:gradle-work-action-api:32.2.1 +com.android.tools:annotations:32.2.1 +com.android.tools:common:32.2.1 +com.android.tools:dvlib:32.2.1 +com.android.tools:repository:32.2.1 +com.android.tools:sdk-common:32.2.1 +com.android.tools:sdklib:32.2.1 +com.android:signflinger:9.2.1 +com.android:zipflinger:9.2.1 +com.dropbox.dependency-guard:com.dropbox.dependency-guard.gradle.plugin:0.5.0 +com.dropbox.dependency-guard:dependency-guard:0.5.0 +com.github.ben-manes.versions:com.github.ben-manes.versions.gradle.plugin:0.54.0 +com.github.ben-manes:gradle-versions-plugin:0.54.0 com.google.auto.value:auto-value-annotations:1.6.2 com.google.code.findbugs:jsr305:3.0.2 -com.google.code.gson:gson:2.8.9 -com.google.crypto.tink:tink:1.3.0-rc2 +com.google.code.gson:gson:2.11.0 +com.google.crypto.tink:tink:1.7.0 com.google.dagger:dagger:2.28.3 -com.google.errorprone:error_prone_annotations:2.4.0 +com.google.errorprone:error_prone_annotations:2.28.0 com.google.flatbuffers:flatbuffers-java:1.12.0 -com.google.guava:failureaccess:1.0.1 -com.google.guava:guava:30.1-jre +com.google.guava:failureaccess:1.0.2 +com.google.guava:guava:33.3.1-jre com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava -com.google.j2objc:j2objc-annotations:1.3 +com.google.j2objc:j2objc-annotations:3.0.0 com.google.jimfs:jimfs:1.1 -com.google.protobuf:protobuf-java-util:3.17.2 -com.google.protobuf:protobuf-java:3.17.2 -com.google.testing.platform:core-proto:0.0.8-alpha08 -com.googlecode.java-diff-utils:diffutils:1.3.0 +com.google.protobuf:protobuf-java-util:3.25.5 +com.google.protobuf:protobuf-java:3.25.5 com.googlecode.juniversalchardet:juniversalchardet:1.0.3 -com.squareup.moshi:moshi:1.14.0 -com.squareup.okhttp3:okhttp:4.10.0 -com.squareup.okio:okio-jvm:3.0.0 -com.squareup.okio:okio:3.0.0 -com.squareup.retrofit2:converter-moshi:2.9.0 -com.squareup.retrofit2:retrofit:2.9.0 -com.squareup:javapoet:1.10.0 +com.squareup.moshi:moshi-kotlin:1.15.2 +com.squareup.moshi:moshi:1.15.2 +com.squareup.okhttp3:okhttp-jvm:5.1.0 +com.squareup.okhttp3:okhttp:5.1.0 +com.squareup.okio:okio-jvm:3.15.0 +com.squareup.okio:okio:3.15.0 +com.squareup.retrofit2:converter-moshi:3.0.0 +com.squareup.retrofit2:converter-scalars:3.0.0 +com.squareup.retrofit2:retrofit:3.0.0 +com.squareup:javapoet:1.13.0 com.squareup:javawriter:2.5.0 -com.sun.activation:javax.activation:1.2.0 com.sun.istack:istack-commons-runtime:3.0.8 com.sun.xml.fastinfoset:FastInfoset:1.2.16 -com.thoughtworks.xstream:xstream:1.4.17 -com.vanniktech.maven.publish:com.vanniktech.maven.publish.gradle.plugin:0.24.0 -com.vanniktech:gradle-maven-publish-plugin:0.24.0 -com.vanniktech:nexus:0.24.0 -commons-codec:commons-codec:1.11 -commons-io:commons-io:2.4 +com.vanniktech.maven.publish:com.vanniktech.maven.publish.gradle.plugin:0.37.0 +com.vanniktech:central-portal:0.37.0 +com.vanniktech:gradle-maven-publish-plugin:0.37.0 +commons-codec:commons-codec:1.17.1 +commons-io:commons-io:2.16.1 commons-logging:commons-logging:1.2 -de.undercouch:gradle-download-task:4.1.1 -gradle.plugin.com.github.blindpirate:gradle-legacy-osgi-plugin:0.0.6 -io.github.x-stream:mxparser:1.2.1 -io.grpc:grpc-api:1.39.0 -io.grpc:grpc-context:1.39.0 -io.grpc:grpc-core:1.39.0 -io.grpc:grpc-netty:1.39.0 -io.grpc:grpc-protobuf-lite:1.39.0 -io.grpc:grpc-protobuf:1.39.0 -io.grpc:grpc-stub:1.39.0 -io.netty:netty-buffer:4.1.52.Final -io.netty:netty-codec-http2:4.1.52.Final -io.netty:netty-codec-http:4.1.52.Final -io.netty:netty-codec-socks:4.1.52.Final -io.netty:netty-codec:4.1.52.Final -io.netty:netty-common:4.1.52.Final -io.netty:netty-handler-proxy:4.1.52.Final -io.netty:netty-handler:4.1.52.Final -io.netty:netty-resolver:4.1.52.Final -io.netty:netty-transport:4.1.52.Final -io.perfmark:perfmark-api:0.23.0 +io.github.java-diff-utils:java-diff-utils:4.12 jakarta.activation:jakarta.activation-api:1.2.1 jakarta.xml.bind:jakarta.xml.bind-api:2.3.2 -javax.annotation:javax.annotation-api:1.3.2 javax.inject:javax.inject:1 net.java.dev.jna:jna-platform:5.6.0 net.java.dev.jna:jna:5.6.0 net.sf.jopt-simple:jopt-simple:4.9 net.sf.kxml:kxml2:2.3.0 -org.apache.commons:commons-compress:1.20 -org.apache.httpcomponents:httpclient:4.5.13 -org.apache.httpcomponents:httpcore:4.4.13 +org.apache.commons:commons-compress:1.27.1 +org.apache.commons:commons-lang3:3.16.0 +org.apache.httpcomponents:httpclient:4.5.14 +org.apache.httpcomponents:httpcore:4.4.16 org.apache.httpcomponents:httpmime:4.5.6 -org.bitbucket.b_c:jose4j:0.7.0 -org.bouncycastle:bcpkix-jdk15on:1.67 -org.bouncycastle:bcprov-jdk15on:1.67 -org.checkerframework:checker-qual:3.5.0 -org.codehaus.mojo:animal-sniffer-annotations:1.19 +org.bitbucket.b_c:jose4j:0.9.5 +org.bouncycastle:bcpkix-jdk18on:1.79 +org.bouncycastle:bcprov-jdk18on:1.79 +org.bouncycastle:bcutil-jdk18on:1.79 +org.checkerframework:checker-qual:3.43.0 org.glassfish.jaxb:jaxb-runtime:2.3.2 org.glassfish.jaxb:txw2:2.3.2 org.jdom:jdom2:2.0.6 -org.jetbrains.intellij.deps:trove4j:1.0.20200330 -org.jetbrains.kotlin:kotlin-android-extensions:1.6.21 -org.jetbrains.kotlin:kotlin-annotation-processing-gradle:1.6.21 -org.jetbrains.kotlin:kotlin-build-common:1.6.21 -org.jetbrains.kotlin:kotlin-compiler-embeddable:1.6.21 -org.jetbrains.kotlin:kotlin-compiler-runner:1.6.21 -org.jetbrains.kotlin:kotlin-daemon-client:1.6.21 -org.jetbrains.kotlin:kotlin-daemon-embeddable:1.6.21 -org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.6.21 -org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.6.21 -org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.21 -org.jetbrains.kotlin:kotlin-klib-commonizer-api:1.6.21 -org.jetbrains.kotlin:kotlin-native-utils:1.6.21 -org.jetbrains.kotlin:kotlin-project-model:1.6.21 -org.jetbrains.kotlin:kotlin-reflect:1.7.10 -org.jetbrains.kotlin:kotlin-scripting-common:1.6.21 -org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.6.21 -org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.6.21 -org.jetbrains.kotlin:kotlin-scripting-jvm:1.6.21 -org.jetbrains.kotlin:kotlin-stdlib-common:1.8.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0 -org.jetbrains.kotlin:kotlin-stdlib:1.8.0 -org.jetbrains.kotlin:kotlin-tooling-metadata:1.6.21 -org.jetbrains.kotlin:kotlin-util-io:1.6.21 -org.jetbrains.kotlin:kotlin-util-klib:1.6.21 -org.jetbrains.kotlinx.binary-compatibility-validator:org.jetbrains.kotlinx.binary-compatibility-validator.gradle.plugin:0.11.1 -org.jetbrains.kotlinx:binary-compatibility-validator:0.11.1 -org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.0 -org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.5.0 -org.jetbrains:annotations:13.0 -org.json:json:20180813 +org.jetbrains.kotlin:fus-statistics-gradle-plugin:2.4.0 +org.jetbrains.kotlin:kotlin-bom:2.0.21 +org.jetbrains.kotlin:kotlin-build-statistics:2.4.0 +org.jetbrains.kotlin:kotlin-build-tools-api:2.4.0 +org.jetbrains.kotlin:kotlin-compiler-runner:2.4.0 +org.jetbrains.kotlin:kotlin-daemon-client:2.4.0 +org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:2.4.0 +org.jetbrains.kotlin:kotlin-gradle-plugin-api:2.4.0 +org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:2.4.0 +org.jetbrains.kotlin:kotlin-gradle-plugin-idea:2.4.0 +org.jetbrains.kotlin:kotlin-gradle-plugin:2.4.0 +org.jetbrains.kotlin:kotlin-gradle-plugins-bom:2.4.0 +org.jetbrains.kotlin:kotlin-klib-commonizer-api:2.4.0 +org.jetbrains.kotlin:kotlin-native-utils:2.4.0 +org.jetbrains.kotlin:kotlin-reflect:2.2.10 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.10 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.10 +org.jetbrains.kotlin:kotlin-stdlib:2.2.10 +org.jetbrains.kotlin:kotlin-tooling-core:2.4.0 +org.jetbrains.kotlin:kotlin-util-io:2.4.0 +org.jetbrains.kotlin:kotlin-util-klib-metadata:2.4.0 +org.jetbrains.kotlin:kotlin-util-klib:2.4.0 +org.jetbrains.kotlinx.binary-compatibility-validator:org.jetbrains.kotlinx.binary-compatibility-validator.gradle.plugin:0.18.1 +org.jetbrains.kotlinx:binary-compatibility-validator:0.18.1 +org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 +org.jetbrains:annotations:23.0.0 org.jvnet.staxex:stax-ex:1.8.1 -org.ow2.asm:asm-analysis:9.2 -org.ow2.asm:asm-commons:9.2 -org.ow2.asm:asm-tree:9.2 -org.ow2.asm:asm-util:9.2 -org.ow2.asm:asm:9.2 -org.slf4j:slf4j-api:1.7.30 -org.tensorflow:tensorflow-lite-metadata:0.1.0-rc2 -xerces:xercesImpl:2.12.0 -xml-apis:xml-apis:1.4.01 -xmlpull:xmlpull:1.1.3.1 +org.osgi:org.osgi.dto:1.0.0 +org.osgi:org.osgi.framework:1.8.0 +org.osgi:org.osgi.resource:1.0.0 +org.osgi:org.osgi.service.coordinator:1.0.2 +org.osgi:org.osgi.service.log:1.3.0 +org.osgi:org.osgi.service.repository:1.1.0 +org.osgi:org.osgi.service.resolver:1.1.1 +org.osgi:org.osgi.service.serviceloader:1.0.0 +org.osgi:org.osgi.util.function:1.2.0 +org.osgi:org.osgi.util.promise:1.3.0 +org.osgi:org.osgi.util.tracker:1.5.4 +org.osgi:osgi.annotation:8.1.0 +org.ow2.asm:asm-analysis:9.9 +org.ow2.asm:asm-commons:9.9 +org.ow2.asm:asm-tree:9.9 +org.ow2.asm:asm-util:9.9 +org.ow2.asm:asm:9.9 +org.slf4j:slf4j-api:2.0.18 +org.tensorflow:tensorflow-lite-metadata:0.2.0 diff --git a/examples/android/build.gradle b/examples/android/build.gradle index 1ceee7dbb..55e2d7e78 100644 --- a/examples/android/build.gradle +++ b/examples/android/build.gradle @@ -1,19 +1,22 @@ plugins { id 'com.android.application' - id 'org.jetbrains.kotlin.android' alias(dropboxJavaSdkLibs.plugins.dependency.guard) } android { - compileSdkVersion dropboxJavaSdkLibs.versions.android.compile.sdk.get().toInteger() - buildToolsVersion "33.0.1" + namespace = "com.dropbox.core.examples.android" + compileSdk = dropboxJavaSdkLibs.versions.android.compile.sdk.get().toInteger() + + buildFeatures { + buildConfig = true + } defaultConfig { - applicationId "com.dropbox.core.examples.android" - minSdkVersion dropboxJavaSdkLibs.versions.android.min.sdk.get() - targetSdkVersion dropboxJavaSdkLibs.versions.android.target.sdk.get() - versionCode 1 - versionName "1.0" + applicationId = "com.dropbox.core.examples.android" + minSdk = dropboxJavaSdkLibs.versions.android.min.sdk.get().toInteger() + targetSdk = dropboxJavaSdkLibs.versions.android.target.sdk.get().toInteger() + versionCode = 1 + versionName = "1.0" Properties localProperties = getLocalProperties() String dropboxKey = localProperties['DROPBOX_APP_KEY'] @@ -27,34 +30,35 @@ android { buildTypes { release { - minifyEnabled true - shrinkResources true + minifyEnabled = true + shrinkResources = true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } debug { - minifyEnabled false - shrinkResources false + minifyEnabled = false + shrinkResources = false } } - packagingOptions { - exclude 'META-INF/LICENSE' - exclude 'META-INF/LICENSE.txt' - exclude 'META-INF/NOTICE' - exclude 'META-INF/NOTICE.txt' + packaging { + resources { + excludes += [ + 'META-INF/LICENSE', + 'META-INF/LICENSE.txt', + 'META-INF/NOTICE', + 'META-INF/NOTICE.txt' + ] + } } - lintOptions { - disable 'InvalidPackage' - abortOnError false + lint { + disable += 'InvalidPackage' + abortOnError = false } - kotlinOptions { - jvmTarget = '1.8' - } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 } } diff --git a/examples/android/dependencies/releaseRuntimeClasspath.txt b/examples/android/dependencies/releaseRuntimeClasspath.txt index 16f3912ea..7fca3d431 100644 --- a/examples/android/dependencies/releaseRuntimeClasspath.txt +++ b/examples/android/dependencies/releaseRuntimeClasspath.txt @@ -58,10 +58,10 @@ com.google.code.findbugs:jsr305:3.0.2 com.google.guava:listenablefuture:1.0 com.squareup.okhttp3:okhttp:4.0.0 com.squareup.okio:okio:2.2.2 -org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -org.jetbrains.kotlin:kotlin-stdlib:1.6.21 +org.jetbrains.kotlin:kotlin-stdlib-common:2.4.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0 +org.jetbrains.kotlin:kotlin-stdlib:2.4.0 org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 diff --git a/examples/android/src/main/AndroidManifest.xml b/examples/android/src/main/AndroidManifest.xml index fb97c7de1..de457641d 100644 --- a/examples/android/src/main/AndroidManifest.xml +++ b/examples/android/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ - + diff --git a/examples/examples/build.gradle b/examples/examples/build.gradle index 89b8a115c..c8807e09e 100644 --- a/examples/examples/build.gradle +++ b/examples/examples/build.gradle @@ -1,6 +1,6 @@ plugins { id("java") - id("kotlin") + id("org.jetbrains.kotlin.jvm") } description = 'Consolidated Examples' @@ -10,6 +10,16 @@ java { targetCompatibility = JavaVersion.VERSION_1_8 } +kotlin { + compilerOptions { + jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8) + } +} + +tasks.withType(JavaCompile).configureEach { + options.release.set(8) +} + dependencies { implementation(project(":core")) implementation(dropboxJavaSdkLibs.apache.commons.lang) diff --git a/examples/java/build.gradle b/examples/java/build.gradle index d45027021..b56f44fc1 100644 --- a/examples/java/build.gradle +++ b/examples/java/build.gradle @@ -15,6 +15,10 @@ java { targetCompatibility = JavaVersion.VERSION_1_8 } +tasks.withType(JavaCompile).configureEach { + options.release.set(8) +} + dependencies { implementation(project(":core")) diff --git a/gradle.properties b/gradle.properties index 6a42913ce..c5ec64f2d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,7 +16,7 @@ POM_DEVELOPER_NAME = Dropbox API Team POM_DEVELOPER_URL = https://github.com/dropbox/ POM_DEVELOPER_EMAIL = api-support@dropbox.com -org.gradle.unsafe.configuration-cache=true +org.gradle.configuration-cache=true org.gradle.caching=true # Use AndroidX diff --git a/gradle/dropboxJavaSdkLibs.versions.toml b/gradle/dropboxJavaSdkLibs.versions.toml index e98935612..9b8c77bcc 100644 --- a/gradle/dropboxJavaSdkLibs.versions.toml +++ b/gradle/dropboxJavaSdkLibs.versions.toml @@ -1,13 +1,13 @@ [versions] -android-compile-sdk = "33" -android-gradle-plugin = "7.4.2" +android-compile-sdk = "36" +android-gradle-plugin = "9.2.1" android-min-sdk = "26" android-target-sdk = "33" androidx-activity = "1.5.0" -binary-compatibility-validator = "0.11.1" -dependency-guard = "0.4.3" +binary-compatibility-validator = "0.18.1" +dependency-guard = "0.5.0" junit-jupiter = "5.8.2" -kotlin = "1.6.21" +kotlin = "2.4.0" kotlin-coroutines = "1.6.4" [libraries] @@ -23,7 +23,7 @@ androidx-recyclerview = 'androidx.recyclerview:recyclerview:1.2.1' apache-commons-lang = "org.apache.commons:commons-lang3:3.4" appengine-api = 'com.google.appengine:appengine-api-1.0-sdk:1.9.38' glide = 'com.github.bumptech.glide:glide:4.12.0' -guardsquare-proguard-gradle = 'com.guardsquare:proguard-gradle:7.3.1' +guardsquare-proguard-gradle = 'com.guardsquare:proguard-gradle:7.9.1' jackson-core = 'com.fasterxml.jackson.core:jackson-core:2.15.0' jackson-databind = 'com.fasterxml.jackson.core:jackson-databind:2.15.0' jetty-server = "org.eclipse.jetty:jetty-server:11.0.15" @@ -56,8 +56,8 @@ truth = "com.google.truth:truth:1.1.2" [plugins] binary-compatibility-validator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version.ref = "binary-compatibility-validator" } -blind-pirate-osgi = "com.github.blindpirate.osgi:0.0.6" +bnd-builder = "biz.aQute.bnd.builder:7.3.0" dependency-guard = { id = "com.dropbox.dependency-guard", version.ref = "dependency-guard" } -gradle-version-plugin = "com.github.ben-manes.versions:0.42.0" +gradle-version-plugin = "com.github.ben-manes.versions:0.54.0" kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } -maven-publish-plugin = "com.vanniktech.maven.publish:0.24.0" \ No newline at end of file +maven-publish-plugin = "com.vanniktech.maven.publish:0.37.0" diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index afba10928..b1b8ef56b 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4e86b9270..eb84db68d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,9 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.0-bin.zip networkTimeout=10000 +retries=0 +retryBackOffMs=500 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 65dcd68d6..249efbb03 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,10 +15,12 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # -# Gradle start up script for POSIX generated by Gradle. +# gradlew start up script for POSIX generated by Gradle. # # Important for running: # @@ -27,7 +29,7 @@ # bash, then to run this script, type that shell name before the whole # command line, like: # -# ksh Gradle +# ksh gradlew # # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -83,10 +85,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -133,10 +132,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -144,7 +146,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +154,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -169,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -197,16 +198,19 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 6689b85be..8508ef684 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,16 +13,18 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem -@rem Gradle startup script for Windows +@rem gradlew startup script for Windows @rem @rem ########################################################################## -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal +@rem Set local scope for the variables, and ensure extensions are enabled +setlocal EnableExtensions set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. @@ -43,13 +45,13 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% @@ -57,36 +59,24 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% -:mainEnd -if "%OS%"=="Windows_NT" endlocal +@rem Execute gradlew +@rem endlocal doesn't take effect until after the line is parsed and variables are expanded +@rem which allows us to clear the local environment before executing the java command +endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel -:omega +:exitWithErrorLevel +@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts +"%COMSPEC%" /c exit %ERRORLEVEL% diff --git a/proguard/build.gradle b/proguard/build.gradle index 5bf4a5552..82c7654d7 100644 --- a/proguard/build.gradle +++ b/proguard/build.gradle @@ -2,9 +2,19 @@ apply plugin: 'java' description = 'ProGuard minified SDK test suite for ProGuard compatibility tests.' group = 'com.dropbox.core.test' -archivesBaseName = 'dropbox-proguard-test' -sourceCompatibility = JavaVersion.VERSION_1_8 -targetCompatibility = JavaVersion.VERSION_1_8 + +base { + archivesName = 'dropbox-proguard-test' +} + +java { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} + +tasks.withType(JavaCompile).configureEach { + options.release.set(8) +} ext { authInfoPropertyName = 'com.dropbox.test.authInfoFile' @@ -39,32 +49,16 @@ tasks.named("compileJava", JavaCompile).configure { options.encoding = 'utf-8' } -// copied from rootProject's build.gradle. We avoid using subprojects due to Android Studio bug and -// dbapp-android integration. -def getAuthInfoFile() { - if (!project.hasProperty(authInfoPropertyName)) { - throw new GradleException('' + - "These tests require the \"${authInfoPropertyName}\" " + - "project property be set to point to an authorization JSON file " + - "(e.g. ./gradlew proguardTest -P${authInfoPropertyName}=auth.json)." - ) - } - - def authInfoFile = file(project.property(authInfoPropertyName)) - if (!authInfoFile.exists()) { - throw new GradleException('' + - "The test auth info file does not exist: \"${authInfoFile.absolutePath}\". " + - "Please ensure the \"${authInfoPropertyName}\" project property is set to point to " + - "the correct authorization JSON file." - ) - } - return authInfoFile +def projectDirPath = layout.projectDirectory.asFile.toPath() +def authInfoFileProvider = providers.gradleProperty(authInfoPropertyName).map { authInfoFilePath -> + projectDirPath.resolve(authInfoFilePath).normalize().toFile() } - tasks.register('proguard', proguard.gradle.ProGuardTask) { - def buildDir = project.buildDir - def archivesBaseName = project.archivesBaseName + def mainRuntimeClasspath = sourceSets.main.runtimeClasspath + def mainCompileClasspath = sourceSets.main.compileClasspath + def buildDir = layout.buildDirectory.get().asFile + def archivesBaseName = base.archivesName.get() def version = project.version ext { configDir = file("src/main/resources/proguard/") @@ -75,7 +69,7 @@ tasks.register('proguard', proguard.gradle.ProGuardTask) { inputs.dir configDir inputs.file configFile - injars sourceSets.main.runtimeClasspath, filter: '!META-INF/*' + injars mainRuntimeClasspath, filter: '!META-INF/*' if (System.getProperty('java.version').startsWith('1.')) { libraryjars "${System.getProperty('java.home')}/lib/rt.jar" } else { @@ -85,8 +79,8 @@ tasks.register('proguard', proguard.gradle.ProGuardTask) { //libraryjars "${System.getProperty('java.home')}/jmods/java.sql.jmod", jarfilter: '!**.jar', filter: '!module-info.class' //libraryjars "${System.getProperty('java.home')}/jmods/....." } - libraryjars sourceSets.main.compileClasspath.filter { file -> - return !sourceSets.main.runtimeClasspath.contains(file) + libraryjars mainCompileClasspath.filter { file -> + return !mainRuntimeClasspath.contains(file) } outjars proguardJar @@ -100,10 +94,25 @@ tasks.register('proguard', proguard.gradle.ProGuardTask) { tasks.register('proguardTest', JavaExec) { dependsOn(tasks.named("proguard")) classpath = files(proguard.proguardJar) - main = 'com.dropbox.core.test.proguard.Main' - ignoreExitValue false + mainClass = 'com.dropbox.core.test.proguard.Main' + ignoreExitValue = false doFirst { - args getAuthInfoFile().absolutePath + def authInfoFile = authInfoFileProvider.orNull + if (authInfoFile == null) { + throw new GradleException('' + + "These tests require the \"${authInfoPropertyName}\" " + + "project property be set to point to an authorization JSON file " + + "(e.g. ./gradlew proguardTest -P${authInfoPropertyName}=auth.json)." + ) + } + if (!authInfoFile.exists()) { + throw new GradleException('' + + "The test auth info file does not exist: \"${authInfoFile.absolutePath}\". " + + "Please ensure the \"${authInfoPropertyName}\" project property is set to point to " + + "the correct authorization JSON file." + ) + } + args authInfoFile.absolutePath } } diff --git a/stone-java-gradle-plugin/src/main/kotlin/com/dropbox/stone/java/StonePlugin.kt b/stone-java-gradle-plugin/src/main/kotlin/com/dropbox/stone/java/StonePlugin.kt index 93b2d1b8d..cedfd5b62 100644 --- a/stone-java-gradle-plugin/src/main/kotlin/com/dropbox/stone/java/StonePlugin.kt +++ b/stone-java-gradle-plugin/src/main/kotlin/com/dropbox/stone/java/StonePlugin.kt @@ -42,27 +42,27 @@ class StonePlugin : Plugin { val taskName: String = if (isMainSourceSet) { "generateStone" } else { - "generate${sourceSet.name.capitalize()}Stone" + "generate${sourceSet.name.replaceFirstChar { it.uppercaseChar() }}Stone" } + val generatedSourceDir = project.layout.buildDirectory.dir("generated/source/stone/${sourceSet.name}/src") - project.tasks.register(taskName, StoneTask::class.java) { + val taskProvider = project.tasks.register(taskName, StoneTask::class.java) { description = "Generate Stone Java source files for ${sourceSet.name}." val routeWhitelistFilterPropName = "com.dropbox.api.${sourceSet.name}.routeWhitelistFilter" - val routeWhitelistFilterValue: String? = project.properties[routeWhitelistFilterPropName] as String? + val routeWhitelistFilterValue: String? = project.findProperty(routeWhitelistFilterPropName) as String? if (!routeWhitelistFilterValue.isNullOrBlank()) routeWhitelistFilter.set(File(routeWhitelistFilterValue)) val specDirPropName = "com.dropbox.api.${sourceSet.name}.specDir" - val specDirPropNameValue: String? = project.properties[specDirPropName] as String? + val specDirPropNameValue: String? = project.findProperty(specDirPropName) as String? val mySpecDir: String = specDirPropNameValue ?: "src/${sourceSet.name}/stone" specDir.set(File(mySpecDir)) generatorFile.set(File("${project.layout.projectDirectory}/generator/java/java.stoneg.py")) stoneDir.set(File("stone")) pythonCommand.set("python") - outputDir.set(File("${project.layout.buildDirectory}/generated/source/stone/${sourceSet.name}/src")) - - sourceSet.java.srcDir("${outputDir}/src") + outputDir.set(generatedSourceDir) } + sourceSet.java.srcDir(taskProvider.flatMap { it.outputDir }) } }