diff --git a/.gitignore b/.gitignore
index 37e76631..153c9335 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,34 +1,29 @@
-# Jetbrains IntelliJ Idea
+HELP.md
+/target/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
.idea
+*.iws
*.iml
-
-# Linux
-# backup files
-*~
-
-# Windows
-# thumbnails
-Thumbs.db
-
-# Mac OS X
-# metadata
-.DS_Store
-# thumbnails
-._*
-
-# GIT
-.git/
-
-# Java
-*.class
-
-# packages
-*.jar
-*.war
-*.ear
-
-# Logging
-*.log
-
-# jME (binaries)
-*.so
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+/build/
+
+### VS Code ###
+.vscode/
diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java
new file mode 100644
index 00000000..7f91a56e
--- /dev/null
+++ b/.mvn/wrapper/MavenWrapperDownloader.java
@@ -0,0 +1,114 @@
+/*
+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
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+ /**
+ * 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/0.4.2/maven-wrapper-0.4.2.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 direcrory '" + 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 {
+ URL website = new URL(urlString);
+ ReadableByteChannel rbc;
+ rbc = Channels.newChannel(website.openStream());
+ FileOutputStream fos = new FileOutputStream(destination);
+ fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+ fos.close();
+ rbc.close();
+ }
+
+}
diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 00000000..01e67997
Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 00000000..cd0d451c
--- /dev/null
+++ b/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip
diff --git a/mvnw b/mvnw
new file mode 100644
index 00000000..8b9da3b8
--- /dev/null
+++ b/mvnw
@@ -0,0 +1,286 @@
+#!/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
+#
+# 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.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# 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)`"
+ # TODO classpath?
+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
+ jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
+ 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 command -v wget > /dev/null; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found wget ... using wget"
+ fi
+ wget "$jarUrl" -O "$wrapperJarPath"
+ elif command -v curl > /dev/null; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found curl ... using curl"
+ fi
+ curl -o "$wrapperJarPath" "$jarUrl"
+ else
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Falling back to using Java to download"
+ fi
+ javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+ 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
+
+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/mvnw.cmd b/mvnw.cmd
new file mode 100644
index 00000000..fef5a8f7
--- /dev/null
+++ b/mvnw.cmd
@@ -0,0 +1,161 @@
+@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 Maven2 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 key stroke 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 my 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.4.2/maven-wrapper-0.4.2.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% (
+ echo Found %WRAPPER_JAR%
+) else (
+ echo Couldn't find %WRAPPER_JAR%, downloading it ...
+ echo Downloading from: %DOWNLOAD_URL%
+ powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"
+ echo Finished downloading %WRAPPER_JAR%
+)
+@REM End of extension
+
+%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%
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 00000000..85d6288f
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,90 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.1.5.RELEASE
+
+
+ com.jakeesveld
+ java_countries
+ 0.0.1-SNAPSHOT
+ java_countries
+ JX day 1 Project
+
+
+ 1.8
+ 1.2.71
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ com.fasterxml.jackson.module
+ jackson-module-kotlin
+
+
+ org.jetbrains.kotlin
+ kotlin-reflect
+
+
+ org.jetbrains.kotlin
+ kotlin-stdlib-jdk8
+
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ runtime
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.9.9
+
+
+
+
+ ${project.basedir}/src/main/kotlin
+ ${project.basedir}/src/test/kotlin
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ org.jetbrains.kotlin
+ kotlin-maven-plugin
+
+
+ -Xjsr305=strict
+
+
+ spring
+
+
+
+
+ org.jetbrains.kotlin
+ kotlin-maven-allopen
+ ${kotlin.version}
+
+
+
+
+
+
+
diff --git a/src/main/kotlin/com/jakeesveld/java_countries/CheckCountry.kt b/src/main/kotlin/com/jakeesveld/java_countries/CheckCountry.kt
new file mode 100644
index 00000000..7a99a102
--- /dev/null
+++ b/src/main/kotlin/com/jakeesveld/java_countries/CheckCountry.kt
@@ -0,0 +1,5 @@
+package com.jakeesveld.java_countries
+
+interface CheckCountry {
+ fun check(c: Country): Boolean
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/jakeesveld/java_countries/CountryController.kt b/src/main/kotlin/com/jakeesveld/java_countries/CountryController.kt
new file mode 100644
index 00000000..e863b33b
--- /dev/null
+++ b/src/main/kotlin/com/jakeesveld/java_countries/CountryController.kt
@@ -0,0 +1,80 @@
+package com.jakeesveld.java_countries
+
+import org.springframework.http.HttpStatus
+import org.springframework.http.ResponseEntity
+import org.springframework.web.bind.annotation.PathVariable
+import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RestController
+
+@RestController
+@RequestMapping(value = ["/country"])
+class CountryController{
+
+ @RequestMapping(value = ["/names/all"])
+ fun getAllNames(): ResponseEntity{
+ countryList.countryList.sortBy { country -> country.name }
+ return ResponseEntity(countryList.countryList, HttpStatus.OK)
+ }
+
+ @RequestMapping(value = ["/names/start/{letter}"])
+ fun getNamesByFirstLetter(@PathVariable letter: Char): ResponseEntity{
+ return ResponseEntity(countryList.countryList.filter
+ { country -> country.name.get(0) == letter }.sortedBy
+ { country -> country.name }, HttpStatus.OK)
+ }
+
+
+ @RequestMapping(value = ["/names/size/{number}"])
+ fun getNamesBySize(@PathVariable number: Long): ResponseEntity{
+ return ResponseEntity(countryList.countryList.filter {
+ country -> country.name.length >= number }.sortedBy
+ {country -> country.name
+ }, HttpStatus.OK)
+ }
+
+ @RequestMapping(value = ["/population/size/{people}"])
+ fun getCountryByPopulation(@PathVariable people: Long): ResponseEntity{
+ return ResponseEntity(countryList.countryList.filter {
+ country -> country.population >= people }.sortedBy {
+ country -> country.population
+ }, HttpStatus.OK)
+ }
+
+ @RequestMapping(value = ["/population/min"])
+ fun getCountryWithSmallestPopulation(): ResponseEntity{
+ return ResponseEntity(countryList.countryList.minBy { country -> country.population }, HttpStatus.OK)
+ }
+
+ @RequestMapping(value = ["/population/max"])
+ fun getCountryWithLargestPopulation(): ResponseEntity{
+ return ResponseEntity(countryList.countryList.maxBy { country -> country.population }, HttpStatus.OK)
+ }
+
+ @RequestMapping(value = ["/age/age/{age}"])
+ fun getCountryByAge(@PathVariable age: Long): ResponseEntity{
+ return ResponseEntity(countryList.countryList.filter { country -> country.medianAge >= age }, HttpStatus.OK)
+ }
+
+ @RequestMapping(value = ["/age/min"])
+ fun getCountryWithSmallestAge(): ResponseEntity{
+ return ResponseEntity(countryList.countryList.minBy { country -> country.medianAge }, HttpStatus.OK)
+ }
+
+ @RequestMapping(value = ["/age/max"])
+ fun getCountryWithLargestAge(): ResponseEntity{
+ return ResponseEntity(countryList.countryList.maxBy { country -> country.medianAge }, HttpStatus.OK)
+ }
+
+ @RequestMapping(value = ["/age/median"])
+ fun getCountryWithMedianAge(): ResponseEntity{
+ val listCopy: List = countryList.countryList.sortedBy { country -> country.medianAge }
+ return ResponseEntity(listCopy[listCopy.size / 2], HttpStatus.OK)
+ }
+
+ @RequestMapping(value = ["/population/median"])
+ fun getCountryWithMedianPopulation(): ResponseEntity{
+ val listCopy: List = countryList.countryList.sortedBy { country -> country.population }
+ return ResponseEntity(listCopy[listCopy.size / 2], HttpStatus.OK)
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/jakeesveld/java_countries/CountryList.kt b/src/main/kotlin/com/jakeesveld/java_countries/CountryList.kt
new file mode 100644
index 00000000..088a9252
--- /dev/null
+++ b/src/main/kotlin/com/jakeesveld/java_countries/CountryList.kt
@@ -0,0 +1,209 @@
+package com.jakeesveld.java_countries
+
+class CountryList(){
+ val countryList= mutableListOf()
+
+ init {
+ countryList.add(Country("China", 1420062022, 9388211, 39))
+ countryList.add(Country("India", 1368737513, 2973190, 28))
+ countryList.add(Country("U.S.", 329093110, 9147420, 38))
+ countryList.add(Country("Indonesia", 269536482, 1811570, 29))
+ countryList.add(Country("Brazil", 212392717, 8358140, 33))
+ countryList.add(Country("Pakistan", 204596442, 770880, 23))
+ countryList.add(Country("Nigeria", 200962417, 910770, 18))
+ countryList.add(Country("Bangladesh", 168065920, 130170, 27))
+ countryList.add(Country("Russia", 143895551, 16376870, 40))
+ countryList.add(Country("Mexico", 132328035, 1943950, 29))
+ countryList.add(Country("Japan", 126854745, 364555, 48))
+ countryList.add(Country("Ethiopia", 110135635, 1000000, 20))
+ countryList.add(Country("Philippines", 108106310, 298170, 25))
+ countryList.add(Country("Egypt", 101168745, 995450, 25))
+ countryList.add(Country("Viet Nam", 97429061, 310070, 33))
+ countryList.add(Country("DR Congo", 86727573, 2267050, 17))
+ countryList.add(Country("Turkey", 82961805, 769630, 32))
+ countryList.add(Country("Iran", 82820766, 1628550, 32))
+ countryList.add(Country("Germany", 82438639, 348560, 47))
+ countryList.add(Country("Thailand", 69306160, 510890, 40))
+ countryList.add(Country("U.K.", 66959016, 241930, 41))
+ countryList.add(Country("France", 65480710, 547557, 42))
+ countryList.add(Country("Tanzania", 60913557, 885800, 18))
+ countryList.add(Country("Italy", 59216525, 294140, 48))
+ countryList.add(Country("South Africa", 58065097, 1213090, 27))
+ countryList.add(Country("Myanmar", 54336138, 653290, 29))
+ countryList.add(Country("Kenya", 52214791, 569140, 20))
+ countryList.add(Country("South Korea", 51339238, 97230, 43))
+ countryList.add(Country("Colombia", 49849818, 1109500, 32))
+ countryList.add(Country("Spain", 46441049, 498800, 46))
+ countryList.add(Country("Uganda", 45711874, 199810, 16))
+ countryList.add(Country("Argentina", 45101781, 2736690, 32))
+ countryList.add(Country("Ukraine", 43795220, 579320, 41))
+ countryList.add(Country("Algeria", 42679018, 2381740, 29))
+ countryList.add(Country("Sudan", 42514094, 1765048, 20))
+ countryList.add(Country("Iraq", 40412299, 434320, 20))
+ countryList.add(Country("Poland", 38028278, 306230, 42))
+ countryList.add(Country("Canada", 37279811, 9093510, 41))
+ countryList.add(Country("Afghanistan", 37209007, 652860, 19))
+ countryList.add(Country("Morocco", 36635156, 446300, 30))
+ countryList.add(Country("Saudi Arabia", 34140662, 2149690, 32))
+ countryList.add(Country("Peru", 32933835, 1280000, 29))
+ countryList.add(Country("Uzbekistan", 32807368, 425400, 28))
+ countryList.add(Country("Venezuela", 32779868, 882050, 29))
+ countryList.add(Country("Malaysia", 32454455, 328550, 30))
+ countryList.add(Country("Angola", 31787566, 1246700, 17))
+ countryList.add(Country("Mozambique", 31408823, 786380, 18))
+ countryList.add(Country("Ghana", 30096970, 227540, 21))
+ countryList.add(Country("Nepal", 29942018, 143350, 25))
+ countryList.add(Country("Yemen", 29579986, 527970, 20))
+ countryList.add(Country("Madagascar", 26969642, 581795, 20))
+ countryList.add(Country("North Korea", 25727408, 120410, 35))
+ countryList.add(Country("Cote d'Ivoire", 25531083, 318000, 19))
+ countryList.add(Country("Cameroon", 25312993, 472710, 19))
+ countryList.add(Country("Australia", 25088636, 7682300, 38))
+ countryList.add(Country("Taiwan", 23758247, 35410, 42))
+ countryList.add(Country("Niger", 23176691, 1266700, 15))
+ countryList.add(Country("Sri Lanka", 21018859, 62710, 34))
+ countryList.add(Country("Burkina Faso", 20321560, 273600, 18))
+ countryList.add(Country("Malawi", 19718743, 94280, 18))
+ countryList.add(Country("Mali", 19689140, 1220190, 16))
+ countryList.add(Country("Romania", 19483360, 230170, 43))
+ countryList.add(Country("Kazakhstan", 18592970, 2699700, 31))
+ countryList.add(Country("Syria", 18499181, 183630, 22))
+ countryList.add(Country("Chile", 18336653, 743532, 35))
+ countryList.add(Country("Zambia", 18137369, 743390, 18))
+ countryList.add(Country("Guatemala", 17577842, 107160, 23))
+ countryList.add(Country("Zimbabwe", 17297495, 386850, 20))
+ countryList.add(Country("Netherlands", 17132908, 33720, 43))
+ countryList.add(Country("Ecuador", 17100444, 248360, 28))
+ countryList.add(Country("Senegal", 16743859, 192530, 19))
+ countryList.add(Country("Cambodia", 16482646, 176520, 26))
+ countryList.add(Country("Chad", 15814345, 1259200, 17))
+ countryList.add(Country("Somalia", 15636171, 627340, 17))
+ countryList.add(Country("Guinea", 13398180, 245720, 19))
+ countryList.add(Country("South Sudan", 13263184, 610952, 19))
+ countryList.add(Country("Rwanda", 12794412, 24670, 20))
+ countryList.add(Country("Benin", 11801595, 112760, 19))
+ countryList.add(Country("Tunisia", 11783168, 155360, 33))
+ countryList.add(Country("Burundi", 11575964, 25680, 18))
+ countryList.add(Country("Belgium", 11562784, 30280, 42))
+ countryList.add(Country("Cuba", 11492046, 106440, 43))
+ countryList.add(Country("Bolivia", 11379861, 1083300, 25))
+ countryList.add(Country("Haiti", 11242856, 27560, 24))
+ countryList.add(Country("Greece", 11124603, 128900, 45))
+ countryList.add(Country("Dominican Republic", 10996774, 48320, 28))
+ countryList.add(Country("Czech Republic", 10630589, 77240, 43))
+ countryList.add(Country("Portugal", 10254666, 91590, 46))
+ countryList.add(Country("Jordan", 10069794, 88780, 23))
+ countryList.add(Country("Sweden", 10053135, 410340, 41))
+ countryList.add(Country("Azerbaijan", 10014575, 82658, 32))
+ countryList.add(Country("United Arab Emirates", 9682088, 83600, 34))
+ countryList.add(Country("Hungary", 9655361, 90530, 43))
+ countryList.add(Country("Honduras", 9568688, 111890, 25))
+ countryList.add(Country("Belarus", 9433874, 202910, 40))
+ countryList.add(Country("Tajikistan", 9292000, 139960, 23))
+ countryList.add(Country("Austria", 8766201, 82409, 44))
+ countryList.add(Country("Serbia", 8733407, 87460, 41))
+ countryList.add(Country("Switzerland", 8608259, 39516, 43))
+ countryList.add(Country("Papua New Guinea", 8586525, 452860, 23))
+ countryList.add(Country("Israel", 8583916, 21640, 31))
+ countryList.add(Country("Togo", 8186384, 54390, 19))
+ countryList.add(Country("Sierra Leone", 7883123, 72180, 19))
+ countryList.add(Country("Hong Kong", 7490776, 1050, 45))
+ countryList.add(Country("Laos", 7064242, 230800, 24))
+ countryList.add(Country("Bulgaria", 6988739, 108560, 45))
+ countryList.add(Country("Paraguay", 6981981, 397300, 27))
+ countryList.add(Country("Libya", 6569864, 1759540, 29))
+ countryList.add(Country("El Salvador", 6445405, 20720, 28))
+ countryList.add(Country("Nicaragua", 6351157, 120340, 27))
+ countryList.add(Country("Kyrgyzstan", 6218616, 191800, 26))
+ countryList.add(Country("Lebanon", 6065922, 10230, 31))
+ countryList.add(Country("Turkmenistan", 5942561, 469930, 27))
+ countryList.add(Country("Singapore", 5868104, 700, 42))
+ countryList.add(Country("Denmark", 5775224, 42430, 42))
+ countryList.add(Country("Finland", 5561389, 303890, 43))
+ countryList.add(Country("Congo", 5542197, 341500, 19))
+ countryList.add(Country("Slovakia", 5450987, 48088, 41))
+ countryList.add(Country("Norway", 5400916, 365268, 40))
+ countryList.add(Country("Eritrea", 5309659, 101000, 19))
+ countryList.add(Country("State of Palestine", 5186790, 6020, 20))
+ countryList.add(Country("Oman", 5001875, 309500, 31))
+ countryList.add(Country("Costa Rica", 4999384, 51060, 34))
+ countryList.add(Country("Liberia", 4977720, 96320, 19))
+ countryList.add(Country("Ireland", 4847139, 68890, 39))
+ countryList.add(Country("Central African Republic", 4825711, 622980, 18))
+ countryList.add(Country("New Zealand", 4792409, 263310, 38))
+ countryList.add(Country("Mauritania", 4661149, 1030700, 20))
+ countryList.add(Country("Kuwait", 4248974, 17820, 34))
+ countryList.add(Country("Panama", 4226197, 74340, 30))
+ countryList.add(Country("Croatia", 4140148, 55960, 44))
+ countryList.add(Country("Moldova", 4029750, 32850, 38))
+ countryList.add(Country("Georgia", 3904204, 69490, 39))
+ countryList.add(Country("Puerto Rico", 3654978, 8870, 38))
+ countryList.add(Country("Bosnia & Herzegovina", 3501774, 51000, 42))
+ countryList.add(Country("Uruguay", 3482156, 175020, 36))
+ countryList.add(Country("Mongolia", 3166244, 1553560, 29))
+ countryList.add(Country("Albania", 2938428, 27400, 38))
+ countryList.add(Country("Armenia", 2936706, 28470, 36))
+ countryList.add(Country("Jamaica", 2906339, 10830, 31))
+ countryList.add(Country("Lithuania", 2864459, 62674, 43))
+ countryList.add(Country("Qatar", 2743901, 11610, 32))
+ countryList.add(Country("Namibia", 2641996, 823290, 22))
+ countryList.add(Country("Botswana", 2374636, 566730, 26))
+ countryList.add(Country("Lesotho", 2292682, 30360, 22))
+ countryList.add(Country("Gambia", 2228075, 10120, 18))
+ countryList.add(Country("Gabon", 2109099, 257670, 23))
+ countryList.add(Country("TFYR Macedonia", 2086720, 25220, 39))
+ countryList.add(Country("Slovenia", 2081900, 20140, 45))
+ countryList.add(Country("Guinea-Bissau", 1953723, 28120, 19))
+ countryList.add(Country("Latvia", 1911108, 62200, 44))
+ countryList.add(Country("Bahrain", 1637896, 760, 32))
+ countryList.add(Country("Swaziland", 1415414, 17200, 21))
+ countryList.add(Country("Trinidad and Tobago", 1375443, 5130, 36))
+ countryList.add(Country("Equatorial Guinea", 1360104, 28050, 22))
+ countryList.add(Country("Timor-Leste", 1352360, 14870, 18))
+ countryList.add(Country("Estonia", 1303798, 42390, 43))
+ countryList.add(Country("Mauritius", 1271368, 2030, 37))
+ countryList.add(Country("Cyprus", 1198427, 9240, 37))
+ countryList.add(Country("Djibouti", 985690, 23180, 25))
+ countryList.add(Country("Fiji", 918757, 18270, 29))
+ countryList.add(Country("Reunion", 889918, 2500, 36))
+ countryList.add(Country("Comoros", 850910, 1861, 20))
+ countryList.add(Country("Bhutan", 826229, 38117, 29))
+ countryList.add(Country("Guyana", 786508, 196850, 26))
+ countryList.add(Country("Macao", 642090, 30, 39))
+ countryList.add(Country("Solomon Islands", 635254, 27990, 21))
+ countryList.add(Country("Montenegro", 629355, 13450, 39))
+ countryList.add(Country("Luxembourg", 596992, 2590, 40))
+ countryList.add(Country("Western Sahara", 582478, 266000, 28))
+ countryList.add(Country("Suriname", 573085, 156000, 30))
+ countryList.add(Country("Cabo Verde", 560349, 4030, 26))
+ countryList.add(Country("Maldives", 451738, 300, 31))
+ countryList.add(Country("Guadeloupe", 448798, 1690, 43))
+ countryList.add(Country("Brunei", 439336, 5270, 32))
+ countryList.add(Country("Malta", 433245, 320, 42))
+ countryList.add(Country("Bahamas", 403095, 10010, 34))
+ countryList.add(Country("Belize", 390231, 22810, 25))
+ countryList.add(Country("Martinique", 385320, 1060, 46))
+ countryList.add(Country("Iceland", 340566, 100250, 37))
+ countryList.add(Country("French Guiana", 296847, 82200, 25))
+ countryList.add(Country("French Polynesia", 288506, 3660, 33))
+ countryList.add(Country("Vanuatu", 288017, 12190, 23))
+ countryList.add(Country("Barbados", 287010, 430, 40))
+ countryList.add(Country("New Caledonia", 283376, 18280, 33))
+ countryList.add(Country("Mayotte", 266380, 375, 20))
+ countryList.add(Country("Sao Tome & Principe", 213379, 960, 19))
+ countryList.add(Country("Samoa", 198909, 2830, 22))
+ countryList.add(Country("Saint Lucia", 180454, 610, 35))
+ countryList.add(Country("Guam", 167245, 540, 31))
+ countryList.add(Country("Channel Islands", 166828, 190, 44))
+ countryList.add(Country("Curacao", 162547, 444, 42))
+ countryList.add(Country("Kiribati", 120428, 810, 23))
+ countryList.add(Country("St. Vincent & Grenadines", 110488, 390, 32))
+ countryList.add(Country("Tonga", 110041, 720, 22))
+ countryList.add(Country("Grenada", 108825, 340, 29))
+ countryList.add(Country("Micronesia", 106983, 700, 23))
+ countryList.add(Country("Aruba", 106053, 180, 41))
+ countryList.add(Country("U.S. Virgin Islands", 104909, 350, 42))
+ countryList.add(Country("Antigua and Barbuda", 104084, 440, 32))
+ countryList.add(Country("Seychelles", 95702, 460, 36))
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/jakeesveld/java_countries/JavaCountriesApplication.kt b/src/main/kotlin/com/jakeesveld/java_countries/JavaCountriesApplication.kt
new file mode 100644
index 00000000..3632be6b
--- /dev/null
+++ b/src/main/kotlin/com/jakeesveld/java_countries/JavaCountriesApplication.kt
@@ -0,0 +1,13 @@
+package com.jakeesveld.java_countries
+
+import org.springframework.boot.autoconfigure.SpringBootApplication
+import org.springframework.boot.runApplication
+
+@SpringBootApplication
+class JavaCountriesApplication
+
+public var countryList: CountryList = CountryList()
+
+fun main(args: Array) {
+ runApplication(*args)
+}
diff --git a/src/main/kotlin/com/jakeesveld/java_countries/Models.kt b/src/main/kotlin/com/jakeesveld/java_countries/Models.kt
new file mode 100644
index 00000000..8248b37a
--- /dev/null
+++ b/src/main/kotlin/com/jakeesveld/java_countries/Models.kt
@@ -0,0 +1,8 @@
+package com.jakeesveld.java_countries
+
+class Country(val name: String,val population: Long, val landMass: Long, val medianAge: Long){
+ override fun toString(): String {
+ return "Country(name='$name', population=$population, landMass=$landMass, medianAge=$medianAge)"
+ }
+}
+
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
new file mode 100644
index 00000000..8f593ca1
--- /dev/null
+++ b/src/main/resources/application.properties
@@ -0,0 +1 @@
+server.port=${PORT:2020}
diff --git a/src/test/kotlin/com/jakeesveld/java_countries/JavaCountriesApplicationTests.kt b/src/test/kotlin/com/jakeesveld/java_countries/JavaCountriesApplicationTests.kt
new file mode 100644
index 00000000..579123d1
--- /dev/null
+++ b/src/test/kotlin/com/jakeesveld/java_countries/JavaCountriesApplicationTests.kt
@@ -0,0 +1,16 @@
+package com.jakeesveld.java_countries
+
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.springframework.boot.test.context.SpringBootTest
+import org.springframework.test.context.junit4.SpringRunner
+
+@RunWith(SpringRunner::class)
+@SpringBootTest
+class JavaCountriesApplicationTests {
+
+ @Test
+ fun contextLoads() {
+ }
+
+}