diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fc31f98..5282225 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,9 +18,9 @@ jobs: - macos-latest steps: - uses: actions/checkout@v1 - - uses: DeLaGuardo/setup-graalvm@1.0 + - uses: DeLaGuardo/setup-graalvm@master with: - graalvm-version: '19.2.1' + graalvm-version: '20.3.0.java8' - uses: actions/cache@v1 with: path: ~/.m2/repository diff --git a/.gitignore b/.gitignore index 153c933..549e00a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ HELP.md -/target/ +target/ !.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ ### STS ### .apt_generated @@ -23,7 +25,9 @@ HELP.md /dist/ /nbdist/ /.nb-gradle/ -/build/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ ### VS Code ### .vscode/ diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000..c93a26d --- /dev/null +++ b/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,123 @@ +/* + * Copyright 2007-present the original author or authors. + * + * 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 + * + * https://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. + */ + +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if (mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } + catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } + finally { + try { + if (mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } + catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if (!outputFile.getParentFile().exists()) { + if (!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } + catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar index 9cc84ea..2cc7d4a 100644 Binary files a/.mvn/wrapper/maven-wrapper.jar and b/.mvn/wrapper/maven-wrapper.jar differ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index a3ba20e..642d572 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1 +1,2 @@ -distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.6.1/apache-maven-3.6.1-bin.zip +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/build-all-binaries.sh b/build-all-binaries.sh deleted file mode 100755 index b47102a..0000000 --- a/build-all-binaries.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -./mvnw clean package -DskipTests -Pgraal -docker run --rm \ - -v "$PWD":/usr/src \ - -v "$HOME/.m2":/root/.m2 \ - -w /usr/src \ - oracle/graalvm-ce:19.2.1 \ - bash -c 'gu install native-image && ./mvnw package -Dversion.generate.skip=true -Pgraal -DskipTests' -./mvnw package -Dversion.generate.skip=true -DskipTests \ No newline at end of file diff --git a/check-binary-versions.sh b/check-binary-versions.sh deleted file mode 100755 index 1d864f7..0000000 --- a/check-binary-versions.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -./target/classes/rsc-osx-x86_64 -v | jq . -docker run --rm \ - -v "$PWD":/usr/src \ - -v "$HOME/.m2":/root/.m2 \ - -w /usr/src \ - oracle/graalvm-ce:19.2.1 \ - ./target/classes/rsc-linux-x86_64 -v | jq . -java -jar target/rsc-*.jar -v | jq . \ No newline at end of file diff --git a/mvnw b/mvnw index 5bf251c..a16b543 100755 --- a/mvnw +++ b/mvnw @@ -8,7 +8,7 @@ # "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 +# https://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 @@ -19,7 +19,7 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Maven2 Start Up Batch script +# Maven Start Up Batch script # # Required ENV vars: # ------------------ @@ -108,13 +108,12 @@ if $cygwin ; then CLASSPATH=`cygpath --path --unix "$CLASSPATH"` fi -# For Migwn, ensure paths are in UNIX format before anything is touched +# For Mingw, ensure paths are in UNIX format before anything is touched if $mingw ; then [ -n "$M2_HOME" ] && M2_HOME="`(cd "$M2_HOME"; pwd)`" [ -n "$JAVA_HOME" ] && JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" - # TODO classpath? fi if [ -z "$JAVA_HOME" ]; then @@ -200,8 +199,89 @@ if [ -z "$BASE_DIR" ]; then exit 1; fi +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -echo $MAVEN_PROJECTBASEDIR +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" # For Cygwin, switch paths to Windows format before running java @@ -216,6 +296,11 @@ if $cygwin; then MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` fi +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain exec "$JAVACMD" \ diff --git a/mvnw.cmd b/mvnw.cmd old mode 100755 new mode 100644 index 019bd74..c8d4337 --- a/mvnw.cmd +++ b/mvnw.cmd @@ -7,7 +7,7 @@ @REM "License"); you may not use this file except in compliance @REM with the License. You may obtain a copy of the License at @REM -@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM https://www.apache.org/licenses/LICENSE-2.0 @REM @REM Unless required by applicable law or agreed to in writing, @REM software distributed under the License is distributed on an @@ -18,7 +18,7 @@ @REM ---------------------------------------------------------------------------- @REM ---------------------------------------------------------------------------- -@REM Maven2 Start Up Batch script +@REM Maven Start Up Batch script @REM @REM Required ENV vars: @REM JAVA_HOME - location of a JDK home dir @@ -26,7 +26,7 @@ @REM Optional ENV vars @REM M2_HOME - location of maven2's installed home dir @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven @REM e.g. to debug Maven itself, use @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 @@ -35,7 +35,9 @@ @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' @echo off -@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% @REM set %HOME% to equivalent of $HOME @@ -115,10 +117,47 @@ for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do s :endReadAdditionalConfig SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" - set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* if ERRORLEVEL 1 goto error goto end diff --git a/pom.xml b/pom.xml index abb4572..a860ad2 100644 --- a/pom.xml +++ b/pom.xml @@ -1,228 +1,250 @@ - - 4.0.0 + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.1 + + + am.ik.rsocket + rsc + 0.7.0-SNAPSHOT + rsc + RSocket Client CLI - am.ik.rsocket - rsc - 0.7.0-SNAPSHOT - jar + + 1.8 + false + + --enable-all-security-services + --enable-https + -Dspring.native.remove-yaml-support=true + -Dspring.spel.ignore=true + -Dspring.xml.ignore=true + -Dfile.encoding=UTF-8 + -H:IncludeResourceBundles=joptsimple.HelpFormatterMessages + -H:IncludeResourceBundles=joptsimple.ExceptionMessages + + - rsc - RSocket Client CLI + + + org.springframework.experimental + spring-graalvm-native + 0.8.5 + + + org.springframework.boot + spring-boot-starter-rsocket + + + org.springframework.boot + spring-boot-starter-json + + + org.springframework + spring-messaging + + + com.fasterxml.jackson.dataformat + jackson-dataformat-cbor + + + + + net.sf.jopt-simple + jopt-simple + 6.0-alpha-3 + + + org.springframework.boot + spring-boot-starter-test + test + + + io.projectreactor + reactor-test + test + + - - UTF-8 - UTF-8 - ${java.version} - ${java.version} - 1.8 - 2.3.5.RELEASE - am.ik.rsocket.Rsc - false - - - - - - net.sf.jopt-simple - jopt-simple - 6.0-alpha-3 - - - - io.rsocket - rsocket-core - - - io.rsocket - rsocket-transport-netty - - - ch.qos.logback - logback-classic - - - io.projectreactor.netty - reactor-netty - - - io.netty - netty-transport-native-epoll - - - io.netty - netty-transport-native-unix-common - - - io.netty - netty-codec-http2 - - - - - - org.springframework.boot - spring-boot-starter-test - test - - - org.junit.vintage - junit-vintage-engine - - - junit - junit - - - - - io.projectreactor - reactor-test - test - - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - - - - - kr.motd.maven - os-maven-plugin - 1.6.2 - - - - - maven-surefire-plugin - 2.22.2 - - - org.apache.maven.plugins - maven-antrun-plugin - 3.0.0 - - - gen-build-info - process-resources - - run - - - ${version.generate.skip} - - - package am.ik.rsocket; - public class Version { - public static final String getVersion() { - return "${project.version}"; - } - public static final String getBuild() { - return "${maven.build.timestamp}"; - } - public static final String getVersionAsJson() { - return "{\"version\": \"${project.version}\", \"build\": \"${maven.build.timestamp}\"}"; - } - } - - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - test - generate-sources - - add-source - - - - ${project.build.directory}/generated-sources - - - - - - - - - - - jar - - true - - - - - org.springframework.boot - spring-boot-maven-plugin - ${spring-boot.version} - - - - repackage - - - - - ${start-class} - - - - - - - graal - - 19.2.1 - - - - - com.oracle.substratevm - native-image-maven-plugin - ${graal.version} - - - com.oracle.substratevm - svm - ${graal.version} - - - - - - native-image - - package - - - - ${start-class} - true - ${project.artifactId}-${os.detected.classifier} - ${basedir}/target/classes - - - - - - + + + + kr.motd.maven + os-maven-plugin + 1.6.2 + + + + + org.apache.maven.plugins + maven-antrun-plugin + 3.0.0 + + + gen-build-info + process-resources + + run + + + ${version.generate.skip} + + + package am.ik.rsocket; + public class Version { + public static final String getVersion() { + return "${project.version}"; + } + public static final String getBuild() { + return "${maven.build.timestamp}"; + } + public static final String getRSocketJava() { + return "${rsocket.version}"; + } + public static final String getVersionAsJson() { + return "{\"version\": \"${project.version}\", \"build\": \"${maven.build.timestamp}\", \"rsocket-java\": \"${rsocket.version}\"}"; + } + } + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + test + generate-sources + + add-source + + + + ${project.build.directory}/generated-sources + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + paketobuildpacks/builder:tiny + + true + ${native-build.args} + + + + + + + + + native + + + + org.graalvm.nativeimage + native-image-maven-plugin + 20.3.0 + + am.ik.rsocket.RscApplication + ${native-build.args} + ${project.artifactId}-${os.detected.classifier} + ${basedir}/target/classes + + + + native-image + + package + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + + central + https://repo.maven.apache.org/maven2 + + false + + + + spring-release + Spring release + https://repo.spring.io/release + + false + + + + spring-snapshot + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestone + Spring Milestone + https://repo.spring.io/milestone + + false + + + + + + central + https://repo.maven.apache.org/maven2 + + false + + + + spring-release + Spring release + https://repo.spring.io/release + + false + + + + spring-snapshot + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestone + Spring Milestone + https://repo.spring.io/milestone + + false + + + diff --git a/src/main/java/am/ik/rsocket/RscApplication.java b/src/main/java/am/ik/rsocket/RscApplication.java new file mode 100644 index 0000000..3a98249 --- /dev/null +++ b/src/main/java/am/ik/rsocket/RscApplication.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2019 Toshiaki Maki + * + * 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 am.ik.rsocket; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.logging.LoggingApplicationListener; +import org.springframework.context.ApplicationListener; + +@SpringBootApplication(proxyBeanMethods = false) +public class RscApplication { + + public static void main(String[] args) { + final SpringApplication application = new SpringApplication(RscApplication.class); + for (ApplicationListener listener : application.getListeners()) { + if (listener instanceof LoggingApplicationListener) { + ((LoggingApplicationListener) listener).setParseArgs(false); + } + } + application.run(args); + } + +} diff --git a/src/main/java/am/ik/rsocket/Rsc.java b/src/main/java/am/ik/rsocket/RscCommandLineRunner.java similarity index 76% rename from src/main/java/am/ik/rsocket/Rsc.java rename to src/main/java/am/ik/rsocket/RscCommandLineRunner.java index 5b26f56..d867797 100644 --- a/src/main/java/am/ik/rsocket/Rsc.java +++ b/src/main/java/am/ik/rsocket/RscCommandLineRunner.java @@ -15,11 +15,8 @@ */ package am.ik.rsocket; -import java.io.File; import java.time.Duration; -import java.util.Optional; import java.util.TreeMap; -import java.util.function.Predicate; import am.ik.rsocket.tracing.Reporter; import ch.qos.logback.classic.Level; @@ -35,9 +32,13 @@ import reactor.core.publisher.Flux; import reactor.util.retry.Retry; -public class Rsc { +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; - public static void main(String[] a) throws Exception { +@Component +public class RscCommandLineRunner implements CommandLineRunner { + @Override + public void run(String... a) throws Exception { final Args args = new Args(a); try { if (args.help()) { @@ -66,20 +67,6 @@ public static void main(String[] a) throws Exception { if (args.debug()) { configureDebugLevel("io.rsocket.FrameLogger"); } - if (args.secure() && System.getenv("JAVA_HOME") != null) { - final File javaHome = new File(System.getenv("JAVA_HOME")); - if (System.getProperty("java.library.path") == null - || System.getProperty("java.library.path").isEmpty()) { - findFile(javaHome, file -> file.getName().startsWith("libsunec.")) - .map(f -> f.getParentFile().getAbsolutePath()) - .ifPresent(p -> System.setProperty("java.library.path", p)); - } - if (System.getProperty("javax.net.ssl.trustStore") == null - || System.getProperty("javax.net.ssl.trustStore").isEmpty()) { - findFile(javaHome, file -> file.getName().equals("cacerts")) - .ifPresent(f -> System.setProperty("javax.net.ssl.trustStore", f.getAbsolutePath())); - } - } final long begin = System.nanoTime(); run(args) .doOnTerminate(() -> handleSpan(args, (System.nanoTime() - begin) / 1000)) @@ -103,7 +90,7 @@ public static void main(String[] a) throws Exception { } static Flux run(Args args) { - args.log().ifPresent(Rsc::configureDebugLevel); + args.log().ifPresent(RscCommandLineRunner::configureDebugLevel); final ClientTransport clientTransport = args.clientTransport(); final RSocketConnector connector = RSocketConnector.create(); final String metadataMimeType = args.composeMetadata().getT1(); @@ -152,28 +139,10 @@ static void configureDebugLevel(String loggerName) { static void printVersion() { // Version class will be generated during Maven's generated-sources phase - System.out.println(Version.getVersionAsJson()); + System.out.println(am.ik.rsocket.Version.getVersionAsJson()); } static void printSystemProperties() { new TreeMap<>(System.getProperties()).forEach((k, v) -> System.out.println(k + "\t= " + v)); } - - static Optional findFile(File dir, Predicate predicate) { - final File[] files = dir.listFiles(); - if (files != null) { - for (File file : files) { - if (file.isDirectory()) { - final Optional found = findFile(file, predicate); - if (found.isPresent()) { - return found; - } - } - if (predicate.test(file)) { - return Optional.of(file); - } - } - } - return Optional.empty(); - } } diff --git a/src/main/java/am/ik/rsocket/Transport.java b/src/main/java/am/ik/rsocket/Transport.java index 36a45aa..cace7e4 100644 --- a/src/main/java/am/ik/rsocket/Transport.java +++ b/src/main/java/am/ik/rsocket/Transport.java @@ -31,8 +31,8 @@ ClientTransport clientTransport(Args args) { WEBSOCKET { @Override ClientTransport clientTransport(Args args) { - WebsocketClientTransport transport = WebsocketClientTransport.create(HttpClient.from(args.tcpClient()), args.path()); - transport.setTransportHeaders(args::wsHeaders); + WebsocketClientTransport transport = WebsocketClientTransport.create(HttpClient.from(args.tcpClient()), args.path()); + args.wsHeaders().forEach(transport::header); return transport; } }; diff --git a/src/main/java/am/ik/rsocket/tracing/Span.java b/src/main/java/am/ik/rsocket/tracing/Span.java index 68f0dad..b6d31d5 100644 --- a/src/main/java/am/ik/rsocket/tracing/Span.java +++ b/src/main/java/am/ik/rsocket/tracing/Span.java @@ -58,7 +58,8 @@ public String toJsonString(String rsocketMethod, long duration) { + " \"tags\": {\n" + " \"rsocket.method\": \"%s\",\n" + " \"rsc.version\": \"%s\",\n" - + " \"rsc.build\": \"%s\"\n" + + " \"rsc.build\": \"%s\",\n" + + " \"rsocket-java.version\": \"%s\"\n" + " }\n" + " }", Long.toHexString(spanId), @@ -69,7 +70,8 @@ public String toJsonString(String rsocketMethod, long duration) { duration, rsocketMethod, Version.getVersion(), - Version.getBuild() + Version.getBuild(), + Version.getRSocketJava() ); } diff --git a/src/main/resources/META-INF/native-image/am.ik.rsocket/rsc/native-image.properties b/src/main/resources/META-INF/native-image/am.ik.rsocket/rsc/native-image.properties deleted file mode 100644 index b73ca59..0000000 --- a/src/main/resources/META-INF/native-image/am.ik.rsocket/rsc/native-image.properties +++ /dev/null @@ -1,15 +0,0 @@ -Args=--allow-incomplete-classpath \ - --report-unsupported-elements-at-runtime \ - --no-fallback \ - --enable-all-security-services \ - -Dio.netty.noUnsafe=true \ - -H:+TraceClassInitialization \ - --initialize-at-build-time=org.slf4j \ - --initialize-at-build-time=ch.qos.logback \ - --initialize-at-build-time=reactor.netty.ConnectionObserver \ - --initialize-at-run-time=io.netty.handler.codec.http.websocketx.extensions.compression.DeflateDecoder,io.netty.util.internal.logging.Log4JLogger \ - --initialize-at-run-time=io.netty.handler.ssl.ReferenceCountedOpenSslContext,io.netty.handler.ssl.JdkNpnApplicationProtocolNegotiator,io.netty.handler.ssl.ReferenceCountedOpenSslEngine,io.netty.handler.ssl.ConscryptAlpnSslEngine,io.netty.handler.ssl.JettyNpnSslEngine \ - -H:IncludeResourceBundles=joptsimple.HelpFormatterMessages \ - -H:IncludeResourceBundles=joptsimple.ExceptionMessages \ - -H:EnableURLProtocols=http,https \ - -Dfile.encoding=UTF-8 \ No newline at end of file diff --git a/src/main/resources/META-INF/native-image/am.ik.rsocket/rsc/reflect-config.json b/src/main/resources/META-INF/native-image/am.ik.rsocket/rsc/reflect-config.json index b3d83b5..56191f6 100644 --- a/src/main/resources/META-INF/native-image/am.ik.rsocket/rsc/reflect-config.json +++ b/src/main/resources/META-INF/native-image/am.ik.rsocket/rsc/reflect-config.json @@ -28,81 +28,5 @@ "name": "io.rsocket.metadata.WellKnownMimeType", "allDeclaredConstructors": true, "allDeclaredMethods": true - }, - { - "name": "io.rsocket.internal.jctools.queues.BaseLinkedQueueProducerNodeRef", - "fields": [ - { - "name": "producerNode" - } - ] - }, - { - "name": "io.rsocket.internal.jctools.queues.BaseMpscLinkedArrayQueueProducerFields", - "fields": [ - { - "name": "producerIndex" - } - ] - }, - { - "name": "io.rsocket.internal.jctools.queues.LinkedQueueNode", - "fields": [ - { - "name": "next" - } - ] - }, - { - "name": "io.rsocket.internal.jctools.queues.BaseMpscLinkedArrayQueueColdProducerFields", - "fields": [ - { - "name": "producerLimit" - } - ] - }, - { - "name": "io.rsocket.internal.jctools.queues.BaseLinkedQueueConsumerNodeRef", - "fields": [ - { - "name": "consumerNode" - } - ] - }, - { - "name": "io.rsocket.internal.jctools.queues.BaseMpscLinkedArrayQueueConsumerFields", - "fields": [ - { - "name": "consumerIndex" - } - ] - }, - { - "name": "sun.misc.Unsafe", - "allDeclaredConstructors": true, - "fields": [ - { - "name": "theUnsafe" - } - ], - "methods": [ - { - "name": "getAndSetObject", - "parameterTypes": [ - "java.lang.Object", - "long", - "java.lang.Object" - ] - } - ] - }, - { - "name": "io.netty.channel.socket.nio.NioSocketChannel", - "methods": [ - { - "name": "", - "parameterTypes": [] - } - ] } ] \ No newline at end of file diff --git a/src/main/resources/META-INF/native-image/am.ik.rsocket/rsc/resource-config.json b/src/main/resources/META-INF/native-image/am.ik.rsocket/rsc/resource-config.json deleted file mode 100644 index 6ce2641..0000000 --- a/src/main/resources/META-INF/native-image/am.ik.rsocket/rsc/resource-config.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "resources": [ - ] -} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..175ee39 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,2 @@ +spring.main.banner-mode=off +logging.level.root=off diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml deleted file mode 100644 index a77974b..0000000 --- a/src/main/resources/logback.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - System.err - - %d{yyyy-MM-dd HH:mm:ss.SSS} %5p --- [%15.15t] %-15.15logger{15} : %m%n - - - - - - - - - \ No newline at end of file diff --git a/src/test/java/am/ik/rsocket/RscApplicationTests.java b/src/test/java/am/ik/rsocket/RscApplicationTests.java new file mode 100644 index 0000000..2173464 --- /dev/null +++ b/src/test/java/am/ik/rsocket/RscApplicationTests.java @@ -0,0 +1,20 @@ +package am.ik.rsocket; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +import org.springframework.boot.test.system.CapturedOutput; +import org.springframework.boot.test.system.OutputCaptureExtension; + +import static org.assertj.core.api.Assertions.assertThat; + +@ExtendWith(OutputCaptureExtension.class) +class RscApplicationTests { + + @Test + void test(CapturedOutput capture) throws Exception { + RscApplication.main(new String[] { "-h" }); + assertThat(capture.toString()).isNotEmpty(); + } + +} diff --git a/src/test/java/am/ik/rsocket/RscTest.java b/src/test/java/am/ik/rsocket/RscTest.java deleted file mode 100644 index a9ed57a..0000000 --- a/src/test/java/am/ik/rsocket/RscTest.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2019 Toshiaki Maki - * - * 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 am.ik.rsocket; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; - -import org.springframework.boot.test.system.CapturedOutput; -import org.springframework.boot.test.system.OutputCaptureExtension; - -import static org.assertj.core.api.Assertions.assertThat; - -@ExtendWith(OutputCaptureExtension.class) -public class RscTest { - - @Test - void test(CapturedOutput capture) throws Exception { - Rsc.main(new String[] { "-h" }); - assertThat(capture.toString()).isNotEmpty(); - } -} diff --git a/src/test/resources/junit-platform.properties b/src/test/resources/junit-platform.properties deleted file mode 100644 index 2af5bf8..0000000 --- a/src/test/resources/junit-platform.properties +++ /dev/null @@ -1 +0,0 @@ -junit.jupiter.testinstance.lifecycle.default=per_class