From 2381772bc106146b3054fa81e4d0035a965385a3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 19 Mar 2026 09:34:51 +0000 Subject: [PATCH 1/2] Initial plan From 15fee99cc4f680a915a5f18808c61e0fbcfa2751 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 19 Mar 2026 09:42:37 +0000 Subject: [PATCH 2/2] Add landing page and error page with Thymeleaf Co-authored-by: GoetzEli <157024555+GoetzEli@users.noreply.github.com> --- .mvn/wrapper/maven-wrapper.jar | Bin 0 -> 63029 bytes .mvn/wrapper/maven-wrapper.properties | 18 + mvnw | 358 ++++++++-------- mvnw.cmd | 388 ++++++++++-------- pom.xml | 4 + .../greeting/controller/WebController.java | 13 + src/main/resources/templates/error.html | 68 +++ src/main/resources/templates/index.html | 84 ++++ .../controller/WebControllerTest.java | 23 ++ 9 files changed, 606 insertions(+), 350 deletions(-) create mode 100644 .mvn/wrapper/maven-wrapper.jar create mode 100644 .mvn/wrapper/maven-wrapper.properties mode change 100644 => 100755 mvnw create mode 100644 src/main/java/de/dhbw/ravensburg/vs/greeting/greeting/controller/WebController.java create mode 100644 src/main/resources/templates/error.html create mode 100644 src/main/resources/templates/index.html create mode 100644 src/test/java/de/dhbw/ravensburg/vs/greeting/greeting/controller/WebControllerTest.java diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..716422558d4bd975382c136a1038a18a88157dce GIT binary patch literal 63029 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 QA`GhoSSdO?w)@k603mV&bpQYW literal 0 HcmV?d00001 diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..7918ad7 --- /dev/null +++ b/.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.13/apache-maven-3.9.13-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.0/maven-wrapper-3.3.0.jar diff --git a/mvnw b/mvnw old mode 100644 new mode 100755 index a16b543..1fdbaf2 --- a/mvnw +++ b/mvnw @@ -8,7 +8,7 @@ # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # -# https://www.apache.org/licenses/LICENSE-2.0 +# 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 @@ -19,7 +19,7 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Maven Start Up Batch script +# Apache Maven Wrapper startup batch script, version 3.3.0 # # Required ENV vars: # ------------------ @@ -27,284 +27,306 @@ # # 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 [ -z "$MAVEN_SKIP_RC" ]; then - if [ -f /etc/mavenrc ] ; 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 + 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; +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 +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` +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"` +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 "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +if $mingw; then + [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] \ + && JAVA_HOME="$( + cd "$JAVA_HOME" || ( + echo "cannot cd into $JAVA_HOME." >&2 + exit 1 + ) + pwd + )" fi if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; 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" + 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\"`" + javaExecutable="$(readlink -f "$javaExecutable")" fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` + 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 +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`" + JAVACMD="$( + \unset -f command 2>/dev/null + \command -v java + )" fi fi -if [ ! -x "$JAVACMD" ] ; then +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." +if [ -z "$JAVA_HOME" ]; then + echo "Warning: JAVA_HOME environment variable is not set." >&2 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" + if [ -z "$1" ]; then + echo "Path not specified to find_maven_basedir" >&2 return 1 fi basedir="$1" wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then + 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` + wdir=$( + cd "$wdir/.." || exit 1 + pwd + ) fi # end of workaround done - echo "${basedir}" + printf '%s' "$( + cd "$basedir" || exit 1 + pwd + )" } # concatenates all lines of a file concat_lines() { if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" + # 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 "$(pwd)"` +BASE_DIR=$(find_maven_basedir "$(dirname "$0")") if [ -z "$BASE_DIR" ]; then - exit 1; + 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. ########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi +wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" +if [ -r "$wrapperJarPath" ]; then + log "Found $wrapperJarPath" else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + log "Couldn't find $wrapperJarPath, downloading it ..." + + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.3.0/maven-wrapper-3.3.0.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.0/maven-wrapper-3.3.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 - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" 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" + 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 - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + 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 - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + javaSource=$(cygpath --path --windows "$javaSource") + javaClass=$(cygpath --path --windows "$javaClass") 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 + 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 ########################################################################################## -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR +# 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." >&2 + echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." >&2 + 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 "$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"` + [ -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 $@" +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.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd index c8d4337..b694e6c 100644 --- a/mvnw.cmd +++ b/mvnw.cmd @@ -1,182 +1,206 @@ -@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 https://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@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 Maven Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a 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 "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\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 DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - -FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -: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 "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\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% - -exit /B %ERROR_CODE% +@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.3.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. >&2 +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. >&2 +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. >&2 +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. >&2 +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.3.0/maven-wrapper-3.3.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.3.0/maven-wrapper-3.3.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 "&{"^ + "Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash;"^ + "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ + "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ + " Write-Error 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ + " Write-Error 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ + " Write-Error '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/pom.xml b/pom.xml index 5459af3..a52b155 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,10 @@ springdoc-openapi-ui 1.2.32 + + org.springframework.boot + spring-boot-starter-thymeleaf + diff --git a/src/main/java/de/dhbw/ravensburg/vs/greeting/greeting/controller/WebController.java b/src/main/java/de/dhbw/ravensburg/vs/greeting/greeting/controller/WebController.java new file mode 100644 index 0000000..32a1b3b --- /dev/null +++ b/src/main/java/de/dhbw/ravensburg/vs/greeting/greeting/controller/WebController.java @@ -0,0 +1,13 @@ +package de.dhbw.ravensburg.vs.greeting.greeting.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class WebController { + + @GetMapping("/") + public String index() { + return "index"; + } +} diff --git a/src/main/resources/templates/error.html b/src/main/resources/templates/error.html new file mode 100644 index 0000000..9ad3dfd --- /dev/null +++ b/src/main/resources/templates/error.html @@ -0,0 +1,68 @@ + + + + + + Error - Course Greeting Service + + + +
+
⚠️
+
Error
+

Something went wrong

+

An unexpected error occurred while processing your request.

+
+ Back to Home + +
+ + diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html new file mode 100644 index 0000000..75e6e7e --- /dev/null +++ b/src/main/resources/templates/index.html @@ -0,0 +1,84 @@ + + + + + + Course Greeting Service + + + +
+ +

Course Greeting Service

+

A Spring Boot REST API that returns multilingual greetings.

+ +
+

Available Endpoints

+
+ GET /v1/api/greetings?lang={de|en|fr|es} +

Returns a greeting in the requested language. Requires a username header.

+
+
+ GET /v1/api/greetings/version +

Returns the current version of the service.

+
+
+ + + + +
+ + diff --git a/src/test/java/de/dhbw/ravensburg/vs/greeting/greeting/controller/WebControllerTest.java b/src/test/java/de/dhbw/ravensburg/vs/greeting/greeting/controller/WebControllerTest.java new file mode 100644 index 0000000..9578e14 --- /dev/null +++ b/src/test/java/de/dhbw/ravensburg/vs/greeting/greeting/controller/WebControllerTest.java @@ -0,0 +1,23 @@ +package de.dhbw.ravensburg.vs.greeting.greeting.controller; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.test.web.servlet.MockMvc; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@WebMvcTest(WebController.class) +class WebControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Test + void indexReturnsLandingPage() throws Exception { + mockMvc.perform(get("/")) + .andExpect(status().isOk()) + .andExpect(view().name("index")); + } +}