diff --git a/.github/workflows/check_pr.yml b/.github/workflows/check_pr.yml new file mode 100644 index 0000000..87c7eca --- /dev/null +++ b/.github/workflows/check_pr.yml @@ -0,0 +1,20 @@ +name: Check Pull Request + +on: + pull_request_target: + types: [ opened ] + +jobs: + run: + if: | + github.repository != github.event.pull_request.head.repo.full_name && + ( + (github.head_ref == 'master' || github.head_ref == '3.1.x') || + github.event.pull_request.head.repo.owner.type != 'User' + ) + runs-on: ubuntu-latest + steps: + - uses: superbrothers/close-pull-request@v3 + id: "master_branch" + with: + comment: "This Pull Request is created from a restricted branch name. This can cause issues in the maintenance of the Pull Request; please create a new branch instead." diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index abb747c..e1ef450 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -1,69 +1,83 @@ name: Java CI on: - push: - paths: - - '**.gradle' - - '**.properties' - - '**/src/**' - branches: - - 'master' - - '3.1.x' - tags-ignore: - - '*.*' - pull_request: - paths: - - '**.gradle' - - '**.properties' - - '**/src/**' - types: [opened, synchronize, reopened] + workflow_dispatch: + push: + paths: + - '**.gradle' + - '**.properties' + - '**/src/**' + - '.github/workflows/**' + branches: + - 'master' + - '3.1.x' + tags-ignore: + - '*.*' + pull_request: + paths: + - '**.gradle' + - '**.properties' + - '**/src/**' + types: [ opened, synchronize, reopened ] jobs: - build: - name: Build for JDK ${{ matrix.java }} - runs-on: ubuntu-latest - strategy: - matrix: - java: [ 8, 11 ] - steps: - - uses: actions/checkout@v2 - - uses: actions/cache@v1 - with: - path: ~/.gradle/caches - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} - restore-keys: | - ${{ runner.os }}-gradle- - - name: Set up JDK ${{ matrix.java }} - uses: actions/setup-java@v1 - with: - java-version: ${{ matrix.java }} - - name: Build with Gradle - run: ./gradlew build - if: | - !contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.pull_request.title, '[ci skip]') - release: - name: Publish artifacts - runs-on: ubuntu-latest - if: github.event_name != 'pull_request' - needs: build - steps: - - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - uses: actions/cache@v1 - with: - path: ~/.gradle/caches - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} - restore-keys: | - ${{ runner.os }}-gradle- - - name: Set up JDK - uses: actions/setup-java@v1 - with: - java-version: 8 - - name: Publish with Gradle - run: ./gradlew -x test publish + build: + name: Build for JDK ${{ matrix.java }} + runs-on: ubuntu-latest + strategy: + matrix: + java: [ 8, 11, 17, 21 ] + steps: + - name: PR Check (PR Blocked by Dependency) + if: ${{ contains(toJson(github.event.pull_request.labels.*.name), 'PR depends on PR') }} + run: echo "::warning::This PR was marked with the label 'PR depends on PR' this can cause issues in building" + - uses: actions/checkout@v4 + - uses: actions/cache@v4 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} + restore-keys: | + ${{ runner.os }}-gradle- + - name: Set up JDK ${{ matrix.java }} + uses: actions/setup-java@v4 + with: + java-version: ${{ matrix.java }} + distribution: 'temurin' + - name: Build with Gradle + run: ./gradlew build + release: + name: Publish artifacts + runs-on: ubuntu-latest + if: ${{ github.event_name != 'pull_request' && ( (vars.runReleaseOnPush || 'true') == 'true' || contains(github.event.head_commit.message, '[release]') ) }} + needs: build env: - ORG_GRADLE_PROJECT_signingKey: ${{ secrets.signingKey }} - ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.signingPassword }} - ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.sonatypeUsername }} - ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.sonatypePassword }} + HAS_CREDENTIALS: ${{ secrets.signingKey != '' && secrets.signingPassword != '' && secrets.sonatypeUsername != '' && secrets.sonatypePassword != '' }} + steps: + - name: Validate repository secrets for publish + if: ${{ env.HAS_CREDENTIALS != 'true' }} + run: | + echo '### Release Failed ❌' >> $GITHUB_STEP_SUMMARY + echo 'This repository does not have all required secrets: signingKey, signingPassword, sonatypeUsername or sonatypePassword).' >> $GITHUB_STEP_SUMMARY + echo "::error::This repository does not have all required secrets: signingKey, signingPassword, sonatypeUsername or sonatypePassword)." + exit -1 + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: actions/cache@v4 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} + restore-keys: | + ${{ runner.os }}-gradle- + - name: Set up JDK + uses: actions/setup-java@v4 + with: + java-version: 11 + distribution: 'temurin' + - name: Publish with Gradle + run: ./gradlew -x test publish + env: + ORG_GRADLE_PROJECT_signingKey: ${{ secrets.signingKey }} + ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.signingPassword }} + ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.sonatypeUsername }} + ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.sonatypePassword }} diff --git a/README.md b/README.md index dd12484..18c869d 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,10 @@ [![Support Server Invite](https://img.shields.io/discord/208023865127862272.svg?color=7289da&label=Discord4J&logo=discord&style=flat-square)](https://discord.gg/NxGAeCY) [![Maven Central](https://img.shields.io/maven-central/v/com.discord4j/stores-api.svg?style=flat-square)](https://search.maven.org/artifact/com.discord4j/stores-api) [![Javadocs](https://www.javadoc.io/badge/com.discord4j/stores-api.svg?color=blue&style=flat-square)](https://www.javadoc.io/doc/com.discord4j/stores-api) -[![GitHub Workflow Status (branch)](https://img.shields.io/github/workflow/status/Discord4J/Stores/Java%20CI/master?logo=github&style=flat-square)](https://github.com/Discord4J/Stores/actions) +[![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/Discord4J/Stores/gradle.yml?branch=master&logo=github&style=flat-square)](https://github.com/Discord4J/Stores/actions) -A set of pre-made store implementations for Discord4J v3.0 and higher +A set of pre-made store implementations for Discord4J v3.2 and higher Dependencies: diff --git a/api/build.gradle b/api/build.gradle index 6418367..0f09bc5 100644 --- a/api/build.gradle +++ b/api/build.gradle @@ -4,13 +4,13 @@ dependencies { api "com.fasterxml.jackson.core:jackson-databind:$jackson_version" annotationProcessor "com.austinv11.servicer:Servicer:$servicer_version" - testImplementation "junit:junit:$junit_version" + testImplementation "org.junit.jupiter:junit-jupiter-engine:$junit_version" testAnnotationProcessor "com.austinv11.servicer:Servicer:$servicer_version" } jar { manifest { - attributes 'Implementation-Title': archivesBaseName, + attributes 'Implementation-Title': base.archivesName.get(), 'Implementation-Version': archiveVersion, 'Automatic-Module-Name': 'discord4j.store.api' } diff --git a/api/src/test/java/discord4j/store/api/service/StoreTests.java b/api/src/test/java/discord4j/store/api/service/StoreTests.java index d0f2a57..4e0c541 100644 --- a/api/src/test/java/discord4j/store/api/service/StoreTests.java +++ b/api/src/test/java/discord4j/store/api/service/StoreTests.java @@ -19,8 +19,7 @@ import discord4j.store.api.Store; import discord4j.store.api.noop.NoOpStoreService; import discord4j.store.api.primitive.ForwardingStoreService; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.util.function.Tuple2; @@ -28,7 +27,7 @@ import java.util.*; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class StoreTests { @@ -41,7 +40,7 @@ private Store newStore() { @Test public void testServiceDiscovery() { assertTrue(provider.getStoreService() instanceof ForwardingStoreService); - Assert.assertEquals(TestService.class, + assertEquals(TestService.class, ((ForwardingStoreService) provider.getStoreService()).getOriginal().getClass()); } @@ -49,7 +48,7 @@ public void testServiceDiscovery() { public void testGenericFallback() { assertTrue(provider.getStoreService() instanceof ForwardingStoreService); assertTrue(provider.getStoreService().hasLongObjStores()); - Assert.assertEquals(TestService.class, + assertEquals(TestService.class, ((ForwardingStoreService) provider.getStoreService()).getOriginal().getClass()); } @@ -59,7 +58,7 @@ public void testOrder() { override.put(TestService.class, Integer.MAX_VALUE); override.put(NoOpStoreService.class, Integer.MIN_VALUE); StoreServiceLoader overridden = new StoreServiceLoader(override); - Assert.assertEquals(TestService.class, + assertEquals(TestService.class, ((ForwardingStoreService) provider.getStoreService()).getOriginal().getClass()); assertEquals(NoOpStoreService.class, overridden.getStoreService().getClass()); } diff --git a/api/src/test/java/discord4j/store/api/util/LongObjTuple2Test.java b/api/src/test/java/discord4j/store/api/util/LongObjTuple2Test.java index 74f9231..d223a52 100644 --- a/api/src/test/java/discord4j/store/api/util/LongObjTuple2Test.java +++ b/api/src/test/java/discord4j/store/api/util/LongObjTuple2Test.java @@ -16,12 +16,13 @@ */ package discord4j.store.api.util; -import org.junit.Test; +import org.junit.jupiter.api.Test; import reactor.util.function.Tuple2; import reactor.util.function.Tuples; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; public class LongObjTuple2Test { @@ -36,9 +37,9 @@ public void testConstruction() { assertEquals(obj, tuple.getT2()); } - @Test(expected = NullPointerException.class) + @Test public void testNullObj() { - LongObjTuple2.of(key, null); + assertThrows(NullPointerException.class, () -> LongObjTuple2.of(key, null)); } @Test diff --git a/api/src/test/java/discord4j/store/api/util/MappingIterableTest.java b/api/src/test/java/discord4j/store/api/util/MappingIterableTest.java index b8d5944..adf932c 100644 --- a/api/src/test/java/discord4j/store/api/util/MappingIterableTest.java +++ b/api/src/test/java/discord4j/store/api/util/MappingIterableTest.java @@ -16,11 +16,11 @@ */ package discord4j.store.api.util; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.Arrays; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; public class MappingIterableTest { diff --git a/api/src/test/java/discord4j/store/api/util/WithinRangePredicateTest.java b/api/src/test/java/discord4j/store/api/util/WithinRangePredicateTest.java index dc3e504..305f1fa 100644 --- a/api/src/test/java/discord4j/store/api/util/WithinRangePredicateTest.java +++ b/api/src/test/java/discord4j/store/api/util/WithinRangePredicateTest.java @@ -16,10 +16,10 @@ */ package discord4j.store.api.util; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; public class WithinRangePredicateTest { diff --git a/build.gradle b/build.gradle index 9febbdf..cb6708e 100644 --- a/build.gradle +++ b/build.gradle @@ -2,9 +2,9 @@ plugins { id 'java-library' id 'maven-publish' id 'signing' - id 'net.ltgt.apt' version '0.21' - id 'com.github.ben-manes.versions' version '0.38.0' - id 'net.researchgate.release' version '2.8.1' + id 'com.github.ben-manes.versions' version '0.42.0' + // TODO: Warning for Gradle 9 by https://github.com/researchgate/gradle-release/issues/379 + id 'net.researchgate.release' version '3.0.2' } ext { @@ -22,15 +22,14 @@ ext { } // Dependencies - reactor_bom_version = '2020.0.22' + reactor_bom_version = '2023.0.8' servicer_version = '1.0.3' - commons_codec_version = '1.12' - junit_version = '4.13.2' - logback_version = '1.2.3' + junit_version = '5.7.1' + logback_version = '1.3.14' caffeine_version = '2.9.0' lettuce_version = '6.0.9.RELEASE' - jackson_version = '2.12.4' + jackson_version = '2.17.0' commons_lang_version = '3.12.0' testcontainers_version = '1.15.3' assertj_version = '3.24.2' @@ -51,11 +50,16 @@ allprojects { version = project_version description = project_description - sourceCompatibility = project_jdk - targetCompatibility = project_jdk + java { + sourceCompatibility = project_jdk + targetCompatibility = project_jdk + } dependencies { api platform("io.projectreactor:reactor-bom:$reactor_bom_version") + + compileOnly "com.google.code.findbugs:jsr305:3.0.1" + testCompileOnly "com.google.code.findbugs:jsr305:3.0.1" } repositories { @@ -67,7 +71,6 @@ allprojects { } maven { url 'https://jitpack.io' } maven { url 'https://repo.spring.io/milestone' } - jcenter() } javadoc { @@ -80,7 +83,7 @@ allprojects { addStringOption 'encoding', 'UTF-8' links = [ jdk_javadoc, - "http://www.reactive-streams.org/reactive-streams-1.0.3-javadoc/", + "https://www.reactive-streams.org/reactive-streams-1.0.3-javadoc/", "https://projectreactor.io/docs/core/release/api/", ] } @@ -89,12 +92,12 @@ allprojects { } } - tasks.withType(JavaCompile) { + tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' options.incremental = true } - task downloadDependencies() { + tasks.register('downloadDependencies') { description 'Download all dependencies to the Gradle cache' doLast { configurations.findAll { it.canBeResolved }.files @@ -108,18 +111,23 @@ allprojects { } subprojects { - archivesBaseName = 'stores-' + project.name - javadoc { - title = "$archivesBaseName ${version} API" - options.windowTitle = "$archivesBaseName ($version)" + base { + archivesName = 'stores-' + project.name + } + + tasks.withType(Javadoc).configureEach { + title = "${base.archivesName.get()} ${version} API" + options.windowTitle = "${base.archivesName.get()} ($version)" } publishing { publications { mavenJava(MavenPublication) { from components.java - artifactId archivesBaseName + afterEvaluate { + artifactId = jar.archiveBaseName.get() + } versionMapping { usage('java-api') { @@ -201,7 +209,7 @@ release { tagCommitMessage = 'Release version' newVersionCommitMessage = 'Next development version' git { - requireBranch = '' + requireBranch.set('') } } diff --git a/caffeine/build.gradle b/caffeine/build.gradle index f8087ca..8150f03 100644 --- a/caffeine/build.gradle +++ b/caffeine/build.gradle @@ -12,7 +12,7 @@ javadoc { jar { manifest { - attributes 'Implementation-Title': archivesBaseName, + attributes 'Implementation-Title': base.archivesName.get(), 'Implementation-Version': archiveVersion, 'Automatic-Module-Name': 'discord4j.store.caffeine' } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e708b1c..e644113 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 8cf6eb5..e7646de 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 4f906e0..1aa94a4 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 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. @@ -17,67 +17,99 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# 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 +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# 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"' +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +119,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,88 +130,120 @@ Please set the JAVA_HOME variable in your environment to match the 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. + JAVACMD=java + 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. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +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=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=`expr $i + 1` + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# 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, 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 \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 107acd3..25da30d 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,13 +41,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +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 @@ -56,11 +57,11 @@ 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 @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +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! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +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 diff --git a/jdk/build.gradle b/jdk/build.gradle index 916632a..6a33a4d 100644 --- a/jdk/build.gradle +++ b/jdk/build.gradle @@ -11,7 +11,7 @@ javadoc { jar { manifest { - attributes 'Implementation-Title': archivesBaseName, + attributes 'Implementation-Title': base.archivesName.get(), 'Implementation-Version': archiveVersion, 'Automatic-Module-Name': 'discord4j.store.jdk' } diff --git a/redis/build.gradle b/redis/build.gradle index a24d4e8..68aa8a5 100644 --- a/redis/build.gradle +++ b/redis/build.gradle @@ -18,7 +18,7 @@ javadoc { jar { manifest { - attributes 'Implementation-Title': archivesBaseName, + attributes 'Implementation-Title': base.archivesName.get(), 'Implementation-Version': archiveVersion, 'Automatic-Module-Name': 'discord4j.store.redis' } diff --git a/redis/src/test/java/discord4j/store/crypto/EncryptDecryptTest.java b/redis/src/test/java/discord4j/store/crypto/EncryptDecryptTest.java index 05529af..e6856a2 100644 --- a/redis/src/test/java/discord4j/store/crypto/EncryptDecryptTest.java +++ b/redis/src/test/java/discord4j/store/crypto/EncryptDecryptTest.java @@ -17,15 +17,14 @@ package discord4j.store.crypto; -import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; import javax.crypto.*; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; -import static org.junit.Assert.assertEquals; - public class EncryptDecryptTest { @Test @@ -48,6 +47,6 @@ public void testEncryptDecryptStringUsingAES() throws NoSuchAlgorithmException, " `8888> `888 \n" + " \"8888 8% \n" + " `\"888x:-\" "; - assertEquals(input, new String(AES.decrypt(AES.encrypt(input.getBytes(), skey), skey))); + Assertions.assertEquals(input, new String(AES.decrypt(AES.encrypt(input.getBytes(), skey), skey))); } } diff --git a/redis/src/test/java/discord4j/store/redis/SerializerTests.java b/redis/src/test/java/discord4j/store/redis/SerializerTests.java index 27461b5..72b76bc 100644 --- a/redis/src/test/java/discord4j/store/redis/SerializerTests.java +++ b/redis/src/test/java/discord4j/store/redis/SerializerTests.java @@ -20,12 +20,12 @@ import discord4j.discordjson.Id; import discord4j.store.api.util.LongLongTuple2; import org.assertj.core.api.Assertions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.HashSet; import java.util.Set; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; public class SerializerTests { diff --git a/tck/build.gradle b/tck/build.gradle index 93c16f8..acacd7d 100644 --- a/tck/build.gradle +++ b/tck/build.gradle @@ -1,6 +1,6 @@ dependencies { api project(':api') - api "junit:junit:$junit_version" + api "org.junit.jupiter:junit-jupiter-engine:$junit_version" api "io.projectreactor:reactor-test" api "org.apache.commons:commons-lang3:$commons_lang_version" } @@ -15,7 +15,7 @@ javadoc { jar { manifest { - attributes 'Implementation-Title': archivesBaseName, + attributes 'Implementation-Title': base.archivesName.get(), 'Implementation-Version': archiveVersion, 'Automatic-Module-Name': 'discord4j.store.tck' } diff --git a/tck/src/main/java/discord4j/store/tck/StoreTCK.java b/tck/src/main/java/discord4j/store/tck/StoreTCK.java index 36f610b..086db13 100644 --- a/tck/src/main/java/discord4j/store/tck/StoreTCK.java +++ b/tck/src/main/java/discord4j/store/tck/StoreTCK.java @@ -21,7 +21,7 @@ import discord4j.store.api.primitive.ForwardingStore; import discord4j.store.api.primitive.LongObjStore; import discord4j.store.api.service.StoreService; -import org.junit.Test; +import org.junit.jupiter.api.Test; import reactor.util.Logger; import reactor.util.Loggers; import reactor.util.annotation.Nullable; @@ -34,13 +34,13 @@ import java.util.Random; import java.util.concurrent.ConcurrentHashMap; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; /** * Extend this class and provide your {@link discord4j.store.api.service.StoreService} implementation. - * + *

* Running all the tests will ensure that your store implements all the operations expected. - * + *

* You should probably implement your own tests on top of this to ensure your store's unique features work correctly. */ public abstract class StoreTCK { @@ -94,9 +94,9 @@ final T randomizeObject(T obj) { try { for (Field field : obj.getClass().getDeclaredFields()) { if (field.isSynthetic() - || Modifier.isFinal(field.getModifiers()) - || Modifier.isTransient(field.getModifiers()) - || Modifier.isStatic(field.getModifiers())) + || Modifier.isFinal(field.getModifiers()) + || Modifier.isTransient(field.getModifiers()) + || Modifier.isStatic(field.getModifiers())) continue; field.setAccessible(true); @@ -122,7 +122,7 @@ final T randomizeObject(T obj) { field.setBoolean(obj, rng.nextBoolean()); } else if (field.getType().equals(String.class)) { field.set(obj, randString()); -// } else if (Serializable.class.isAssignableFrom(field.getType())) { +// } else if (Serializable.class.isAssignableFrom(field.getType())) { // field.set(obj, randomizeObject((Serializable) field.getType().newInstance())); } else { throw new RuntimeException("Unsupported field type " + field.getType()); @@ -143,7 +143,7 @@ public final TestBean randomBean() { @Test public final void tckEntryPoint() { StoreService service = getStoreService(); - assertNotNull("Store service is null!", service); + assertNotNull(service, "Store service is null!"); logger.info("Running the Store TCK on {}...", service.getClass()); boolean hasGenericStores; @@ -174,7 +174,8 @@ public final void tckEntryPoint() { LongObjStore testStore = null; try { testStore = service.provideLongObjStore(TestBean.class); - } catch (Throwable ignored) {} + } catch (Throwable ignored) { + } if (testStore == null || testStore instanceof ForwardingStore) { logger.info("Long-Object stores disabled."); } else { @@ -228,15 +229,15 @@ final > void testSerialization(Store store, store.save(key, bean).block(); TestBean beanCopy = store.find(key).block(); - assertNotNull("Bean not correctly saved!", beanCopy); + assertNotNull(beanCopy, "Bean not correctly saved!"); if (bean == beanCopy) { //Same ref? Likely in memory store passedTestTotal++; return; } - assertFalse("Transient field serialized!", beanCopy.isOriginal()); - assertEquals("Same beans are not equivalent!", bean, beanCopy); + assertFalse(beanCopy.isOriginal(), "Transient field serialized!"); + assertEquals(bean, beanCopy, "Same beans are not equivalent!"); passedTestTotal++; } @@ -250,11 +251,14 @@ public static class TestBean { long someLong; long[] someLongArray; - @Nullable Long someLongObject; + @Nullable + Long someLongObject; int someInt; boolean someBoolean; - @Nullable String someString; - @Nullable AnotherBean someObject; + @Nullable + String someString; + @Nullable + AnotherBean someObject; public static TestBean getBean() { TestBean bean = new TestBean(); @@ -262,7 +266,8 @@ public static TestBean getBean() { return bean; } - public TestBean() {} + public TestBean() { + } public boolean isOriginal() { return isOriginal; @@ -337,13 +342,13 @@ public boolean equals(Object o) { } TestBean bean = (TestBean) o; return isOriginal() == bean.isOriginal() && - getSomeLong() == bean.getSomeLong() && - getSomeInt() == bean.getSomeInt() && - isSomeBoolean() == bean.isSomeBoolean() && - Arrays.equals(getSomeLongArray(), bean.getSomeLongArray()) && - Objects.equals(getSomeLongObject(), bean.getSomeLongObject()) && - Objects.equals(getSomeString(), bean.getSomeString()) && - Objects.equals(getSomeObject(), bean.getSomeObject()); + getSomeLong() == bean.getSomeLong() && + getSomeInt() == bean.getSomeInt() && + isSomeBoolean() == bean.isSomeBoolean() && + Arrays.equals(getSomeLongArray(), bean.getSomeLongArray()) && + Objects.equals(getSomeLongObject(), bean.getSomeLongObject()) && + Objects.equals(getSomeString(), bean.getSomeString()) && + Objects.equals(getSomeObject(), bean.getSomeObject()); } @Override @@ -356,15 +361,15 @@ public int hashCode() { @Override public String toString() { return "TestBean{" + - "isOriginal=" + isOriginal + - ", someLong=" + someLong + - ", someLongArray=" + Arrays.toString(someLongArray) + - ", someLongObject=" + someLongObject + - ", someInt=" + someInt + - ", someBoolean=" + someBoolean + - ", someString='" + someString + '\'' + - ", someObject=" + someObject + - '}'; + "isOriginal=" + isOriginal + + ", someLong=" + someLong + + ", someLongArray=" + Arrays.toString(someLongArray) + + ", someLongObject=" + someLongObject + + ", someInt=" + someInt + + ", someBoolean=" + someBoolean + + ", someString='" + someString + '\'' + + ", someObject=" + someObject + + '}'; } } @@ -374,12 +379,15 @@ public static class AnotherBean { long someLong; long[] someLongArray; - @Nullable Long someLongObject; + @Nullable + Long someLongObject; int someInt; boolean someBoolean; - @Nullable String someString; + @Nullable + String someString; - public AnotherBean() {} + public AnotherBean() { + } public long getSomeLong() { return someLong; @@ -441,11 +449,11 @@ public boolean equals(Object o) { } AnotherBean that = (AnotherBean) o; return getSomeLong() == that.getSomeLong() && - getSomeInt() == that.getSomeInt() && - isSomeBoolean() == that.isSomeBoolean() && - Arrays.equals(getSomeLongArray(), that.getSomeLongArray()) && - Objects.equals(getSomeLongObject(), that.getSomeLongObject()) && - Objects.equals(getSomeString(), that.getSomeString()); + getSomeInt() == that.getSomeInt() && + isSomeBoolean() == that.isSomeBoolean() && + Arrays.equals(getSomeLongArray(), that.getSomeLongArray()) && + Objects.equals(getSomeLongObject(), that.getSomeLongObject()) && + Objects.equals(getSomeString(), that.getSomeString()); } @Override @@ -458,13 +466,13 @@ public int hashCode() { @Override public String toString() { return "AnotherBean{" + - "someLong=" + someLong + - ", someLongArray=" + Arrays.toString(someLongArray) + - ", someLongObject=" + someLongObject + - ", someInt=" + someInt + - ", someBoolean=" + someBoolean + - ", someString='" + someString + '\'' + - '}'; + "someLong=" + someLong + + ", someLongArray=" + Arrays.toString(someLongArray) + + ", someLongObject=" + someLongObject + + ", someInt=" + someInt + + ", someBoolean=" + someBoolean + + ", someString='" + someString + '\'' + + '}'; } } } diff --git a/tck/src/main/java/discord4j/store/tck/StoreVerification.java b/tck/src/main/java/discord4j/store/tck/StoreVerification.java index 73283a8..8272766 100644 --- a/tck/src/main/java/discord4j/store/tck/StoreVerification.java +++ b/tck/src/main/java/discord4j/store/tck/StoreVerification.java @@ -20,7 +20,7 @@ import discord4j.store.api.Store; import discord4j.store.api.primitive.LongObjStore; import discord4j.store.api.service.StoreService; -import org.junit.Test; +import org.junit.jupiter.api.Test; import reactor.core.publisher.Mono; import reactor.test.StepVerifier;