From a4933a84ea7281d521e0a5837e7c4c89d389b671 Mon Sep 17 00:00:00 2001 From: Katia Aresti Date: Thu, 7 Mar 2024 15:03:13 +0100 Subject: [PATCH] Quarkus Load Application --- .../src/docs/asciidoc/optional-cli/cli.adoc | 13 +- quarkus-workshop-super-heroes/pom.xml | 3 +- .../cli-super-heroes/.dockerignore | 5 + .../super-heroes/cli-super-heroes/.gitignore | 43 +++ .../cli-super-heroes/.mvn/wrapper/.gitignore | 1 + .../.mvn/wrapper/MavenWrapperDownloader.java | 98 ++++++ .../.mvn/wrapper/maven-wrapper.properties | 18 + .../super-heroes/cli-super-heroes/mvnw | 308 +++++++++++++++++ .../super-heroes/cli-super-heroes/mvnw.cmd | 205 ++++++++++++ .../super-heroes/cli-super-heroes/pom.xml | 124 +++++++ .../src/main/docker/Dockerfile.jvm | 97 ++++++ .../src/main/docker/Dockerfile.legacy-jar | 93 ++++++ .../src/main/docker/Dockerfile.native | 27 ++ .../src/main/docker/Dockerfile.native-micro | 30 ++ .../workshop/superheroes/load/CLIMain.java | 39 +++ .../superheroes/load/client/Fight.java | 22 ++ .../superheroes/load/client/FightsProxy.java | 59 ++++ .../superheroes/load/client/Hero.java} | 27 +- .../superheroes/load/client/HeroProxy.java | 65 ++++ .../load/client/RequestLogger.java | 41 +++ .../superheroes/load/client/Villain.java | 31 ++ .../superheroes/load/client/VillainProxy.java | 63 ++++ .../superheroes/load/package-info.java | 1 + .../load/scenarios/FightScenario.java | 87 +++++ .../load/scenarios/HeroScenario.java | 92 ++++++ .../superheroes/load/scenarios/RandomId.java | 25 ++ .../load/scenarios/VillainScenario.java | 78 +++++ .../src/main/resources/application.properties | 7 + .../.mvn/wrapper/MavenWrapperDownloader.java | 118 ------- .../.mvn/wrapper/maven-wrapper.properties | 2 - .../super-heroes/load-super-heroes/mvnw | 310 ------------------ .../super-heroes/load-super-heroes/pom.xml | 70 ---- .../workshop/superheroes/load/Endpoint.java | 70 ---- .../superheroes/load/FightScenario.java | 98 ------ .../superheroes/load/HeroScenario.java | 90 ----- .../superheroes/load/ScenarioInvoker.java | 66 ---- .../superheroes/load/SuperHeroesLoad.java | 13 - .../superheroes/load/VillainScenario.java | 89 ----- 38 files changed, 1679 insertions(+), 949 deletions(-) create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/.dockerignore create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/.gitignore create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/.mvn/wrapper/.gitignore create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/.mvn/wrapper/MavenWrapperDownloader.java create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/.mvn/wrapper/maven-wrapper.properties create mode 100755 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/mvnw create mode 100755 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/mvnw.cmd create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/pom.xml create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/docker/Dockerfile.jvm create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/docker/Dockerfile.legacy-jar create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/docker/Dockerfile.native create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/docker/Dockerfile.native-micro create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/CLIMain.java create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/Fight.java create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/FightsProxy.java rename quarkus-workshop-super-heroes/super-heroes/{load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/WeightedRandomResult.java => cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/Hero.java} (59%) create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/HeroProxy.java create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/RequestLogger.java create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/Villain.java create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/VillainProxy.java create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/package-info.java create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/scenarios/FightScenario.java create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/scenarios/HeroScenario.java create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/scenarios/RandomId.java create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/scenarios/VillainScenario.java create mode 100644 quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/resources/application.properties delete mode 100644 quarkus-workshop-super-heroes/super-heroes/load-super-heroes/.mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 quarkus-workshop-super-heroes/super-heroes/load-super-heroes/.mvn/wrapper/maven-wrapper.properties delete mode 100755 quarkus-workshop-super-heroes/super-heroes/load-super-heroes/mvnw delete mode 100644 quarkus-workshop-super-heroes/super-heroes/load-super-heroes/pom.xml delete mode 100644 quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/Endpoint.java delete mode 100644 quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/FightScenario.java delete mode 100644 quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/HeroScenario.java delete mode 100644 quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/ScenarioInvoker.java delete mode 100644 quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/SuperHeroesLoad.java delete mode 100644 quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/VillainScenario.java diff --git a/quarkus-workshop-super-heroes/docs/src/docs/asciidoc/optional-cli/cli.adoc b/quarkus-workshop-super-heroes/docs/src/docs/asciidoc/optional-cli/cli.adoc index b451400af..e77108d22 100644 --- a/quarkus-workshop-super-heroes/docs/src/docs/asciidoc/optional-cli/cli.adoc +++ b/quarkus-workshop-super-heroes/docs/src/docs/asciidoc/optional-cli/cli.adoc @@ -8,17 +8,18 @@ You will download the load application, install it and run it. == Give me some load! -In the `super-heroes/load-super-heroes` directory, there is an application that is **NOT** a Quarkus application. -It's a simple Java app that simulates users interacting with the system so it generates some load. +In the `super-heroes/cli-super-heroes` directory, there is a command line Quarkus application . +This application simulates users interacting with the system so it generates some load. == Looking at Some Code -The `SuperHeroesLoad` class is just a `main` that executes the `FightScenario`, `HeroScenario` and `VillainScenario` in different threads. +The `CLIMain` class is just a Picocli extension command line application that executes the `FightScenario`, `HeroScenario` and `VillainScenario`, +on the same thread but randomly execuring 3 different random calls to the 3 REST APIs. For example, if you look at the `HeroScenario`, you will see that it's just a suit of HTTP calls on the Hero API: [source,indent=0] ---- -include::{projectdir}/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/HeroScenario.java[tag=adocScenario] +include::{projectdir}/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/scenarios/HeroScenario.java[tag=adocScenario] ---- == Running the Load Application @@ -30,8 +31,8 @@ Time to compile and start the load application using: [source,shell] ---- -./mvnw compile -./mvnw exec:java +./mvnw package +java -jar ./target/quarkus-app/quarkus-run.jar ---- -- diff --git a/quarkus-workshop-super-heroes/pom.xml b/quarkus-workshop-super-heroes/pom.xml index 5a18d668d..96ca13c1d 100644 --- a/quarkus-workshop-super-heroes/pom.xml +++ b/quarkus-workshop-super-heroes/pom.xml @@ -114,7 +114,7 @@ super-heroes/rest-fights super-heroes/event-statistics super-heroes/rest-narration - super-heroes/load-super-heroes + super-heroes/cli-super-heroes @@ -141,6 +141,7 @@ super-heroes/rest-fights super-heroes/event-statistics super-heroes/rest-narration + super-heroes/cli-super-heroes docs diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/.dockerignore b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/.dockerignore new file mode 100644 index 000000000..94810d006 --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/.dockerignore @@ -0,0 +1,5 @@ +* +!target/*-runner +!target/*-runner.jar +!target/lib/* +!target/quarkus-app/* \ No newline at end of file diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/.gitignore b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/.gitignore new file mode 100644 index 000000000..8c7863e7b --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/.gitignore @@ -0,0 +1,43 @@ +#Maven +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +release.properties +.flattened-pom.xml + +# Eclipse +.project +.classpath +.settings/ +bin/ + +# IntelliJ +.idea +*.ipr +*.iml +*.iws + +# NetBeans +nb-configuration.xml + +# Visual Studio Code +.vscode +.factorypath + +# OSX +.DS_Store + +# Vim +*.swp +*.swo + +# patch +*.orig +*.rej + +# Local environment +.env + +# Plugin directory +/.quarkus/cli/plugins/ diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/.mvn/wrapper/.gitignore b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/.mvn/wrapper/.gitignore new file mode 100644 index 000000000..e72f5e8b7 --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/.mvn/wrapper/.gitignore @@ -0,0 +1 @@ +maven-wrapper.jar diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/.mvn/wrapper/MavenWrapperDownloader.java b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 000000000..84d1e60d8 --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +import java.io.IOException; +import java.io.InputStream; +import java.net.Authenticator; +import java.net.PasswordAuthentication; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; + +public final class MavenWrapperDownloader +{ + private static final String WRAPPER_VERSION = "3.2.0"; + + private static final boolean VERBOSE = Boolean.parseBoolean( System.getenv( "MVNW_VERBOSE" ) ); + + public static void main( String[] args ) + { + log( "Apache Maven Wrapper Downloader " + WRAPPER_VERSION ); + + if ( args.length != 2 ) + { + System.err.println( " - ERROR wrapperUrl or wrapperJarPath parameter missing" ); + System.exit( 1 ); + } + + try + { + log( " - Downloader started" ); + final URL wrapperUrl = new URL( args[0] ); + final String jarPath = args[1].replace( "..", "" ); // Sanitize path + final Path wrapperJarPath = Paths.get( jarPath ).toAbsolutePath().normalize(); + downloadFileFromURL( wrapperUrl, wrapperJarPath ); + log( "Done" ); + } + catch ( IOException e ) + { + System.err.println( "- Error downloading: " + e.getMessage() ); + if ( VERBOSE ) + { + e.printStackTrace(); + } + System.exit( 1 ); + } + } + + private static void downloadFileFromURL( URL wrapperUrl, Path wrapperJarPath ) + throws IOException + { + log( " - Downloading to: " + wrapperJarPath ); + if ( System.getenv( "MVNW_USERNAME" ) != null && System.getenv( "MVNW_PASSWORD" ) != null ) + { + final String username = System.getenv( "MVNW_USERNAME" ); + final char[] password = System.getenv( "MVNW_PASSWORD" ).toCharArray(); + Authenticator.setDefault( new Authenticator() + { + @Override + protected PasswordAuthentication getPasswordAuthentication() + { + return new PasswordAuthentication( username, password ); + } + } ); + } + try ( InputStream inStream = wrapperUrl.openStream() ) + { + Files.copy( inStream, wrapperJarPath, StandardCopyOption.REPLACE_EXISTING ); + } + log( " - Downloader complete" ); + } + + private static void log( String msg ) + { + if ( VERBOSE ) + { + System.out.println( msg ); + } + } + +} diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/.mvn/wrapper/maven-wrapper.properties b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 000000000..346d645fd --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/mvnw b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/mvnw new file mode 100755 index 000000000..8d937f4c1 --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/mvnw @@ -0,0 +1,308 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.2.0 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "$(uname)" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=$(java-config --jre-home) + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --unix "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --unix "$CLASSPATH") +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && + JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="$(which javac)" + if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=$(which readlink) + if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then + if $darwin ; then + javaHome="$(dirname "\"$javaExecutable\"")" + javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" + else + javaExecutable="$(readlink -f "\"$javaExecutable\"")" + fi + javaHome="$(dirname "\"$javaExecutable\"")" + javaHome=$(expr "$javaHome" : '\(.*\)/bin') + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + 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" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=$(cd "$wdir/.." || exit 1; pwd) + fi + # end of workaround + done + printf '%s' "$(cd "$basedir" || exit 1; pwd)" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + # Remove \r in case we run on Windows within Git Bash + # and check out the repository with auto CRLF management + # enabled. Otherwise, we may read lines that are delimited with + # \r\n and produce $'-Xarg\r' rather than -Xarg due to word + # splitting rules. + tr -s '\r\n' ' ' < "$1" + fi +} + +log() { + if [ "$MVNW_VERBOSE" = true ]; then + printf '%s\n' "$1" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname "$0")") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +log "$MAVEN_PROJECTBASEDIR" + +########################################################################################## +# 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. +########################################################################################## +wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" +if [ -r "$wrapperJarPath" ]; then + log "Found $wrapperJarPath" +else + log "Couldn't find $wrapperJarPath, downloading it ..." + + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + fi + while IFS="=" read -r key value; do + # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) + safeValue=$(echo "$value" | tr -d '\r') + case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; + esac + done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" + log "Downloading from: $wrapperUrl" + + if $cygwin; then + wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") + fi + + if command -v wget > /dev/null; then + log "Found wget ... using wget" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + log "Found curl ... using curl" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + fi + else + log "Falling back to using Java to download" + javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=$(cygpath --path --windows "$javaSource") + javaClass=$(cygpath --path --windows "$javaClass") + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + log " - Compiling MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + log " - Running MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +# If specified, validate the SHA-256 sum of the Maven wrapper jar file +wrapperSha256Sum="" +while IFS="=" read -r key value; do + case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; + esac +done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" +if [ -n "$wrapperSha256Sum" ]; then + wrapperSha256Result=false + if command -v sha256sum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + elif command -v shasum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." + echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." + exit 1 + fi + if [ $wrapperSha256Result = false ]; then + echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 + echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 + echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 + exit 1 + fi +fi + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --windows "$CLASSPATH") + [ -n "$MAVEN_PROJECTBASEDIR" ] && + 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 + +# shellcheck disable=SC2086 # safe args +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/mvnw.cmd b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/mvnw.cmd new file mode 100755 index 000000000..c4586b564 --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/mvnw.cmd @@ -0,0 +1,205 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@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 +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.2.0 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@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 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 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@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 +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +: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 WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_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 WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_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('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file +SET WRAPPER_SHA_256_SUM="" +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B +) +IF NOT %WRAPPER_SHA_256_SUM%=="" ( + powershell -Command "&{"^ + "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ + "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ + " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ + " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ + " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ + " exit 1;"^ + "}"^ + "}" + if ERRORLEVEL 1 goto error +) + +@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 + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/pom.xml b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/pom.xml new file mode 100644 index 000000000..91fcce3b7 --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/pom.xml @@ -0,0 +1,124 @@ + + + 4.0.0 + org.acme + cli-super-heroes + 1.0.0-SNAPSHOT + + 3.12.1 + 17 + UTF-8 + UTF-8 + quarkus-bom + io.quarkus.platform + 3.8.1 + true + 3.2.5 + + + + + ${quarkus.platform.group-id} + ${quarkus.platform.artifact-id} + ${quarkus.platform.version} + pom + import + + + + + + io.quarkus + quarkus-picocli + + + io.quarkus + quarkus-arc + + + io.quarkus + quarkus-rest-client-reactive-jackson + + + io.quarkus + quarkus-container-image-docker + + + com.github.javafaker + javafaker + 1.0.2 + + + + + + ${quarkus.platform.group-id} + quarkus-maven-plugin + ${quarkus.platform.version} + true + + + + build + generate-code + generate-code-tests + + + + + + maven-compiler-plugin + ${compiler-plugin.version} + + + -parameters + + + + + maven-surefire-plugin + ${surefire-plugin.version} + + + org.jboss.logmanager.LogManager + ${maven.home} + + + + + maven-failsafe-plugin + ${surefire-plugin.version} + + + + integration-test + verify + + + + + + ${project.build.directory}/${project.build.finalName}-runner + org.jboss.logmanager.LogManager + ${maven.home} + + + + + + + + native + + + native + + + + false + native + + + + diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/docker/Dockerfile.jvm b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/docker/Dockerfile.jvm new file mode 100644 index 000000000..9605eee5a --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/docker/Dockerfile.jvm @@ -0,0 +1,97 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# ./mvnw package +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/code-with-quarkus-jvm . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus-jvm +# +# If you want to include the debug port into your docker image +# you will have to expose the debug port (default 5005 being the default) like this : EXPOSE 8080 5005. +# Additionally you will have to set -e JAVA_DEBUG=true and -e JAVA_DEBUG_PORT=*:5005 +# when running the container +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus-jvm +# +# This image uses the `run-java.sh` script to run the application. +# This scripts computes the command line to execute your Java application, and +# includes memory/GC tuning. +# You can configure the behavior using the following environment properties: +# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") +# - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options +# in JAVA_OPTS (example: "-Dsome.property=foo") +# - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is +# used to calculate a default maximal heap memory based on a containers restriction. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xmx` is set to a ratio +# of the container available memory as set here. The default is `50` which means 50% +# of the available memory is used as an upper boundary. You can skip this mechanism by +# setting this value to `0` in which case no `-Xmx` option is added. +# - JAVA_INITIAL_MEM_RATIO: Is used when no `-Xms` option is given in JAVA_OPTS. This +# is used to calculate a default initial heap memory based on the maximum heap memory. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xms` is set to a ratio +# of the `-Xmx` memory as set here. The default is `25` which means 25% of the `-Xmx` +# is used as the initial heap size. You can skip this mechanism by setting this value +# to `0` in which case no `-Xms` option is added (example: "25") +# - JAVA_MAX_INITIAL_MEM: Is used when no `-Xms` option is given in JAVA_OPTS. +# This is used to calculate the maximum value of the initial heap memory. If used in +# a container without any memory constraints for the container then this option has +# no effect. If there is a memory constraint then `-Xms` is limited to the value set +# here. The default is 4096MB which means the calculated value of `-Xms` never will +# be greater than 4096MB. The value of this variable is expressed in MB (example: "4096") +# - JAVA_DIAGNOSTICS: Set this to get some diagnostics information to standard output +# when things are happening. This option, if set to true, will set +# `-XX:+UnlockDiagnosticVMOptions`. Disabled by default (example: "true"). +# - JAVA_DEBUG: If set remote debugging will be switched on. Disabled by default (example: +# true"). +# - JAVA_DEBUG_PORT: Port used for remote debugging. Defaults to 5005 (example: "8787"). +# - CONTAINER_CORE_LIMIT: A calculated core limit as described in +# https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt. (example: "2") +# - CONTAINER_MAX_MEMORY: Memory limit given to the container (example: "1024"). +# - GC_MIN_HEAP_FREE_RATIO: Minimum percentage of heap free after GC to avoid expansion. +# (example: "20") +# - GC_MAX_HEAP_FREE_RATIO: Maximum percentage of heap free after GC to avoid shrinking. +# (example: "40") +# - GC_TIME_RATIO: Specifies the ratio of the time spent outside the garbage collection. +# (example: "4") +# - GC_ADAPTIVE_SIZE_POLICY_WEIGHT: The weighting given to the current GC time versus +# previous GC times. (example: "90") +# - GC_METASPACE_SIZE: The initial metaspace size. (example: "20") +# - GC_MAX_METASPACE_SIZE: The maximum metaspace size. (example: "100") +# - GC_CONTAINER_OPTIONS: Specify Java GC to use. The value of this variable should +# contain the necessary JRE command-line options to specify the required GC, which +# will override the default of `-XX:+UseParallelGC` (example: -XX:+UseG1GC). +# - HTTPS_PROXY: The location of the https proxy. (example: "myuser@127.0.0.1:8080") +# - HTTP_PROXY: The location of the http proxy. (example: "myuser@127.0.0.1:8080") +# - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be +# accessed directly. (example: "foo.example.com,bar.example.com") +# +### +FROM registry.access.redhat.com/ubi8/openjdk-17:1.18 + +ENV LANGUAGE='en_US:en' + + +# We make four distinct layers so if there are application changes the library layers can be re-used +COPY --chown=185 target/quarkus-app/lib/ /deployments/lib/ +COPY --chown=185 target/quarkus-app/*.jar /deployments/ +COPY --chown=185 target/quarkus-app/app/ /deployments/app/ +COPY --chown=185 target/quarkus-app/quarkus/ /deployments/quarkus/ + +EXPOSE 8080 +USER 185 +ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" + +ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ] + diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/docker/Dockerfile.legacy-jar b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/docker/Dockerfile.legacy-jar new file mode 100644 index 000000000..a9b8d1bae --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/docker/Dockerfile.legacy-jar @@ -0,0 +1,93 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# ./mvnw package -Dquarkus.package.type=legacy-jar +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.legacy-jar -t quarkus/code-with-quarkus-legacy-jar . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus-legacy-jar +# +# If you want to include the debug port into your docker image +# you will have to expose the debug port (default 5005 being the default) like this : EXPOSE 8080 5005. +# Additionally you will have to set -e JAVA_DEBUG=true and -e JAVA_DEBUG_PORT=*:5005 +# when running the container +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus-legacy-jar +# +# This image uses the `run-java.sh` script to run the application. +# This scripts computes the command line to execute your Java application, and +# includes memory/GC tuning. +# You can configure the behavior using the following environment properties: +# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") +# - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options +# in JAVA_OPTS (example: "-Dsome.property=foo") +# - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is +# used to calculate a default maximal heap memory based on a containers restriction. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xmx` is set to a ratio +# of the container available memory as set here. The default is `50` which means 50% +# of the available memory is used as an upper boundary. You can skip this mechanism by +# setting this value to `0` in which case no `-Xmx` option is added. +# - JAVA_INITIAL_MEM_RATIO: Is used when no `-Xms` option is given in JAVA_OPTS. This +# is used to calculate a default initial heap memory based on the maximum heap memory. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xms` is set to a ratio +# of the `-Xmx` memory as set here. The default is `25` which means 25% of the `-Xmx` +# is used as the initial heap size. You can skip this mechanism by setting this value +# to `0` in which case no `-Xms` option is added (example: "25") +# - JAVA_MAX_INITIAL_MEM: Is used when no `-Xms` option is given in JAVA_OPTS. +# This is used to calculate the maximum value of the initial heap memory. If used in +# a container without any memory constraints for the container then this option has +# no effect. If there is a memory constraint then `-Xms` is limited to the value set +# here. The default is 4096MB which means the calculated value of `-Xms` never will +# be greater than 4096MB. The value of this variable is expressed in MB (example: "4096") +# - JAVA_DIAGNOSTICS: Set this to get some diagnostics information to standard output +# when things are happening. This option, if set to true, will set +# `-XX:+UnlockDiagnosticVMOptions`. Disabled by default (example: "true"). +# - JAVA_DEBUG: If set remote debugging will be switched on. Disabled by default (example: +# true"). +# - JAVA_DEBUG_PORT: Port used for remote debugging. Defaults to 5005 (example: "8787"). +# - CONTAINER_CORE_LIMIT: A calculated core limit as described in +# https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt. (example: "2") +# - CONTAINER_MAX_MEMORY: Memory limit given to the container (example: "1024"). +# - GC_MIN_HEAP_FREE_RATIO: Minimum percentage of heap free after GC to avoid expansion. +# (example: "20") +# - GC_MAX_HEAP_FREE_RATIO: Maximum percentage of heap free after GC to avoid shrinking. +# (example: "40") +# - GC_TIME_RATIO: Specifies the ratio of the time spent outside the garbage collection. +# (example: "4") +# - GC_ADAPTIVE_SIZE_POLICY_WEIGHT: The weighting given to the current GC time versus +# previous GC times. (example: "90") +# - GC_METASPACE_SIZE: The initial metaspace size. (example: "20") +# - GC_MAX_METASPACE_SIZE: The maximum metaspace size. (example: "100") +# - GC_CONTAINER_OPTIONS: Specify Java GC to use. The value of this variable should +# contain the necessary JRE command-line options to specify the required GC, which +# will override the default of `-XX:+UseParallelGC` (example: -XX:+UseG1GC). +# - HTTPS_PROXY: The location of the https proxy. (example: "myuser@127.0.0.1:8080") +# - HTTP_PROXY: The location of the http proxy. (example: "myuser@127.0.0.1:8080") +# - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be +# accessed directly. (example: "foo.example.com,bar.example.com") +# +### +FROM registry.access.redhat.com/ubi8/openjdk-17:1.18 + +ENV LANGUAGE='en_US:en' + + +COPY target/lib/* /deployments/lib/ +COPY target/*-runner.jar /deployments/quarkus-run.jar + +EXPOSE 8080 +USER 185 +ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" + +ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ] diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/docker/Dockerfile.native b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/docker/Dockerfile.native new file mode 100644 index 000000000..5657b6a1a --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/docker/Dockerfile.native @@ -0,0 +1,27 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode. +# +# Before building the container image run: +# +# ./mvnw package -Dnative +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.native -t quarkus/code-with-quarkus . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus +# +### +FROM registry.access.redhat.com/ubi8/ubi-minimal:8.9 +WORKDIR /work/ +RUN chown 1001 /work \ + && chmod "g+rwX" /work \ + && chown 1001:root /work +COPY --chown=1001:root target/*-runner /work/application + +EXPOSE 8080 +USER 1001 + +ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"] diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/docker/Dockerfile.native-micro b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/docker/Dockerfile.native-micro new file mode 100644 index 000000000..373286b89 --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/docker/Dockerfile.native-micro @@ -0,0 +1,30 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode. +# It uses a micro base image, tuned for Quarkus native executables. +# It reduces the size of the resulting container image. +# Check https://quarkus.io/guides/quarkus-runtime-base-image for further information about this image. +# +# Before building the container image run: +# +# ./mvnw package -Dnative +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.native-micro -t quarkus/code-with-quarkus . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus +# +### +FROM quay.io/quarkus/quarkus-micro-image:2.0 +WORKDIR /work/ +RUN chown 1001 /work \ + && chmod "g+rwX" /work \ + && chown 1001:root /work +COPY --chown=1001:root target/*-runner /work/application + +EXPOSE 8080 +USER 1001 + +ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"] diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/CLIMain.java b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/CLIMain.java new file mode 100644 index 000000000..6a383d3a8 --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/CLIMain.java @@ -0,0 +1,39 @@ +package io.quarkus.workshop.superheroes.load; + +import io.quarkus.logging.Log; +import io.quarkus.picocli.runtime.annotations.TopCommand; +import io.quarkus.workshop.superheroes.load.scenarios.FightScenario; +import io.quarkus.workshop.superheroes.load.scenarios.HeroScenario; +import io.quarkus.workshop.superheroes.load.scenarios.VillainScenario; +import jakarta.inject.Inject; +import picocli.CommandLine; + +import java.io.IOException; +import java.util.Scanner; +import java.util.concurrent.Callable; + +@TopCommand +@CommandLine.Command(name = "Cli Super Heroes", mixinStandardHelpOptions = true) +public class CLIMain implements Callable { + + @Inject + VillainScenario villainScenario; + + @Inject + HeroScenario heroScenario; + + @Inject + FightScenario fightScenario; + + @Override + public Integer call() throws InterruptedException { + while (true) { + heroScenario.run(); + villainScenario.run(); + fightScenario.run(); + Thread.sleep(500); + } + + // return CommandLine.ExitCode.USAGE; + } +} diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/Fight.java b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/Fight.java new file mode 100644 index 000000000..152c7cde2 --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/Fight.java @@ -0,0 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.quarkus.workshop.superheroes.load.client; + +public class Fight { + public Hero hero; + public Villain villain; +} diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/FightsProxy.java b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/FightsProxy.java new file mode 100644 index 000000000..a0cb7f749 --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/FightsProxy.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.quarkus.workshop.superheroes.load.client; + +import io.quarkus.rest.client.reactive.ClientExceptionMapper; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; + +import java.util.List; + +@Path("/api/fights") +@Produces(MediaType.APPLICATION_JSON) +@RegisterRestClient(configKey = "fight") +public interface FightsProxy { + + @GET + @Path("/hello") + @Produces(MediaType.TEXT_PLAIN) + String hello(); + + @GET + List all(); + + @GET + @Path("/randomfighters") + Villain random(); + + @POST + Fight create(Fight villain); + + @GET + @Path("/{id}") + Fight get(@PathParam("id") String id); + + @ClientExceptionMapper + static RuntimeException toException(Response response) { + return null; + } +} diff --git a/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/WeightedRandomResult.java b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/Hero.java similarity index 59% rename from quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/WeightedRandomResult.java rename to quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/Hero.java index 94a86d4c4..8b8961837 100644 --- a/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/WeightedRandomResult.java +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/Hero.java @@ -14,23 +14,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.quarkus.workshop.superheroes.load; +package io.quarkus.workshop.superheroes.load.client; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Random; -import java.util.function.Supplier; +public class Hero { + public String id; + public String name; + public String otherName; + public int level; + public String picture; + public String powers; -public class WeightedRandomResult implements Supplier { - private final Random random = new Random(); - private final List results = new ArrayList<>(); - - public WeightedRandomResult(final Collection results) { - this.results.addAll(results); - } - - public T get() { - return this.results.get(random.nextInt(this.results.size())); + @Override + public String toString() { + return "Hero{" + "id='" + id + '\'' + ", name='" + name + '\'' + '}'; } } diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/HeroProxy.java b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/HeroProxy.java new file mode 100644 index 000000000..3d1a47899 --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/HeroProxy.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.quarkus.workshop.superheroes.load.client; + +import io.quarkus.rest.client.reactive.ClientExceptionMapper; +import io.smallrye.mutiny.Uni; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; + +import java.util.List; +import java.util.concurrent.CompletionStage; + +@Path("/api/heroes") +@Produces(MediaType.APPLICATION_JSON) +@RegisterRestClient(configKey = "hero") +public interface HeroProxy { + @GET + @Path("/hello") + @Produces(MediaType.TEXT_PLAIN) + Uni hello(); + + @GET + List all(); + + @GET + @Path("/random") + Hero random(); + + @POST + Hero create(Hero hero); + + @GET + @Path("/{id}") + Hero get(@PathParam("id") String id); + + @GET + @Path("/{id}") + String delete(@PathParam("id") String id); + + @ClientExceptionMapper + static RuntimeException toException(Response response) { + return null; + } + +} diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/RequestLogger.java b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/RequestLogger.java new file mode 100644 index 000000000..ec344545e --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/RequestLogger.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.quarkus.workshop.superheroes.load.client; + +import io.quarkus.logging.Log; +import io.vertx.core.buffer.Buffer; +import io.vertx.core.http.HttpClientRequest; +import io.vertx.core.http.HttpClientResponse; +import jakarta.enterprise.context.ApplicationScoped; +import org.jboss.resteasy.reactive.client.api.ClientLogger; + +@ApplicationScoped +public class RequestLogger implements ClientLogger { + + @Override + public void setBodySize(int bodySize) { + } + + @Override + public void logResponse(HttpClientResponse response, boolean redirect) { + Log.infof("%s - %s - %d", response.request().getMethod().name(), response.request().absoluteURI(), response.statusCode()); + } + + @Override + public void logRequest(HttpClientRequest request, Buffer body, boolean omitBody) { + } +} diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/Villain.java b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/Villain.java new file mode 100644 index 000000000..d1b66c377 --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/Villain.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.quarkus.workshop.superheroes.load.client; + +public class Villain { + public String id; + public String name; + public String otherName; + public int level; + public String picture; + public String powers; + + @Override + public String toString() { + return "Villain{" + "id='" + id + '\'' + ", name='" + name + '\'' + '}'; + } +} diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/VillainProxy.java b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/VillainProxy.java new file mode 100644 index 000000000..47d6aa040 --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/client/VillainProxy.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.quarkus.workshop.superheroes.load.client; + +import io.quarkus.rest.client.reactive.ClientExceptionMapper; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; + +import java.util.List; + +@Path("/api/villains") +@Produces(MediaType.APPLICATION_JSON) +@RegisterRestClient(configKey = "villain") +public interface VillainProxy { + + @GET + @Path("/hello") + @Produces(MediaType.TEXT_PLAIN) + String hello(); + + @GET + List all(); + + @GET + @Path("/random") + Villain random(); + + @POST + Villain create(Villain villain); + + @GET + @Path("/{id}") + Villain get(@PathParam("id") String id); + + @GET + @Path("/{id}") + String delete(@PathParam("id") String id); + + @ClientExceptionMapper + static RuntimeException toException(Response response) { + return null; + } +} diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/package-info.java b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/package-info.java new file mode 100644 index 000000000..0130de485 --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/package-info.java @@ -0,0 +1 @@ +package io.quarkus.workshop.superheroes.load; diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/scenarios/FightScenario.java b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/scenarios/FightScenario.java new file mode 100644 index 000000000..f1f1ff5f2 --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/scenarios/FightScenario.java @@ -0,0 +1,87 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.quarkus.workshop.superheroes.load.scenarios; + +import com.github.javafaker.Faker; +import com.github.javafaker.Superhero; +import io.quarkus.workshop.superheroes.load.client.Fight; +import io.quarkus.workshop.superheroes.load.client.FightsProxy; +import io.quarkus.workshop.superheroes.load.client.Hero; +import io.quarkus.workshop.superheroes.load.client.Villain; +import jakarta.inject.Singleton; +import org.eclipse.microprofile.rest.client.inject.RestClient; + +import java.util.Random; + +import static io.quarkus.workshop.superheroes.load.scenarios.RandomId.idParam; + +@Singleton +public class FightScenario { + private static int NB_FIGHT = 10; + + @RestClient + FightsProxy fightsProxy; + + private Faker faker = new Faker(); + + private final Random random = new Random(); + + public void run() { + try { + switch (random.nextInt(4)) { + case 0: + fightsProxy.hello(); + break; + case 1: + fightsProxy.random(); + break; + case 2: + fightsProxy.get(idParam(NB_FIGHT)); + break; + case 3: + fightsProxy.create(createFight()); + break; + default: + } + } catch (Throwable ex) { + // Ignore + } + } + + private Fight createFight() { + final Superhero fakeHero = faker.superhero(); + Fight fight = new Fight(); + fight.hero = new Hero(); + fight.villain = new Villain(); + if (Math.random() * 100 < 95) { + fight.hero.name = fakeHero.name(); + fight.hero.otherName = faker.funnyName().name(); + fight.hero.level = faker.number().numberBetween(1, 20); + fight.hero.picture = faker.internet().url(); + fight.hero.powers = fakeHero.power(); + fight.villain.name = fakeHero.name(); + fight.villain.otherName = faker.funnyName().name(); + fight.villain.level = faker.number().numberBetween(1, 20); + fight.villain.picture = faker.internet().url(); + fight.villain.powers = fakeHero.power(); + } + + return fight; + } + + +} diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/scenarios/HeroScenario.java b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/scenarios/HeroScenario.java new file mode 100644 index 000000000..1fa6f548d --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/scenarios/HeroScenario.java @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.quarkus.workshop.superheroes.load.scenarios; + +import com.github.javafaker.Faker; +import com.github.javafaker.Superhero; +import io.quarkus.runtime.StartupEvent; +import io.quarkus.workshop.superheroes.load.client.Hero; +import io.quarkus.workshop.superheroes.load.client.HeroProxy; +import jakarta.enterprise.event.Observes; +import jakarta.inject.Singleton; +import org.eclipse.microprofile.rest.client.inject.RestClient; + +import java.util.Random; + +import static io.quarkus.workshop.superheroes.load.scenarios.RandomId.idParam; + +@Singleton +public class HeroScenario { + private static int NB_HEROES = 941; + + @RestClient + HeroProxy heroProxy; + + private Faker faker = new Faker(); + + public void getNumberOfHeroes(@Observes StartupEvent ev) { + NB_HEROES = heroProxy.all().size(); + } + + private final Random random = new Random(); + + // tag::adocScenario[] + public void run() { + try { + switch (random.nextInt(5)) { + case 0: + heroProxy.hello(); + break; + case 1: + heroProxy.random(); + break; + case 2: + heroProxy.get(idParam(NB_HEROES)); + break; + case 3: + heroProxy.delete(idParam(NB_HEROES)); + break; + case 4: + heroProxy.create(createHero()); + break; + default: + } + } catch (Throwable t) { + // Ignore + } + + } + // end::adocScenario[] + + private Hero createHero() { + final Superhero fakeHero = faker.superhero(); + Hero hero = new Hero(); + if (Math.random() * 100 < 95) { + hero.name = fakeHero.name(); + hero.otherName = faker.funnyName().name(); + hero.level = faker.number().numberBetween(1, 20); + hero.picture = faker.internet().url(); + hero.powers = fakeHero.power(); + } else { + hero.otherName = faker.funnyName().name(); + hero.level = 0; + hero.picture = faker.internet().url(); + hero.powers = fakeHero.power(); + } + return hero; + } +} diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/scenarios/RandomId.java b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/scenarios/RandomId.java new file mode 100644 index 000000000..4df8d1b5f --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/scenarios/RandomId.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.quarkus.workshop.superheroes.load.scenarios; + +import java.util.concurrent.ThreadLocalRandom; + +public final class RandomId { + public static String idParam(int bound) { + return ThreadLocalRandom.current().nextInt(0, bound + 1) + ""; + } +} diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/scenarios/VillainScenario.java b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/scenarios/VillainScenario.java new file mode 100644 index 000000000..980145d37 --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/scenarios/VillainScenario.java @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.quarkus.workshop.superheroes.load.scenarios; + +import com.github.javafaker.Faker; +import com.github.javafaker.Superhero; +import io.quarkus.runtime.StartupEvent; +import io.quarkus.workshop.superheroes.load.client.Villain; +import io.quarkus.workshop.superheroes.load.client.VillainProxy; +import jakarta.enterprise.context.Dependent; +import jakarta.enterprise.event.Observes; +import org.eclipse.microprofile.rest.client.inject.RestClient; + +import java.util.Random; + +import static io.quarkus.workshop.superheroes.load.scenarios.RandomId.idParam; + +@Dependent +public class VillainScenario { + private static int NB_VILLAIN = 570; + + @RestClient + VillainProxy villainProxy; + + private Faker faker = new Faker(); + private final Random random = new Random(); + public void getNumberOfVillains(@Observes StartupEvent ev) { + NB_VILLAIN = villainProxy.all().size(); + } + + public void run() { + try { + switch (random.nextInt(5)) { + case 0: villainProxy.hello(); break; + case 1: villainProxy.random(); break; + case 2: villainProxy.get(idParam(NB_VILLAIN)); break; + case 3: villainProxy.delete(idParam(NB_VILLAIN)); break; + case 4: villainProxy.create(createVillain()); break; + default: + } + } catch (Throwable t) { + // Ignore + } + + } + + private Villain createVillain() { + final Superhero fakeHero = faker.superhero(); + Villain villain = new Villain(); + if (Math.random() * 100 < 95) { + villain.name = fakeHero.name(); + villain.otherName = faker.funnyName().name(); + villain.level = faker.number().numberBetween(1, 20); + villain.picture = faker.internet().url(); + villain.powers = fakeHero.power(); + } else { + villain.otherName = faker.funnyName().name(); + villain.level = 0; + villain.picture = faker.internet().url(); + villain.powers = fakeHero.power(); + } + return villain; + } +} diff --git a/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/resources/application.properties b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/resources/application.properties new file mode 100644 index 000000000..7a89dfd0f --- /dev/null +++ b/quarkus-workshop-super-heroes/super-heroes/cli-super-heroes/src/main/resources/application.properties @@ -0,0 +1,7 @@ +quarkus.tls.trust-all=true +quarkus.log.console.format=%d{yyyy-MM-dd HH:mm:ss} %-5p %s%e%n +quarkus.rest-client.fight.url=http://localhost:8082 +quarkus.rest-client.hero.url=http://localhost:8083 +quarkus.rest-client.villain.url=http://localhost:8084 +quarkus.rest-client.logging.scope=request-response + diff --git a/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/.mvn/wrapper/MavenWrapperDownloader.java b/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index 25a6ad79a..000000000 --- a/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * 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 - * - * 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. - */ - -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.5"; - /** - * 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/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/.mvn/wrapper/maven-wrapper.properties b/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index fa87ad7dd..000000000 --- a/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.1/apache-maven-3.6.1-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar diff --git a/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/mvnw b/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/mvnw deleted file mode 100755 index d2f0ea380..000000000 --- a/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Maven2 Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` - fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - 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 - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# 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)`" -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - 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" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -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.5/maven-wrapper-0.5.5.jar" - else - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.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"} -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 -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - 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" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/pom.xml b/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/pom.xml deleted file mode 100644 index 91cec6a88..000000000 --- a/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/pom.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - 4.0.0 - - io.quarkus.workshop.super-heroes - load-super-heroes - 01 - Quarkus Workshop :: Super-Heroes :: Load Super Heroes - - - 11 - 11 - yyyy-MM-dd - UTF-8 - UTF-8 - - - - - org.jboss.resteasy - resteasy-client - 4.6.0.Final - - - javax.annotation - javax.annotation-api - 1.3.2 - - - com.github.javafaker - javafaker - 1.0.2 - - - org.glassfish - javax.json - 1.1.4 - - - - - - - org.codehaus.mojo - exec-maven-plugin - 1.6.0 - - io.quarkus.workshop.superheroes.load.SuperHeroesLoad - - - - - diff --git a/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/Endpoint.java b/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/Endpoint.java deleted file mode 100644 index 03e776248..000000000 --- a/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/Endpoint.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.quarkus.workshop.superheroes.load; - -import javax.ws.rs.client.Entity; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.function.Supplier; - -public class Endpoint { - private String path; - private String method; - private Supplier> templates; - private Supplier entity; - - private Endpoint(final String path, - final String method, - final Supplier> templates, - final Supplier entity) { - this.path = path; - this.method = method; - this.templates = templates; - this.entity = entity; - } - - public String getPath() { - return path; - } - - public String getMethod() { - return method; - } - - public Map getTemplates() { - return templates.get(); - } - - public Entity getEntity() { - return Optional.ofNullable(entity).map(Supplier::get).orElse(null); - } - - public static Endpoint endpoint(final String endpoint, final String method) { - return new Endpoint(endpoint, method, HashMap::new, null); - } - - public static Endpoint endpointWithTemplates(final String endpoint, final String method, - final Supplier> templates) { - return new Endpoint(endpoint, method, templates, null); - } - - public static Endpoint endpointWithEntity(final String endpoint, final String method, - final Supplier entity) { - return new Endpoint(endpoint, method, HashMap::new, entity); - } -} diff --git a/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/FightScenario.java b/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/FightScenario.java deleted file mode 100644 index 451489795..000000000 --- a/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/FightScenario.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.quarkus.workshop.superheroes.load; - -import com.github.javafaker.Superhero; - -import javax.json.Json; -import javax.json.JsonObject; -import javax.ws.rs.client.Entity; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ThreadLocalRandom; -import java.util.stream.Stream; - -import static io.quarkus.workshop.superheroes.load.Endpoint.*; -import static java.util.stream.Collectors.collectingAndThen; -import static java.util.stream.Collectors.toList; -import static javax.ws.rs.client.Entity.json; - -public class FightScenario extends ScenarioInvoker { - - private static final int NB_FIGHTS = 10; - - private static final String targetUrl = "http://localhost:8082"; - - private static final String contextRoot = "/api/fights"; - - @Override - protected String getTargetUrl() { - return targetUrl; - } - - @Override - protected List getEndpoints() { - return Stream.of( - endpoint(contextRoot, "GET"), - endpoint(contextRoot + "/hello", "GET"), - endpoint(contextRoot + "/randomfighters", "GET"), - endpointWithTemplates(contextRoot + "/{id}", "GET", this::idParam), - endpointWithEntity(contextRoot, "POST", this::createFight) - ) - .collect(collectingAndThen(toList(), Collections::unmodifiableList)); - } - - private Entity createFight() { - final Superhero hero = faker.superhero(); - JsonObject json; - if (Math.random() * 100 < 95) { - - json = Json.createObjectBuilder() - .add("hero", - Json.createObjectBuilder() - .add("name", hero.name()) - .add("otherName", faker.funnyName().name()) - .add("level", faker.number().numberBetween(1, 20)) - .add("picture", faker.internet().url()) - .add("powers", hero.power()).build() - ) - .add("villain", - Json.createObjectBuilder() - .add("name", hero.name()) - .add("otherName", faker.funnyName().name()) - .add("level", faker.number().numberBetween(1, 20)) - .add("picture", faker.internet().url()) - .add("powers", hero.power()).build() - ) - .build(); - } else { - json = Json.createObjectBuilder() - .add("hero", "") - .add("villain", "") - .build(); - } - return json(json.toString()); - } - - private Map idParam() { - final HashMap templates = new HashMap<>(); - templates.put("id", ThreadLocalRandom.current().nextInt(0, NB_FIGHTS + 1)); - return templates; - } -} diff --git a/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/HeroScenario.java b/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/HeroScenario.java deleted file mode 100644 index e7a0fccf6..000000000 --- a/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/HeroScenario.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.quarkus.workshop.superheroes.load; - -import com.github.javafaker.Superhero; - -import javax.json.Json; -import javax.json.JsonObject; -import javax.ws.rs.client.Entity; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ThreadLocalRandom; -import java.util.stream.Stream; - -import static io.quarkus.workshop.superheroes.load.Endpoint.*; -import static java.util.stream.Collectors.collectingAndThen; -import static java.util.stream.Collectors.toList; -import static javax.ws.rs.client.Entity.json; - -public class HeroScenario extends ScenarioInvoker { - - private static final int NB_HEROES = 941; - - @Override - protected String getTargetUrl() { - return targetUrl; - } - - // tag::adocScenario[] - private static final String targetUrl = "http://localhost:8083"; - - private static final String contextRoot = "/api/heroes"; - - @Override - protected List getEndpoints() { - return Stream.of( - endpoint(contextRoot, "GET"), - endpoint(contextRoot + "/hello", "GET"), - endpoint(contextRoot + "/random", "GET"), - endpointWithTemplates(contextRoot + "/{id}", "GET", this::idParam), - endpointWithTemplates(contextRoot + "/{id}", "DELETE", this::idParam), - endpointWithEntity(contextRoot, "POST", this::createHero) - ).collect(collectingAndThen(toList(), Collections::unmodifiableList)); - } - // end::adocScenario[] - - private Entity createHero() { - final Superhero hero = faker.superhero(); - JsonObject json; - if (Math.random() * 100 < 95) { - json = Json.createObjectBuilder() - .add("name", hero.name()) - .add("otherName", faker.funnyName().name()) - .add("level", faker.number().numberBetween(1, 20)) - .add("picture", faker.internet().url()) - .add("powers", hero.power()) - .build(); - } else { - json = Json.createObjectBuilder() - .add("otherName", faker.funnyName().name()) - .add("level", 0) - .add("picture", faker.internet().url()) - .add("powers", hero.power()) - .build(); - } - return json(json.toString()); - } - - private Map idParam() { - final HashMap templates = new HashMap<>(); - templates.put("id", ThreadLocalRandom.current().nextInt(0, NB_HEROES + 1)); - return templates; - } -} diff --git a/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/ScenarioInvoker.java b/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/ScenarioInvoker.java deleted file mode 100644 index 11a98b29a..000000000 --- a/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/ScenarioInvoker.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.quarkus.workshop.superheroes.load; - -import com.github.javafaker.Faker; - -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Response; -import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.logging.Logger; - -import static java.lang.String.format; - -public abstract class ScenarioInvoker implements Runnable { - - private static Logger LOGGER = Logger.getLogger(ScenarioInvoker.class.getName()); - - protected Faker faker = new Faker(); - - private WeightedRandomResult endpointsToExecute = new WeightedRandomResult<>(getEndpoints()); - - protected abstract String getTargetUrl(); - - protected abstract List getEndpoints(); - - @Override - public void run() { - while (true) { - try { - final Endpoint endpoint = endpointsToExecute.get(); - final WebTarget webTarget = ClientBuilder.newClient().target(getTargetUrl()) - .path(endpoint.getPath()) - .resolveTemplates(endpoint.getTemplates()); - final Response response = webTarget.request().method(endpoint.getMethod(), endpoint.getEntity()); - LOGGER.info(format("%s - %s - %d", endpoint.getMethod(), webTarget.getUri(), response.getStatus())); - sleep(); - } catch (final Exception e) { - e.printStackTrace(); - } - } - } - - private void sleep() { - try { - TimeUnit.MILLISECONDS.sleep(500); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } -} diff --git a/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/SuperHeroesLoad.java b/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/SuperHeroesLoad.java deleted file mode 100644 index 7b170d556..000000000 --- a/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/SuperHeroesLoad.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.quarkus.workshop.superheroes.load; - -public class SuperHeroesLoad { - - public static void main(String[] args) { - Thread heroScenario = new Thread(new HeroScenario()); - heroScenario.start(); - Thread villainScenario = new Thread(new VillainScenario()); - villainScenario.start(); - Thread fightScenario = new Thread(new FightScenario()); - fightScenario.start(); - } -} diff --git a/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/VillainScenario.java b/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/VillainScenario.java deleted file mode 100644 index dd64fdd11..000000000 --- a/quarkus-workshop-super-heroes/super-heroes/load-super-heroes/src/main/java/io/quarkus/workshop/superheroes/load/VillainScenario.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.quarkus.workshop.superheroes.load; - -import com.github.javafaker.Superhero; - -import javax.json.Json; -import javax.json.JsonObject; -import javax.ws.rs.client.Entity; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ThreadLocalRandom; -import java.util.stream.Stream; - -import static io.quarkus.workshop.superheroes.load.Endpoint.*; -import static java.util.stream.Collectors.collectingAndThen; -import static java.util.stream.Collectors.toList; -import static javax.ws.rs.client.Entity.json; - -public class VillainScenario extends ScenarioInvoker { - - private static final int NB_VILLAINS = 570; - - private static final String targetUrl = "http://localhost:8084"; - - private static final String contextRoot = "/api/villains"; - - @Override - protected String getTargetUrl() { - return targetUrl; - } - - @Override - protected List getEndpoints() { - return Stream.of( - endpoint(contextRoot, "GET"), - endpoint(contextRoot + "/hello", "GET"), - endpoint(contextRoot + "/random", "GET"), - endpointWithTemplates(contextRoot + "/{id}", "GET", this::idParam), - endpointWithTemplates(contextRoot + "/{id}", "DELETE", this::idParam), - endpointWithEntity(contextRoot, "POST", this::createVillain) - ) - .collect(collectingAndThen(toList(), Collections::unmodifiableList)); - } - - private Entity createVillain() { - final Superhero hero = faker.superhero(); - JsonObject json; - if (Math.random() * 100 < 95) { - json = Json.createObjectBuilder() - .add("name", hero.name()) - .add("otherName", faker.funnyName().name()) - .add("level", faker.number().numberBetween(1, 20)) - .add("picture", faker.internet().url()) - .add("powers", hero.power()) - .build(); - } else { - json = Json.createObjectBuilder() - .add("otherName", faker.funnyName().name()) - .add("level", 0) - .add("picture", faker.internet().url()) - .add("powers", hero.power()) - .build(); - } - return json(json.toString()); - } - - private Map idParam() { - final HashMap templates = new HashMap<>(); - templates.put("id", ThreadLocalRandom.current().nextInt(0, NB_VILLAINS + 1)); - return templates; - } -}