diff --git a/theodolite-quarkus/.dockerignore b/theodolite-quarkus/.dockerignore new file mode 100644 index 0000000000000000000000000000000000000000..4361d2fb38ddc889a2c68222aa5b600fbcfbf6f9 --- /dev/null +++ b/theodolite-quarkus/.dockerignore @@ -0,0 +1,5 @@ +* +!build/*-runner +!build/*-runner.jar +!build/lib/* +!build/quarkus-app/* \ No newline at end of file diff --git a/theodolite-quarkus/.gitignore b/theodolite-quarkus/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..a1eff0e1d4dddacdbcafa2c235b28616cb53e7bf --- /dev/null +++ b/theodolite-quarkus/.gitignore @@ -0,0 +1,33 @@ +# Gradle +.gradle/ +build/ + +# 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 diff --git a/theodolite-quarkus/README.md b/theodolite-quarkus/README.md new file mode 100644 index 0000000000000000000000000000000000000000..053c3e214f8ff24a53b7ffb068c6033c3d449fd1 --- /dev/null +++ b/theodolite-quarkus/README.md @@ -0,0 +1,50 @@ +# theodolite-quarkus project + +This project uses Quarkus, the Supersonic Subatomic Java Framework. + +If you want to learn more about Quarkus, please visit its website: https://quarkus.io/ . + +## Running the application in dev mode + +You can run your application in dev mode that enables live coding using: +```shell script +./gradlew quarkusDev +``` + +## Packaging and running the application + +The application can be packaged using: +```shell script +./gradlew build +``` +It produces the `theodolite-quarkus-1.0.0-SNAPSHOT-runner.jar` file in the `/build` directory. +Be aware that it’s not an _über-jar_ as the dependencies are copied into the `build/lib` directory. + +If you want to build an _über-jar_, execute the following command: +```shell script +./gradlew build -Dquarkus.package.type=uber-jar +``` + +The application is now runnable using `java -jar build/theodolite-quarkus-1.0.0-SNAPSHOT-runner.jar`. + +## Creating a native executable + +You can create a native executable using: +```shell script +./gradlew build -Dquarkus.package.type=native +``` + +Or, if you don't have GraalVM installed, you can run the native executable build in a container using: +```shell script +./gradlew build -Dquarkus.package.type=native -Dquarkus.native.container-build=true +``` + +You can then execute your native executable with: `./build/theodolite-quarkus-1.0.0-SNAPSHOT-runner` + +If you want to learn more about building native executables, please consult https://quarkus.io/guides/gradle-tooling. + +# RESTEasy JAX-RS + +<p>A Hello World RESTEasy resource</p> + +Guide: https://quarkus.io/guides/rest-json diff --git a/theodolite-quarkus/build.gradle b/theodolite-quarkus/build.gradle new file mode 100644 index 0000000000000000000000000000000000000000..486be3196f9114f576266fa8843e2ee183e4fca4 --- /dev/null +++ b/theodolite-quarkus/build.gradle @@ -0,0 +1,43 @@ +plugins { + id 'org.jetbrains.kotlin.jvm' version "1.3.72" + id "org.jetbrains.kotlin.plugin.allopen" version "1.3.72" + id 'io.quarkus' +} + +repositories { + mavenLocal() + mavenCentral() +} + +dependencies { + implementation enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}") + implementation 'io.quarkus:quarkus-kotlin' + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' + implementation 'io.quarkus:quarkus-arc' + implementation 'io.quarkus:quarkus-resteasy' + testImplementation 'io.quarkus:quarkus-junit5' + testImplementation 'io.rest-assured:rest-assured' +} + +group 'theodolite' +version '1.0.0-SNAPSHOT' + +java { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 +} + +allOpen { + annotation("javax.ws.rs.Path") + annotation("javax.enterprise.context.ApplicationScoped") + annotation("io.quarkus.test.junit.QuarkusTest") +} + +compileKotlin { + kotlinOptions.jvmTarget = JavaVersion.VERSION_11 + kotlinOptions.javaParameters = true +} + +compileTestKotlin { + kotlinOptions.jvmTarget = JavaVersion.VERSION_11 +} diff --git a/theodolite-quarkus/gradle.properties b/theodolite-quarkus/gradle.properties new file mode 100644 index 0000000000000000000000000000000000000000..d7e4187c25e76dfb440650274b2d383f75a32242 --- /dev/null +++ b/theodolite-quarkus/gradle.properties @@ -0,0 +1,8 @@ +#Gradle properties +quarkusPluginId=io.quarkus +quarkusPluginVersion=1.10.3.Final +quarkusPlatformGroupId=io.quarkus +quarkusPlatformArtifactId=quarkus-universe-bom +quarkusPlatformVersion=1.10.3.Final + +org.gradle.logging.level=INFO \ No newline at end of file diff --git a/theodolite-quarkus/gradle/wrapper/gradle-wrapper.jar b/theodolite-quarkus/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..62d4c053550b91381bbd28b1afc82d634bf73a8a Binary files /dev/null and b/theodolite-quarkus/gradle/wrapper/gradle-wrapper.jar differ diff --git a/theodolite-quarkus/gradle/wrapper/gradle-wrapper.properties b/theodolite-quarkus/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000000000000000000000000000000000..bb8b2fc26b2e572c79d7212a4f6f11057c6787f7 --- /dev/null +++ b/theodolite-quarkus/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/theodolite-quarkus/gradlew b/theodolite-quarkus/gradlew new file mode 100755 index 0000000000000000000000000000000000000000..fbd7c515832dab7b01092e80db76e5e03fe32d29 --- /dev/null +++ b/theodolite-quarkus/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +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 + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/theodolite-quarkus/gradlew.bat b/theodolite-quarkus/gradlew.bat new file mode 100755 index 0000000000000000000000000000000000000000..a9f778a7a964b6f01c904ee667903f005d6df556 --- /dev/null +++ b/theodolite-quarkus/gradlew.bat @@ -0,0 +1,104 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/theodolite-quarkus/settings.gradle b/theodolite-quarkus/settings.gradle new file mode 100644 index 0000000000000000000000000000000000000000..8a0af4a6504623f11c275c06e538537726935255 --- /dev/null +++ b/theodolite-quarkus/settings.gradle @@ -0,0 +1,11 @@ +pluginManagement { + repositories { + mavenLocal() + mavenCentral() + gradlePluginPortal() + } + plugins { + id "${quarkusPluginId}" version "${quarkusPluginVersion}" + } +} +rootProject.name='theodolite-quarkus' diff --git a/theodolite-quarkus/src/main/docker/Dockerfile.fast-jar b/theodolite-quarkus/src/main/docker/Dockerfile.fast-jar new file mode 100644 index 0000000000000000000000000000000000000000..32a4443a5d0291c8190acf8e59419d3d4825b2fd --- /dev/null +++ b/theodolite-quarkus/src/main/docker/Dockerfile.fast-jar @@ -0,0 +1,54 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# ./gradlew build -Dquarkus.package.type=fast-jar +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.fast-jar -t quarkus/theodolite-quarkus-fast-jar . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/theodolite-quarkus-fast-jar +# +# If you want to include the debug port into your docker image +# you will have to expose the debug port (default 5005) like this : EXPOSE 8080 5050 +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 -p 5005:5005 -e JAVA_ENABLE_DEBUG="true" quarkus/theodolite-quarkus-fast-jar +# +### +FROM registry.access.redhat.com/ubi8/ubi-minimal:8.3 + +ARG JAVA_PACKAGE=java-11-openjdk-headless +ARG RUN_JAVA_VERSION=1.3.8 +ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' +# Install java and the run-java script +# Also set up permissions for user `1001` +RUN microdnf install curl ca-certificates ${JAVA_PACKAGE} \ + && microdnf update \ + && microdnf clean all \ + && mkdir /deployments \ + && chown 1001 /deployments \ + && chmod "g+rwX" /deployments \ + && chown 1001:root /deployments \ + && curl https://repo1.maven.org/maven2/io/fabric8/run-java-sh/${RUN_JAVA_VERSION}/run-java-sh-${RUN_JAVA_VERSION}-sh.sh -o /deployments/run-java.sh \ + && chown 1001 /deployments/run-java.sh \ + && chmod 540 /deployments/run-java.sh \ + && echo "securerandom.source=file:/dev/urandom" >> /etc/alternatives/jre/lib/security/java.security + +# Configure the JAVA_OPTIONS, you can add -XshowSettings:vm to also display the heap size. +ENV JAVA_OPTIONS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +# We make four distinct layers so if there are application changes the library layers can be re-used +COPY --chown=1001 build/quarkus-app/lib/ /deployments/lib/ +COPY --chown=1001 build/quarkus-app/*.jar /deployments/ +COPY --chown=1001 build/quarkus-app/app/ /deployments/app/ +COPY --chown=1001 build/quarkus-app/quarkus/ /deployments/quarkus/ + +EXPOSE 8080 +USER 1001 + +ENTRYPOINT [ "/deployments/run-java.sh" ] diff --git a/theodolite-quarkus/src/main/docker/Dockerfile.jvm b/theodolite-quarkus/src/main/docker/Dockerfile.jvm new file mode 100644 index 0000000000000000000000000000000000000000..d6a4e05cdef5c8c1e25337b3d5a312e1e98a641a --- /dev/null +++ b/theodolite-quarkus/src/main/docker/Dockerfile.jvm @@ -0,0 +1,51 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# ./gradlew build +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/theodolite-quarkus-jvm . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/theodolite-quarkus-jvm +# +# If you want to include the debug port into your docker image +# you will have to expose the debug port (default 5005) like this : EXPOSE 8080 5050 +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 -p 5005:5005 -e JAVA_ENABLE_DEBUG="true" quarkus/theodolite-quarkus-jvm +# +### +FROM registry.access.redhat.com/ubi8/ubi-minimal:8.3 + +ARG JAVA_PACKAGE=java-11-openjdk-headless +ARG RUN_JAVA_VERSION=1.3.8 +ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' +# Install java and the run-java script +# Also set up permissions for user `1001` +RUN microdnf install curl ca-certificates ${JAVA_PACKAGE} \ + && microdnf update \ + && microdnf clean all \ + && mkdir /deployments \ + && chown 1001 /deployments \ + && chmod "g+rwX" /deployments \ + && chown 1001:root /deployments \ + && curl https://repo1.maven.org/maven2/io/fabric8/run-java-sh/${RUN_JAVA_VERSION}/run-java-sh-${RUN_JAVA_VERSION}-sh.sh -o /deployments/run-java.sh \ + && chown 1001 /deployments/run-java.sh \ + && chmod 540 /deployments/run-java.sh \ + && echo "securerandom.source=file:/dev/urandom" >> /etc/alternatives/jre/lib/security/java.security + +# Configure the JAVA_OPTIONS, you can add -XshowSettings:vm to also display the heap size. +ENV JAVA_OPTIONS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +COPY build/lib/* /deployments/lib/ +COPY build/*-runner.jar /deployments/app.jar + +EXPOSE 8080 +USER 1001 + +ENTRYPOINT [ "/deployments/run-java.sh" ] diff --git a/theodolite-quarkus/src/main/docker/Dockerfile.native b/theodolite-quarkus/src/main/docker/Dockerfile.native new file mode 100644 index 0000000000000000000000000000000000000000..4a6d4147c2c098a0c5f181cc96c9916eede64c97 --- /dev/null +++ b/theodolite-quarkus/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: +# +# ./gradlew build -Dquarkus.package.type=native +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.native -t quarkus/theodolite-quarkus . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/theodolite-quarkus +# +### +FROM registry.access.redhat.com/ubi8/ubi-minimal:8.3 +WORKDIR /work/ +RUN chown 1001 /work \ + && chmod "g+rwX" /work \ + && chown 1001:root /work +COPY --chown=1001:root build/*-runner /work/application + +EXPOSE 8080 +USER 1001 + +CMD ["./application", "-Dquarkus.http.host=0.0.0.0"] diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/GreetingResource.kt b/theodolite-quarkus/src/main/kotlin/theodolite/GreetingResource.kt new file mode 100644 index 0000000000000000000000000000000000000000..2cf79f2d805344ba2b19f8e0aea58ad682a5e36f --- /dev/null +++ b/theodolite-quarkus/src/main/kotlin/theodolite/GreetingResource.kt @@ -0,0 +1,14 @@ +package theodolite + +import javax.ws.rs.GET +import javax.ws.rs.Path +import javax.ws.rs.Produces +import javax.ws.rs.core.MediaType + +@Path("/hello-resteasy") +class GreetingResource { + + @GET + @Produces(MediaType.TEXT_PLAIN) + fun hello() = "Hello RESTEasy" +} \ No newline at end of file diff --git a/theodolite-quarkus/src/main/resources/META-INF/resources/index.html b/theodolite-quarkus/src/main/resources/META-INF/resources/index.html new file mode 100644 index 0000000000000000000000000000000000000000..1a04c85cdee291a34d26b80d75ae97b037090d87 --- /dev/null +++ b/theodolite-quarkus/src/main/resources/META-INF/resources/index.html @@ -0,0 +1,242 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>theodolite-quarkus - 1.0.0-SNAPSHOT</title> + <style> + h1, h2, h3, h4, h5, h6 { + margin-bottom: 0.5rem; + font-weight: 400; + line-height: 1.5; + } + + h1 { + font-size: 2.5rem; + } + + h2 { + font-size: 2rem + } + + h3 { + font-size: 1.75rem + } + + h4 { + font-size: 1.5rem + } + + h5 { + font-size: 1.25rem + } + + h6 { + font-size: 1rem + } + + .lead { + font-weight: 300; + font-size: 2rem; + } + + .banner { + font-size: 2.7rem; + margin: 0; + padding: 2rem 1rem; + background-color: #0d1c2c; + color: white; + } + + body { + margin: 0; + font-family: -apple-system, system-ui, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + } + + code { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 87.5%; + color: #e83e8c; + word-break: break-word; + } + + .left-column { + padding: .75rem; + max-width: 75%; + min-width: 55%; + } + + .right-column { + padding: .75rem; + max-width: 25%; + } + + .container { + display: flex; + width: 100%; + } + + li { + margin: 0.75rem; + } + + .right-section { + margin-left: 1rem; + padding-left: 0.5rem; + } + + .right-section h3 { + padding-top: 0; + font-weight: 200; + } + + .right-section ul { + border-left: 0.3rem solid #71aeef; + list-style-type: none; + padding-left: 0; + } + + .examples { + display: flex; + flex-wrap: wrap; + margin: 20px 0 20px -40px; + } + + .example { + display: flex; + margin-left: 20px; + margin-bottom: 20px; + flex-direction: column; + width: 350px; + background-color: #205894; + color: white; + } + + .example code { + color: lightgrey; + } + + .example-header { + padding: 20px; + display: flex; + position: relative; + } + + .example-header h4 { + margin: 0; + font-size: 1.4rem; + flex-grow: 1; + line-height: 1.5; + } + + .example-description { + padding: 0 20px; + flex-grow: 1; + } + + .example-paths { + display: flex; + flex-direction: column; + } + + .example-paths a { + display: block; + background-color: transparent; + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + color: white; + padding: 10px; + text-decoration: none; + } + + .example-paths a:before { + content: '⇨'; + font-weight: bold; + font-size: 1.5rem; + margin: 20px; + } + + .example-paths a:hover { + background-color: #0d1c2c; + } + + .guide-link { + background-color: #71aeef; + position: absolute; + color: white; + text-decoration: none; + top: 0; + right: 0; + padding: 7px; + font-weight: bold; + } + + .guide-link:hover { + background-color: #0d1c2c; + } + </style> +</head> +<body> + +<div class="banner lead"> + Your new Cloud-Native application is ready! +</div> + +<div class="container"> + <div class="left-column"> + <p class="lead"> Congratulations, you have created a new Quarkus cloud application.</p> + + <h2>Why do you see this?</h2> + + <p>This page is served by Quarkus. The source is in + <code>src/main/resources/META-INF/resources/index.html</code>.</p> + + <h2>What can I do from here?</h2> + + <p>If not already done, run the application in <em>dev mode</em> using: <code>./gradlew quarkusDev</code>. + </p> + <ul> + <li>Play with your example code in <code>src/main/kotlin</code>: + <div class="examples"> +<div class="example"> + <div class="example-header"> + <h4>RESTEasy JAX-RS</h4> + <a href="https://quarkus.io/guides/rest-json" target="_blank" class="guide-link">Guide</a> + </div> + <div class="example-description"> + <p>A Hello World RESTEasy resource</p> + + </div> + <div class="example-paths"> + <a href="/hello-resteasy" class="path-link" target="_blank">GET /hello-resteasy</a> + </div> +</div> + + </div> + </li> + <li>Your static assets are located in <code>src/main/resources/META-INF/resources</code>.</li> + <li>Configure your application in <code>src/main/resources/application.properties</code>.</li> + </ul> + <h2>Do you like Quarkus?</h2> + <p>Go give it a star on <a href="https://github.com/quarkusio/quarkus">GitHub</a>.</p> + </div> + <div class="right-column"> + <div class="right-section"> + <h3>Application</h3> + <ul> + <li>GroupId: theodolite</li> + <li>ArtifactId: theodolite-quarkus</li> + <li>Version: 1.0.0-SNAPSHOT</li> + <li>Quarkus Version: 1.10.3.Final</li> + </ul> + </div> + <div class="right-section"> + <h3>Next steps</h3> + <ul> + <li><a href="https://quarkus.io/guides/gradle-tooling" target="_blank">Setup your IDE</a></li> + <li><a href="https://quarkus.io/guides/getting-started.html" target="_blank">Getting started</a></li> + <li><a href="https://quarkus.io" target="_blank">Quarkus Web Site</a></li> + </ul> + </div> + </div> +</div> +</body> +</html> \ No newline at end of file diff --git a/theodolite-quarkus/src/main/resources/application.properties b/theodolite-quarkus/src/main/resources/application.properties new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/theodolite-quarkus/src/native-test/kotlin/theodolite/NativeGreetingResourceIT.kt b/theodolite-quarkus/src/native-test/kotlin/theodolite/NativeGreetingResourceIT.kt new file mode 100644 index 0000000000000000000000000000000000000000..26e8900ffe1a17b71fc23e1327fa649421548e36 --- /dev/null +++ b/theodolite-quarkus/src/native-test/kotlin/theodolite/NativeGreetingResourceIT.kt @@ -0,0 +1,6 @@ +package theodolite + +import io.quarkus.test.junit.NativeImageTest + +@NativeImageTest +class NativeGreetingResourceIT : GreetingResourceTest() \ No newline at end of file diff --git a/theodolite-quarkus/src/test/kotlin/theodolite/GreetingResourceTest.kt b/theodolite-quarkus/src/test/kotlin/theodolite/GreetingResourceTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..048093a7ec71389f7bfc59e22f7f4911ef485b94 --- /dev/null +++ b/theodolite-quarkus/src/test/kotlin/theodolite/GreetingResourceTest.kt @@ -0,0 +1,20 @@ +package theodolite + +import io.quarkus.test.junit.QuarkusTest +import io.restassured.RestAssured.given +import org.hamcrest.CoreMatchers.`is` +import org.junit.jupiter.api.Test + +@QuarkusTest +class GreetingResourceTest { + + @Test + fun testHelloEndpoint() { + given() + .`when`().get("/hello-resteasy") + .then() + .statusCode(200) + .body(`is`("Hello RESTEasy")) + } + +} \ No newline at end of file