From e6d577e30d0e0e362eb6047ef9ffbfb2eb3eac73 Mon Sep 17 00:00:00 2001 From: Sujit Jaunjal Date: Mon, 18 Jul 2022 17:06:07 +0530 Subject: [PATCH 01/26] REST API for Arctic Sea Faroe --- faroe/springrest/springrest/.gitignore | 33 ++ .../springrest/.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 58727 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 + faroe/springrest/springrest/mvnw | 316 ++++++++++++++++++ faroe/springrest/springrest/mvnw.cmd | 188 +++++++++++ faroe/springrest/springrest/pom.xml | 41 +++ .../springrest/SpringrestApplication.java | 14 + .../springrest/controller/APIController.java | 60 ++++ .../faroeREST/springrest/entities/groups.java | 33 ++ .../springrest/settings/SettingsAPI.java | 18 + .../springrest/settings/SettingsAPIImpl.java | 66 ++++ .../src/main/resources/application.properties | 1 + .../SpringrestApplicationTests.java | 13 + pom.xml | 1 + 14 files changed, 786 insertions(+) create mode 100644 faroe/springrest/springrest/.gitignore create mode 100644 faroe/springrest/springrest/.mvn/wrapper/maven-wrapper.jar create mode 100644 faroe/springrest/springrest/.mvn/wrapper/maven-wrapper.properties create mode 100644 faroe/springrest/springrest/mvnw create mode 100644 faroe/springrest/springrest/mvnw.cmd create mode 100644 faroe/springrest/springrest/pom.xml create mode 100644 faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java create mode 100644 faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java create mode 100644 faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/entities/groups.java create mode 100644 faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java create mode 100644 faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java create mode 100644 faroe/springrest/springrest/src/main/resources/application.properties create mode 100644 faroe/springrest/springrest/src/test/java/org/n52/faroeREST/springrest/SpringrestApplicationTests.java diff --git a/faroe/springrest/springrest/.gitignore b/faroe/springrest/springrest/.gitignore new file mode 100644 index 000000000..549e00a2a --- /dev/null +++ b/faroe/springrest/springrest/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/faroe/springrest/springrest/.mvn/wrapper/maven-wrapper.jar b/faroe/springrest/springrest/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..c1dd12f17644411d6e840bd5a10c6ecda0175f18 GIT binary patch literal 58727 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%0ANsA|A3-jj|r`KAo%oTajX3>^E` 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 YM{}PByk10KD_nuQ4E7Du?}+~TKh4V)`~Uy| literal 0 HcmV?d00001 diff --git a/faroe/springrest/springrest/.mvn/wrapper/maven-wrapper.properties b/faroe/springrest/springrest/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 000000000..22f219d25 --- /dev/null +++ b/faroe/springrest/springrest/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.5/apache-maven-3.8.5-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar diff --git a/faroe/springrest/springrest/mvnw b/faroe/springrest/springrest/mvnw new file mode 100644 index 000000000..8a8fb2282 --- /dev/null +++ b/faroe/springrest/springrest/mvnw @@ -0,0 +1,316 @@ +#!/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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven 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 /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/faroe/springrest/springrest/mvnw.cmd b/faroe/springrest/springrest/mvnw.cmd new file mode 100644 index 000000000..1d8ab018e --- /dev/null +++ b/faroe/springrest/springrest/mvnw.cmd @@ -0,0 +1,188 @@ +@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 "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq 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%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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 "%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/faroe/springrest/springrest/pom.xml b/faroe/springrest/springrest/pom.xml new file mode 100644 index 000000000..de7b531fe --- /dev/null +++ b/faroe/springrest/springrest/pom.xml @@ -0,0 +1,41 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.1 + + + org.n52.faroeREST + springrest + 0.0.1-SNAPSHOT + springrest + REST API for Arctic Sea + + 17 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java b/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java new file mode 100644 index 000000000..0f84c998f --- /dev/null +++ b/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java @@ -0,0 +1,14 @@ +package org.n52.faroeREST.springrest; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringrestApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringrestApplication.class, args); + + } + +} diff --git a/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java b/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java new file mode 100644 index 000000000..d6d36f9e6 --- /dev/null +++ b/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java @@ -0,0 +1,60 @@ +package org.n52.faroeREST.springrest.controller; + +import java.util.List; + +import org.n52.faroeREST.springrest.entities.groups; +import org.n52.faroeREST.springrest.settings.SettingsAPI; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class APIController { + + @Autowired + private SettingsAPI API; + + @GetMapping(path = "/groups") + public List getGroup(){ + + return this.API.getGroup(); + + } + + @GetMapping(path = "/groups/{groupTitle}") + public groups getGroupbyTitle(@PathVariable String groupTitle) { + return this.API.getGroupbyTitle(groupTitle); + } + + @PostMapping(path = "/groups", consumes = "application/json") + public groups addGroup(@RequestBody groups group) { + + return this.API.addGroup(group); + + } + + @PutMapping(path = "/groups", consumes = "application/json") + public groups updateGroup(@RequestBody groups group) { + + return this.API.updateGroup(group); + + } + + @DeleteMapping(path = "/groups/{groupTitle}") + public ResponseEntity deleteGroup(@PathVariable String groupTitle){ + try { + this.API.deleteGroup(groupTitle); + return new ResponseEntity<>(HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + } + +} diff --git a/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/entities/groups.java b/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/entities/groups.java new file mode 100644 index 000000000..91b67e46a --- /dev/null +++ b/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/entities/groups.java @@ -0,0 +1,33 @@ +package org.n52.faroeREST.springrest.entities; + +public class groups { + + private String title; + private String description; + public groups(String title, String description) { + super(); + this.title = title; + this.description = description; + } + public groups() { + super(); + // TODO Auto-generated constructor stub + } + public String getTitle() { + return title; + } + public void setTitle(String title) { + this.title = title; + } + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } + @Override + public String toString() { + return "groups [title=" + title + ", description=" + description + "]"; + } + +} diff --git a/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java b/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java new file mode 100644 index 000000000..011ef7455 --- /dev/null +++ b/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java @@ -0,0 +1,18 @@ +package org.n52.faroeREST.springrest.settings; + +import java.util.List; + +import org.n52.faroeREST.springrest.entities.groups; + +public interface SettingsAPI { + + public List getGroup(); + + public groups getGroupbyTitle(String groupTitle); + + public groups addGroup(groups group); + + public groups updateGroup(groups group); + + public groups deleteGroup(String groupTitle); +} diff --git a/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java b/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java new file mode 100644 index 000000000..3972cd973 --- /dev/null +++ b/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java @@ -0,0 +1,66 @@ +package org.n52.faroeREST.springrest.settings; + +import java.util.*; +import java.util.stream.Collectors; + +import org.n52.faroeREST.springrest.entities.groups; +import org.springframework.stereotype.Service; + +@Service +public class SettingsAPIImpl implements SettingsAPI { + + List list; + + public SettingsAPIImpl() { + list=new ArrayList<>(); + list.add(new groups("Desc","This is desc")); + list.add(new groups("Desc2","This is desc2")); + } + + @Override + public List getGroup() { + return list; + } + + @Override + public groups getGroupbyTitle(String groupTitle) { + + groups g=null; + for(groups group : list) { + if(group.getTitle() == groupTitle) { + g=group; + break; + } + } + return g; + + } + + @Override + public groups addGroup(groups group) { + + list.add(group); + + return group; + } + + @Override + public groups updateGroup(groups group) { + + list.forEach(e -> { + if(e.getTitle() == group.getTitle()) { + e.setDescription(group.getDescription()); + } + + }); + + return group; + } + + @Override + public groups deleteGroup(String groupTitle) { + list=this.list.stream().filter(e->e.getTitle()!=groupTitle).collect(Collectors.toList()); + return null; + } + +} diff --git a/faroe/springrest/springrest/src/main/resources/application.properties b/faroe/springrest/springrest/src/main/resources/application.properties new file mode 100644 index 000000000..f620381b5 --- /dev/null +++ b/faroe/springrest/springrest/src/main/resources/application.properties @@ -0,0 +1 @@ +server.port=8090 diff --git a/faroe/springrest/springrest/src/test/java/org/n52/faroeREST/springrest/SpringrestApplicationTests.java b/faroe/springrest/springrest/src/test/java/org/n52/faroeREST/springrest/SpringrestApplicationTests.java new file mode 100644 index 000000000..2c5604f83 --- /dev/null +++ b/faroe/springrest/springrest/src/test/java/org/n52/faroeREST/springrest/SpringrestApplicationTests.java @@ -0,0 +1,13 @@ +package org.n52.faroeREST.springrest; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class SpringrestApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/pom.xml b/pom.xml index 07c7ef7b4..e484546cc 100644 --- a/pom.xml +++ b/pom.xml @@ -152,6 +152,7 @@ 3.17.0 2.13.3 5.8.2 + 2.7.1 4.6.1 2.2 4.4.15 From 489e26c6c929433525ae7248fd6b71385b13547f Mon Sep 17 00:00:00 2001 From: Sujit Jaunjal Date: Fri, 22 Jul 2022 17:19:58 +0530 Subject: [PATCH 02/26] added the dependencies in the faroe-rest.pom file --- NOTICE | 22 +- faroe/pom.xml | 1 + faroe/rest/pom.xml | 74 ++++ .../springrest/SpringrestApplication.java | 29 ++ .../springrest/controller/APIController.java | 61 ++-- .../faroeREST/springrest/entities/Groups.java | 47 +++ .../springrest/settings/SettingsAPI.java | 33 ++ .../springrest/settings/SettingsAPIImpl.java | 81 +++++ .../src/main/resources/application.properties | 0 .../SpringrestApplicationTests.java | 28 ++ faroe/springrest/springrest/.gitignore | 33 -- .../springrest/.mvn/wrapper/maven-wrapper.jar | Bin 58727 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 - faroe/springrest/springrest/mvnw | 316 ------------------ faroe/springrest/springrest/mvnw.cmd | 188 ----------- faroe/springrest/springrest/pom.xml | 41 --- .../springrest/SpringrestApplication.java | 14 - .../faroeREST/springrest/entities/groups.java | 33 -- .../springrest/settings/SettingsAPI.java | 18 - .../springrest/settings/SettingsAPIImpl.java | 66 ---- .../SpringrestApplicationTests.java | 13 - pom.xml | 16 +- 22 files changed, 366 insertions(+), 750 deletions(-) create mode 100644 faroe/rest/pom.xml create mode 100644 faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java rename faroe/{springrest/springrest => rest}/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java (53%) create mode 100644 faroe/rest/src/main/java/org/n52/faroeREST/springrest/entities/Groups.java create mode 100644 faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java create mode 100644 faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java rename faroe/{springrest/springrest => rest}/src/main/resources/application.properties (100%) create mode 100644 faroe/rest/src/test/java/org/n52/faroeREST/springrest/SpringrestApplicationTests.java delete mode 100644 faroe/springrest/springrest/.gitignore delete mode 100644 faroe/springrest/springrest/.mvn/wrapper/maven-wrapper.jar delete mode 100644 faroe/springrest/springrest/.mvn/wrapper/maven-wrapper.properties delete mode 100644 faroe/springrest/springrest/mvnw delete mode 100644 faroe/springrest/springrest/mvnw.cmd delete mode 100644 faroe/springrest/springrest/pom.xml delete mode 100644 faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java delete mode 100644 faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/entities/groups.java delete mode 100644 faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java delete mode 100644 faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java delete mode 100644 faroe/springrest/springrest/src/test/java/org/n52/faroeREST/springrest/SpringrestApplicationTests.java diff --git a/NOTICE b/NOTICE index e99ae3610..0a7c451f7 100644 --- a/NOTICE +++ b/NOTICE @@ -57,6 +57,7 @@ This project includes: Apache Jena - IRI under The Apache Software License, Version 2.0 Apache Jena - Shadowed external libraries under The Apache Software License, Version 2.0 Apache Log4j API under Apache License, Version 2.0 + Apache Log4j to SLF4J Adapter under Apache License, Version 2.0 Apache Thrift under The Apache Software License, Version 2.0 c3p0 under GNU Lesser General Public License, Version 2.1 or Eclipse Public License, Version 1.0 Checker Qual under The MIT License @@ -72,6 +73,7 @@ This project includes: elasticsearch-x-content under Elastic License 2.0 or Server Side Public License, v 1 embedded-elasticsearch under The Apache Software License, Version 2.0 error-prone annotations under Apache 2.0 + faroe-rest under The Apache Software License, Version 2.0 FindBugs-jsr305 under The Apache Software License, Version 2.0 Geographic Common (GCO) schema (version 2012-07-13) under The Apache Software License, Version 2.0 Geographic MetaData (GMD) schema (version 2012-07-13) under The Apache Software License, Version 2.0 @@ -98,10 +100,14 @@ This project includes: J2ObjC Annotations under The Apache Software License, Version 2.0 Jackson dataformat: CBOR under The Apache Software License, Version 2.0 Jackson dataformat: Smile under The Apache Software License, Version 2.0 + Jackson datatype: jdk8 under The Apache Software License, Version 2.0 + Jackson datatype: JSR310 under The Apache Software License, Version 2.0 Jackson-annotations under The Apache Software License, Version 2.0 Jackson-core under The Apache Software License, Version 2.0 jackson-databind under The Apache Software License, Version 2.0 Jackson-dataformat-YAML under The Apache Software License, Version 2.0 + Jackson-module-parameter-names under The Apache Software License, Version 2.0 + Jakarta Annotations API under EPL 2.0 or GPL2 w/ CPE Java archiving library under Apache 2 JavaBeans(TM) Activation Framework under COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 JavaMail API jar under CDDL or GPLv2+CE @@ -112,8 +118,11 @@ This project includes: Joda-Time under Apache License, Version 2.0 JOpt Simple under The MIT License JSONLD Java :: Core under Revised BSD License + JUL to SLF4J bridge under MIT License lang-mustache under Elastic License 2.0 or Server Side Public License, v 1 libphonenumber under The Apache Software License, Version 2.0 + Logback Classic Module under Eclipse Public License - v 1.0 or GNU Lesser General Public License + Logback Core Module under Eclipse Public License - v 1.0 or GNU Lesser General Public License Lucene Common Analyzers under Apache License, Version 2.0 Lucene Grouping under Apache License, Version 2.0 Lucene Highlighter under Apache License, Version 2.0 @@ -137,8 +146,8 @@ This project includes: Netty/Common under Apache License, Version 2.0 Netty/Handler under Apache License, Version 2.0 Netty/Resolver under Apache License, Version 2.0 - Netty/TomcatNative [OpenSSL - Classes] under The Apache Software License, Version 2.0 Netty/Transport under Apache License, Version 2.0 + Netty/Transport/Native/Unix/Common under Apache License, Version 2.0 null under Lesser General Public License, version 3 or greater or Apache Software License, version 2.0 OASIS WS-N specification schemas - including WS-BrokeredNotification (v1.3) under The Apache Software License, Version 2.0 OASIS WS-Resources specification schemas v1.2 under The Apache Software License, Version 2.0 @@ -199,7 +208,18 @@ This project includes: Spring Core under Apache License, Version 2.0 Spring Expression Language (SpEL) under Apache License, Version 2.0 Spring Web under Apache License, Version 2.0 + Spring Web MVC under Apache License, Version 2.0 + spring-boot under Apache License, Version 2.0 + spring-boot-autoconfigure under Apache License, Version 2.0 + spring-boot-starter under Apache License, Version 2.0 + spring-boot-starter-json under Apache License, Version 2.0 + spring-boot-starter-logging under Apache License, Version 2.0 + spring-boot-starter-tomcat under Apache License, Version 2.0 + spring-boot-starter-web under Apache License, Version 2.0 T-Digest under The Apache Software License, Version 2.0 + tomcat-embed-core under Apache License, Version 2.0 + tomcat-embed-el under Apache License, Version 2.0 + tomcat-embed-websocket under Apache License, Version 2.0 W3C SOAP specification recommondation (v1.1) under The Apache Software License, Version 2.0 W3C SOAP specification recommondation (v1.2 part 1) under The Apache Software License, Version 2.0 W3C WS-Addressing specification schemas (v1.0) under The Apache Software License, Version 2.0 diff --git a/faroe/pom.xml b/faroe/pom.xml index 7739dd66d..64c7a2bf6 100644 --- a/faroe/pom.xml +++ b/faroe/pom.xml @@ -32,5 +32,6 @@ core annotations utils + rest diff --git a/faroe/rest/pom.xml b/faroe/rest/pom.xml new file mode 100644 index 000000000..d570327df --- /dev/null +++ b/faroe/rest/pom.xml @@ -0,0 +1,74 @@ + + + + 4.0.0 + + org.n52.arctic-sea + faroe-parent + 9.7.0-SNAPSHOT + + org.n52.arctic-sea + faroe-rest + faroe-rest + REST API for Arctic Sea + + + org.springframework.boot + spring-boot-starter-web + provided + + + org.springframework.boot + spring-boot-starter-test + provided + + + ${project.groupId} + faroe + ${project.version} + provided + + + ${project.groupId} + faroe-json + provided + + + ${project.groupId} + faroe-annotations + provided + + + ${project.groupId} + faroe-utils + provided + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java new file mode 100644 index 000000000..5da61bbba --- /dev/null +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2015-2022 52°North Spatial Information Research GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.n52.faroeREST.springrest; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringrestApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringrestApplication.class, args); + + } + +} diff --git a/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java similarity index 53% rename from faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java rename to faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java index d6d36f9e6..3f2fefee2 100644 --- a/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java @@ -1,8 +1,23 @@ +/* + * Copyright (C) 2015-2022 52°North Spatial Information Research GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.n52.faroeREST.springrest.controller; import java.util.List; -import org.n52.faroeREST.springrest.entities.groups; +import org.n52.faroeREST.springrest.entities.Groups; import org.n52.faroeREST.springrest.settings.SettingsAPI; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -17,44 +32,44 @@ @RestController public class APIController { - + @Autowired - private SettingsAPI API; + private SettingsAPI api; @GetMapping(path = "/groups") - public List getGroup(){ - - return this.API.getGroup(); - + public List getGroup(){ + + return this.api.getGroup(); + } - + @GetMapping(path = "/groups/{groupTitle}") - public groups getGroupbyTitle(@PathVariable String groupTitle) { - return this.API.getGroupbyTitle(groupTitle); + public Groups getGroupbyTitle(@PathVariable String groupTitle) { + return this.api.getGroupbyTitle(groupTitle); } - + @PostMapping(path = "/groups", consumes = "application/json") - public groups addGroup(@RequestBody groups group) { - - return this.API.addGroup(group); - + public Groups addGroup(@RequestBody Groups group) { + + return this.api.addGroup(group); + } - + @PutMapping(path = "/groups", consumes = "application/json") - public groups updateGroup(@RequestBody groups group) { - - return this.API.updateGroup(group); - + public Groups updateGroup(@RequestBody Groups group) { + + return this.api.updateGroup(group); + } - + @DeleteMapping(path = "/groups/{groupTitle}") public ResponseEntity deleteGroup(@PathVariable String groupTitle){ try { - this.API.deleteGroup(groupTitle); + this.api.deleteGroup(groupTitle); return new ResponseEntity<>(HttpStatus.OK); } catch (Exception e) { return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } } - + } diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/entities/Groups.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/entities/Groups.java new file mode 100644 index 000000000..47b547867 --- /dev/null +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/entities/Groups.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2015-2022 52°North Spatial Information Research GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.n52.faroeREST.springrest.entities; + +public class Groups { + + private String title; + private String description; + public Groups(String title, String description) { + super(); + this.title = title; + this.description = description; + } + public Groups() { + super(); + } + public String getTitle() { + return title; + } + public void setTitle(String title) { + this.title = title; + } + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } + @Override + public String toString() { + return "Groups [title=" + title + ", description=" + description + "]"; + } + +} diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java new file mode 100644 index 000000000..485cacde0 --- /dev/null +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2015-2022 52°North Spatial Information Research GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.n52.faroeREST.springrest.settings; + +import java.util.List; + +import org.n52.faroeREST.springrest.entities.Groups; + +public interface SettingsAPI { + + public List getGroup(); + + public Groups getGroupbyTitle(String groupTitle); + + public Groups addGroup(Groups group); + + public Groups updateGroup(Groups group); + + public Groups deleteGroup(String groupTitle); +} diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java new file mode 100644 index 000000000..fa6bf5c16 --- /dev/null +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2015-2022 52°North Spatial Information Research GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.n52.faroeREST.springrest.settings; + +import java.util.*; +import java.util.stream.Collectors; + +import org.n52.faroeREST.springrest.entities.Groups; +import org.springframework.stereotype.Service; + +@Service +public class SettingsAPIImpl implements SettingsAPI { + + List list; + + public SettingsAPIImpl() { + list=new ArrayList<>(); + list.add(new Groups("Desc","This is desc")); + list.add(new Groups("Desc2","This is desc2")); + } + + @Override + public List getGroup() { + return list; + } + + @Override + public Groups getGroupbyTitle(String groupTitle) { + + Groups g=null; + for(Groups group : list) { + if(group.getTitle() == groupTitle) { + g=group; + break; + } + } + return g; + + } + + @Override + public Groups addGroup(Groups group) { + + list.add(group); + + return group; + } + + @Override + public Groups updateGroup(Groups group) { + + list.forEach(e -> { + if(e.getTitle() == group.getTitle()) { + e.setDescription(group.getDescription()); + } + + }); + + return group; + } + + @Override + public Groups deleteGroup(String groupTitle) { + list=this.list.stream().filter(e->e.getTitle()!=groupTitle).collect(Collectors.toList()); + return null; + } + +} diff --git a/faroe/springrest/springrest/src/main/resources/application.properties b/faroe/rest/src/main/resources/application.properties similarity index 100% rename from faroe/springrest/springrest/src/main/resources/application.properties rename to faroe/rest/src/main/resources/application.properties diff --git a/faroe/rest/src/test/java/org/n52/faroeREST/springrest/SpringrestApplicationTests.java b/faroe/rest/src/test/java/org/n52/faroeREST/springrest/SpringrestApplicationTests.java new file mode 100644 index 000000000..7e3719f09 --- /dev/null +++ b/faroe/rest/src/test/java/org/n52/faroeREST/springrest/SpringrestApplicationTests.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2015-2022 52°North Spatial Information Research GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.n52.faroeREST.springrest; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class SpringrestApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/faroe/springrest/springrest/.gitignore b/faroe/springrest/springrest/.gitignore deleted file mode 100644 index 549e00a2a..000000000 --- a/faroe/springrest/springrest/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ diff --git a/faroe/springrest/springrest/.mvn/wrapper/maven-wrapper.jar b/faroe/springrest/springrest/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index c1dd12f17644411d6e840bd5a10c6ecda0175f18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58727 zcmb5W18`>1vNjyPv28mO+cqb*Z6_1kwr$(?#I}=(ZGUs`Jr}3`|DLbDUA3!L?dtC8 zUiH*ktDo+@6r@4HP=SCTA%WmZqm^Ro`Ls)bfPkcdfq?#g1(Fq27W^S8Cq^$TC?_c< zs-#ROD;6C)1wFuk7<3)nGuR^#!H;n&3*IjzXg+s8Z_S!!E0jUq(`}Itt=YdYa5Z_s z&e>2={87knpF*PKNzU;lsbk#P(l^WBvb$yEz)z+nYH43pKodrDkMp@h?;n{;K}hl>Fb^ zqx}C0|D7kg|Cj~3f7hn_zkAE}|6t|cZT|S5Hvb#3nc~C14u5UI{6#F<|FkJ0svs&S zA}S{=DXLT*BM1$`2rK%`D@vEw9l9%*=92X_2g?Fwfi=6Zfpr7+<~sgP#Bav+Df2ts zwtu~70zhqV?mrzM)}r7mMS`Hk_)NrI5K%CTtQtDxqw5iv5F0!ksIon{qqpPVnU?ds zN$|Vm{MHKEReUy>1kVfT-$3))Js0p2W_LFy3cjjZ7za0R zPdBH>y&pb0vr1|ckDpt2p$IQhwnPs5G*^b-y}sg4W!ALn}a`pY0JIa$H0$eV2T8WjWD= zWaENacQhlTyK4O!+aOXBurVR2k$eb8HVTCxy-bcHlZ4Xr!`juLAL#?t6|Ba!g9G4I zSwIt2Lla>C?C4wAZ8cKsZl9-Yd3kqE`%!5HlGdJJaFw0mu#--&**L-i|BcIdc3B$;0FC;FbE-dunVZ; zdIQ=tPKH4iJQQ=$5BeEMLov_Hn>gXib|9nOr}>eZt@B4W^m~>Zp#xhn1dax+?hS!AchWJ4makWZs@dQUeXQ zsI2+425_{X@t2KN zIbqec#)Jg5==VY3^YBeJ2B+%~^Y8|;F!mE8d(`UgNl2B9o>Ir5)qbBr)a?f%nrP zQyW(>FYPZjCVKDOU;Bw#PqPF1CCvp)dGdA&57a5hD&*vIc)jA)Z-!y5pS{5W6%#prH16zgD8s zexvpF#a|=*acp>L^lZ(PT)GiA8BJL-9!r8S$ZvXRKMVtiGe`+!@O%j<1!@msc177U zTDy>WOZu)W5anPrweQyjIu3IJC|ngdjZofGbdW&oj^DJlC7$;|xafB45evT|WBgGf-b|9y0J`fe0W-vw6xh}` z=(Tnq(-K0O{;VUcKe2y63{HXc+`R_#HLwnZ0rzWO*b#VeSuC4NG!H_ApCypbt1qx( z6y7Q$5(JOpQ&pTkc^0f}A0Kq*?;g9lEfzeE?5e2MBNZB)^8W1)YgdjsVyN+I9EZlh z3l}*}*)cFl=dOq|DvF=!ui$V%XhGQ%bDn3PK9 zV%{Y|VkAdt^d9~y4laGDqSwLd@pOnS&^@sI7}YTIb@El1&^_sq+{yAGf0|rq5TMp# z6d~;uAZ(fY3(eH=+rcbItl2=u6mf|P{lD4kiRCv;>GtFaHR3gim?WU9RjHmFZLm+m z+j<}_exaOQ1a}=K#voc~En+Mk_<(L!?1e#Uay~|H5q)LjD*yE6xFYQ-Wx{^iH1@pP zC0De#D6I26&W{;J40sZB!=%{c?XdO?YQvnTMA3TwfhAm@bvkX*(x?JTs*dFDv^=2X z284}AK)1nRn+8(Q2P?f)e>0~;NUI9%p%fnv1wBVpoXL+9OE`Vv1Y7=+nub$o7AN>y zB?R(^G8PYcMk4bxe7XItq@48QqWKb8fa*i9-N)=wdU-Q^=}!nFgTr_uT=Z=9pq z`{7!$U|+fnXFcsJ4GNm3JQQCN+G85k$)ZLhF{NbIy{REj84}Zt;0fe#>MARW)AoSb zrBpwF37ZVBMd>wZn_hAadI*xu8)Y#`aMbwRIA2n^-OS~M58_@j?#P1|PXJ1XBC9{4 zT^8*|xu<@(JlSOT*ILrVGr+7$nZN`Z3GxJJO@nY&mHsv^^duAh*lCu5q+S6zWA+`- z%^*y#)O7ko_RwGJl;bcEpP03FOrhlLWs`V_OUCrR-g>NJz*pN|itmN6O@Hw05Zq;Xtif%+sp4Py0{<7<^c zeoHHhRq>2EtYy9~2dZywm&OSk`u2ECWh6dJY?;fT-3-$U`!c(o$&hhPC%$~fT&bw3 zyj+8aXD;G!p*>BC6rpvx#6!|Qaic;KEv5>`Y+R(6F^1eIeYG6d1q3D3OL{7%7iw3R zwO)W7gMh27ASSB>-=OfP(YrKqBTNFv4hL@Im~~ombbSu44p~VoH$H-6+L_JW>Amkl zhDU~|r77?raaxD!-c$Ta?WAAi{w3T}YV=+S?1HQGC0+{Bny_^b+4Jum}oW4c=$ z#?D<}Ds{#d5v`L`${Pee;W84X*osNQ96xsKp^EAzuUh9#&zDX=eqdAp$UY)EGrkU% z(6m35n=46B$TNnejNSlih_!<)Iu@K!PW5S@Ya^0OK+EMWM=1w=GUKW^(r59U%i?d zzbo?|V4tDWGHHsrAQ}}ma#<`9r=M8%XF#%a=@Hn(p3wFBlkZ2L@8=*@J-^zuyF0aN zzJ7f!Jf8I+^6Tt$e+IIh zb80@?7y#Iz3w-0VEjgbHurqI>$qj<@n916)&O340!_5W9DtwR)P5mk6v2ljyK*DG5 zYjzE~m`>tq8HYXl%1JJ%e-%BqV4kRdPUZB1Cm$BQZr(fzp_@rn_W+;GwI$?L2Y4;b z)}c5D$#LT}2W8Si<`EHKIa_X+>+2PF(C*u~F=8E!jL(=IdQxY40%|( zoNg2Z&Aob@LEui-lJ#@)Ts)tE0_!*3{Uk)r{;-IZpX`N4mZX`#E|A;viQWImB6flI z?M_|xHCXV$5LOY-!U1_O1k;OWa=EchwlDCK4xHwBW2jE-6&%}og+9NILu${v10Z^Z#* zap|)B9a-AMU~>$r)3&|dQuP#MA$jnw54w*Ax~*_$iikp+j^OR8I5Fo<_UR#B-c>$? zeg)=;w^sGeAMi<3RGDRj$jA30Qq$e|zf2z;JyQ}tkU)ZI_k6tY%(`#AvL)p)iYXUy z5W9Su3NJ8mVyy)WqzFSk&vZM!;kUh8dVeA-myqcV%;xUne`PbHCPpvH?br`U2Y&dM zV!nJ!^n%`!H&!QSlpzLWnZpgi;#P0OAleH+<CfLa?&o|kyw1}W%6Pij zp$Vv5=;Z0LFN|j9i&9>zqX>*VnV3h#>n!2L?5gO6HJS3~kpy5G zYAVPMaB-FJOk3@OrxL(*-O~OB9^d{!G0K>wlzXuBm*$&%p1O#6SQ*?Q0CETLQ->XpfkW7< zj&Nep(}eAH1u$wWFvLV*lA{JOltP_%xKXC*a8DB&;{fD&2bATy>rC^kFY+$hFS7us;Y) zy_H?cv9XTHYz<4C<0b`WKC#{nJ15{F=oaq3x5}sYApT?Po+(Cmmo#dHZFO^{M#d~d znRT=TFATGVO%z_FNG-@G;9az|udZ>t@5l+A-K)BUWFn_|T#K3=d3EXRNqHyi#>;hX z*JQ`pT3#&tH>25laFlL6Rllu(seA*OboEd%rxMtz3@5v-+{qDP9&BcoS$2fgjgvp$ zc8!3=p0p@Ee1$u{Gg}Kkxg@M*qgZfYLlnD88{uwG1T?zxCbBR+x(RK$JB(eWJH#~; zZoY6L+esVRV?-*QmRCG}h`rB*Lv=uE%URF@+#l-g!Artx>Y9D;&G=jY2n2`J z{6-J%WX~Glx*QBmOOJ(RDRIzhfk&ibsm1t&&7aU{1P3U0uM%F2zJb4~50uby_ng+# zN)O9lK=dkJpxsUo7u8|e`Y~mmbxOTDn0i!i;d;ml#orN(Lc=j+n422NoSnlH6?0<0?th-qB7u}`5My%#?ES}>@RldOQz}WILz<$+cN~&ET zwUI01HCB((TyU$Ej8bxsE8oLmT-c7gA1Js?Iq`QMzIHV|)v)n2 zT_L(9x5%8*wU(C`VapaHoicWcm|0X@9TiNtbc|<4N6_H1F6&qgEEj=vjegFt;hC7- zLG7_=vedRFZ6Chbw!{#EpAlM?-sc#pc<~j#537n)M%RT)|L}y(ggi_-SLpsE3qi3V z=EEASxc>a{Su)jXcRS41Z@Mxk&0B7B<(?Izt5wpyyIBO|-M}ex8BhbIgi*X4 zDZ+Yk1<6&=PoZ=U-!9`!?sBVpYF#Y!JK<`fx}bXN651o0VVaW;t6ASVF@gq-mIDV_)?F^>rq1XX0NYy~(G=I6x%Fi5C2rMtvs z%P`g2>0{xLUy~#ye)%QAz^NkD5GUyPYl}K#;e-~UQ96`I$U0D!sMdQ>;%+c0h>k*Y z)sD1mi_@|rZnQ+zbWq~QxFlBQXj8WEY7NKaOYjUxAkGB8S#;l@b^C?;twRKl=mt0< zazifrBs`(q7_r14u1ZS`66VmsLpV>b5U!ktX>g4Nq~VPq6`%`3iCdr(>nS~uxxylU z>h(2p$XPJVh9BDpRLLzTDlNdp+oq8sOUlJ#{6boG`k)bwnsw5iy@#d{f_De-I|}vx6evw;ch97=;kLvM)-DBGwl6%fA%JItoMeyqjCR*_5Q70yd!KN zh=>ek8>f#~^6CJR0DXp0;7ifZjjSGBn}Cl{HeX!$iXMbtAU$F+;`%A<3TqbN#PCM& z&ueq$cB%pu2oMm_-@*aYzgn9`OiT@2ter*d+-$Aw42(@2Ng4mKG%M-IqX?q%3R|_( zN|&n$e1L#Ev=YMX5F53!O%))qDG3D(0rsOHblk;9ghWyqEOpg)mC$OduqpHAuIxr_>*|zy+|=EmOFn zFM+Ni%@CymLS-3vRWn=rVk?oZEz0V#y356IE6HR5#>7EigxZ05=cA|4<_tC8jyBJ| zgg!^kNwP7S^ooIj6riI9x`jFeQfRr4JCPumr<82M zto$j^Qb~MPmJ-|*2u{o7?yI8BI``zDaOCg2tG_5X;w<|uj5%oDthnLx-l4l)fmUGx z6N^jR|DC);yLi4q-ztTkf>*U$@2^w5(lhxu=OC|=WuTTp^!?2Nn27R`2FY_ zLHY-zFS}r+4|XyZw9b0D3)DmS!Gr+-LSdI}m{@-gL%^8CFSIYL?UZaCVd)2VI3|ay zwue39zshVrB+s2lp*};!gm<79@0HkjhgF^>`UhoR9Mi`aI#V#fI@x&1K3f&^8kaq% zkHVg$CTBoaGqEjrL)k*Y!rtiD2iQLYZ%|B}oBl8GHvR%n>HiIQN*+$mCN>I=c7H2N z&K4$4e@E^ff-cVHCbrHNMh4Dy|2Q;M{{xu|DYjeaRh2FK5QK!bG_K`kbBk$l$S4UF zq?F-%7UrX_Q?9M)a#WvcZ^R-fzJB5IFP>3uEoeCAAhN5W-ELRB&zsCnWY6#E?!)E56Pe+bxHjGF6;R9Hps)+t092-bf4 z_Wieg+0u5JL++k)#i0r?l`9*k)3ZlHOeMJ1DTdx9E1J2@BtdD3qX;&S_wMExOGv$T zl^T%oxb+)vq6vJvR`8{+YOsc@8}wSXpoK%v0k@8X*04Se3<8f)rE|fRXAoT!$6MdrKSuzeK@L*yug?MQs8oTbofqW)Df# zC2J3irHAaX_e~SGlBoRhEW`W6Z}&YX|5IMfzskAt{B*m z*w=3i!;x5Gfgc~>y9fPXFAPMhO@Si}SQESjh`P|dlV5HPRo7j(hV=$o8UMIT7~7+k z*@Sd>f%#{ARweJYhQs~ECpHie!~YXL|FJA;KS4m|CKFnT{fN`Ws>N?CcV@(>7WMPYN} z1}Wg+XU2(Yjpq7PJ|aSn;THEZ{4s8*@N!dz&bjys_Zk7%HiD+56;cF26`-a zEIo!B(T|L*uMXUvqJs&54`^@sUMtH-i~rOM9%$xGXTpmow$DxI>E5!csP zAHe|);0w%`I<==_Zw9t$e}?R+lIu%|`coRum(1p~*+20mBc?Z=$+z<0n&qS0-}|L4 zrgq|(U*eB%l3nfC=U1Y?(Tf@0x8bhdtsU2w&Y-WvyzkiyJ>GZqUP6c+<_p0`ZOnIK z#a~ynuzRWxO6c;S@*}B1pTjLJQHi(+EuE2;gG*p^Fq%6UoE1x95(^BY$H$$soSf=vpJ)_3E zp&$l=SiNaeoNLAK8x%XaHp3-So@F7 z3NMRRa@%k+Z$a%yb25ud&>Cdcb<+}n>=jZ`91)a z{wcA(j$%z#RoyB|&Z+B4%7Pe*No`pAX0Y;Ju4$wvJE{VF*Qej8C}uVF=xFpG^rY6Y+9mcz$T9^x(VP3uY>G3Zt&eU{pF*Bu<4j9MPbi4NMC=Z$kS6DMW9yN#vhM&1gd1t}8m(*YY9 zh2@s)$1p4yYT`~lYmU>>wKu+DhlnI1#Xn4(Rnv_qidPQHW=w3ZU!w3(@jO*f;4;h? zMH0!08(4=lT}#QA=eR(ZtW1=~llQij7)L6n#?5iY_p>|_mLalXYRH!x#Y?KHyzPB^ z6P3YRD}{ou%9T%|nOpP_??P;Rmra7$Q*Jz-f?42PF_y>d)+0Q^)o5h8@7S=je}xG# z2_?AdFP^t{IZHWK)9+EE_aPtTBahhUcWIQ7Awz?NK)ck2n-a$gplnd4OKbJ;;tvIu zH4vAexlK2f22gTALq5PZ&vfFqqERVT{G_d`X)eGI%+?5k6lRiHoo*Vc?ie6dx75_t z6hmd#0?OB9*OKD7A~P$e-TTv3^aCdZys6@`vq%Vi_D8>=`t&q9`Jn1=M#ktSC>SO3 z1V?vuIlQs6+{aHDHL?BB&3baSv;y#07}(xll9vs9K_vs2f9gC9Biy+9DxS77=)c z6dMbuokO-L*Te5JUSO$MmhIuFJRGR&9cDf)@y5OQu&Q$h@SW-yU&XQd9;_x;l z<`{S&Hnl!5U@%I~5p)BZspK894y7kVQE7&?t7Z|OOlnrCkvEf7$J5dR?0;Jt6oANc zMnb_Xjky|2ID#fhIB2hs-48Er>*M?56YFnjC)ixiCes%fgT?C|1tQupZ0Jon>yr|j z6M66rC(=;vw^orAMk!I1z|k}1Ox9qOILGJFxU*ZrMSfCe?)wByP=U73z+@Pfbcndc=VzYvSUnUy z+-B+_n`=f>kS8QBPwk+aD()=#IqkdxHPQMJ93{JGhP=48oRkmJyQ@i$pk(L&(p6<0 zC9ZEdO*i+t`;%(Ctae(SjV<@i%r5aune9)T4{hdzv33Uo9*K=V18S$6VVm^wgEteF za0zCLO(9~!U9_z@Qrh&rS|L0xG}RWoE1jXiEsrTgIF4qf#{0rl zE}|NGrvYLMtoORV&FWaFadDNCjMt|U8ba8|z&3tvd)s7KQ!Od*Kqe(48&C7=V;?`SQV)Qc?6L^k_vNUPbJ>>!5J?sDYm5kR&h_RZk)MfZ1 znOpQ|T;Me(%mdBJR$sbEmp3!HKDDSmMDnVpeo{S13l#9e6OImR$UPzjd-eCwmMwyT zm5~g6DIbY<_!8;xEUHdT(r_OQ<6QCE9Jy|QLoS>d(B zW6GRzX)~&Mx}})ITysFzl5_6JM*~ciBfVP(WF_r zY>z4gw&AxB%UV3Y{Y6z*t*o!p@~#u3X_t{Q9Us8ar8_9?N% zN&M~6y%2R(mAZ~@Tg1Oapt?vDr&fHuJ=V$wXstq|)eIG_4lB#@eU>fniJh zwJY<8yH5(+SSQ=$Y=-$2f$@^Ak#~kaR^NYFsi{XGlFCvK(eu{S$J(owIv17|p-%0O zL-@NyUg!rx0$Uh~JIeMX6JJE>*t<7vS9ev#^{AGyc;uio_-Je1?u#mA8+JVczhA2( zhD!koe;9$`Qgaxlcly4rdQ1VlmEHUhHe9TwduB+hm3wH2o27edh?|vrY{=;1Doy4& zIhP)IDd91@{`QQqVya(ASth4}6OY z-9BQj2d-%+-N7jO8!$QPq%o$9Fy8ja{4WT$gRP+b=Q1I48g-g|iLNjbhYtoNiR*d- z{sB}~8j*6*C3eM8JQj5Jn?mD#Gd*CrVEIDicLJ-4gBqUwLA-bp58UXko;M|ql+i5` zym-&U5BIS9@iPg#fFbuXCHrprSQKRU0#@yd%qrX1hhs*85R}~hahfFDq=e@bX))mf zWH%mXxMx|h5YhrTy;P_Xi_IDH*m6TYv>|hPX*_-XTW0G9iu!PqonQneKKaCVvvF^% zgBMDpN7!N?|G5t`v{neLaCFB{OyIl>qJQ_^0MJXQ zY2%-si~ej?F^%ytIIHU(pqT+3d+|IQ{ss#!c91R{2l*00e3ry!ha|XIsR%!q=E^Fal`6Oxu`K0fmPM?P6ZgzH7|TVQhl;l2 z)2w0L9CsN-(adU5YsuUw19OY_X69-!=7MIJ^(rUNr@#9l6aB8isAL^M{n2oD0FAHk97;X* z-INjZ5li`a|NYNt9gL2WbKT!`?%?lB^)J)9|025nBcBtEmWBRXQwi21EGg8>!tU>6Wf}S3p!>7vHNFSQR zgC>pb^&OHhRQD~7Q|gh5lV)F6i++k4Hp_F2L2WrcxH&@wK}QgVDg+y~o0gZ=$j&^W zz1aP8*cvnEJ#ffCK!Kz{K>yYW`@fc8ByF9X4XmyIv+h!?4&$YKl*~`ToalM{=Z_#^ zUs<1Do+PA*XaH;&0GW^tDjrctWKPmCF-qo7jGL)MK=XP*vt@O4wN1Y!8o`{DN|Rh) znK?nvyU&`ATc@U*l}=@+D*@l^gYOj&6SE|$n{UvyPwaiRQ_ua2?{Vfa|E~uqV$BhH z^QNqA*9F@*1dA`FLbnq;=+9KC@9Mel*>6i_@oVab95LHpTE)*t@BS>}tZ#9A^X7nP z3mIo+6TpvS$peMe@&=g5EQF9Mi9*W@Q`sYs=% z`J{3llzn$q;2G1{N!-#oTfQDY`8>C|n=Fu=iTk443Ld>>^fIr4-!R3U5_^ftd>VU> zij_ix{`V$I#k6!Oy2-z#QFSZkEPrXWsYyFURAo`Kl$LkN>@A?_);LE0rZIkmjb6T$ zvhc#L-Cv^4Ex*AIo=KQn!)A4;7K`pu-E+atrm@Cpmpl3e>)t(yo4gGOX18pL#xceU zbVB`#5_@(k{4LAygT1m#@(7*7f5zqB)HWH#TCrVLd9}j6Q>?p7HX{avFSb?Msb>Jg z9Q9DChze~0Psl!h0E6mcWh?ky! z$p#@LxUe(TR5sW2tMb#pS1ng@>w3o|r~-o4m&00p$wiWQ5Sh-vx2cv5nemM~Fl1Pn z@3ALEM#_3h4-XQ&z$#6X&r~U-&ge+HK6$)-`hqPj0tb|+kaKy*LS5@a9aSk!=WAEB z7cI`gaUSauMkEbg?nl0$44TYIwTngwzvUu0v0_OhpV;%$5Qgg&)WZm^FN=PNstTzW z5<}$*L;zrw>a$bG5r`q?DRc%V$RwwnGIe?m&(9mClc}9i#aHUKPLdt96(pMxt5u`F zsVoku+IC|TC;_C5rEU!}Gu*`2zKnDQ`WtOc3i#v}_9p>fW{L4(`pY;?uq z$`&LvOMMbLsPDYP*x|AVrmCRaI$UB?QoO(7mlBcHC};gA=!meK)IsI~PL0y1&{Dfm6! zxIajDc1$a0s>QG%WID%>A#`iA+J8HaAGsH z+1JH=+eX5F(AjmZGk|`7}Gpl#jvD6_Z!&{*kn@WkECV-~Ja@tmSR|e_L@9?N9 z3hyyry*D0!XyQh_V=8-SnJco#P{XBd1+7<5S3FA)2dFlkJY!1OO&M7z9uO?$#hp8K z><}uQS-^-B;u7Z^QD!7#V;QFmx0m%{^xtl3ZvPyZdi;^O&c;sNC4CHxzvvOB8&uHl zBN;-lu+P=jNn`2k$=vE0JzL{v67psMe_cb$LsmVfxA?yG z^q7lR00E@Ud3)mBPnT0KM~pwzZiBREupva^PE3~e zBgQ9oh@kcTk2)px3Hv^VzTtMzCG?*X(TDZ1MJ6zx{v- z;$oo46L#QNjk*1przHSQn~Ba#>3BG8`L)xla=P{Ql8aZ!A^Z6rPv%&@SnTI7FhdzT z-x7FR0{9HZg8Bd(puRlmXB(tB?&pxM&<=cA-;RT5}8rI%~CSUsR^{Dr%I2WAQghoqE5 zeQ874(T`vBC+r2Mi(w`h|d zA4x%EfH35I?h933@ic#u`b+%b+T?h=<}m@x_~!>o35p|cvIkkw07W=Ny7YcgssA_^ z|KJQrnu||Nu9@b|xC#C5?8Pin=q|UB?`CTw&AW0b)lKxZVYrBw+whPwZJCl}G&w9r zr7qsqm>f2u_6F@FhZU0%1Ioc3X7bMP%by_Z?hds`Q+&3P9-_AX+3CZ=@n!y7udAV2 zp{GT6;VL4-#t0l_h~?J^;trk1kxNAn8jdoaqgM2+mL&?tVy{I)e`HT9#Tr}HKnAfO zAJZ82j0+49)E0+=x%#1_D;sKu#W>~5HZV6AnZfC`v#unnm=hLTtGWz+21|p)uV+0= zDOyrLYI2^g8m3wtm-=pf^6N4ebLJbV%x`J8yd1!3Avqgg6|ar z=EM0KdG6a2L4YK~_kgr6w5OA;dvw0WPFhMF7`I5vD}#giMbMzRotEs&-q z^ji&t1A?l%UJezWv?>ijh|$1^UCJYXJwLX#IH}_1K@sAR!*q@j(({4#DfT|nj}p7M zFBU=FwOSI=xng>2lYo5*J9K3yZPwv(=7kbl8Xv0biOba>vik>6!sfwnH(pglq1mD-GrQi8H*AmfY*J7&;hny2F zupR}4@kzq+K*BE%5$iX5nQzayWTCLJ^xTam-EEIH-L2;huPSy;32KLb>>4 z#l$W^Sx7Q5j+Sy*E;1eSQQuHHWOT;1#LjoYpL!-{7W3SP4*MXf z<~>V7^&sY|9XSw`B<^9fTGQLPEtj=;<#x^=;O9f2{oR+{Ef^oZ z@N>P$>mypv%_#=lBSIr_5sn zBF-F_WgYS81vyW6$M;D_PoE&%OkNV1&-q+qgg~`A7s}>S`}cn#E$2m z%aeUXwNA(^3tP=;y5%pk#5Yz&H#AD`Jph-xjvZm_3KZ|J>_NR@croB^RUT~K;Exu5%wC}1D4nov3+@b8 zKyU5jYuQ*ZpTK23xXzpN51kB+r*ktnQJ7kee-gP+Ij0J_#rFTS4Gux;pkVB;n(c=6 zMks#)ZuXUcnN>UKDJ-IP-u2de1-AKdHxRZDUGkp)0Q#U$EPKlSLQSlnq)OsCour)+ zIXh@3d!ImInH7VrmR>p8p4%n;Tf6l2jx1qjJu>e3kf5aTzU)&910nXa-g0xn$tFa& z2qZ7UAl*@5o=PAh`6L${6S-0?pe3thPB4pahffb$#nL8ncN(Nyos`}r{%{g64Ji^= zK8BIywT0-g4VrhTt}n~Y;3?FGL74h?EG*QfQy0A8u>BtXuI{C-BYu*$o^}U1)z;8d zVN(ssw?oCbebREPD~I$-t7}`_5{{<0d10So7Pc2%EREdpMWIJI&$|rq<0!LL+BQM4 zn7)cq=qy|8YzdO(?NOsVRk{rW)@e7g^S~r^SCawzq3kj#u(5@C!PKCK0cCy zT@Tey2IeDYafA2~1{gyvaIT^a-Yo9kx!W#P-k6DfasKEgFji`hkzrmJ#JU^Yb%Nc~ zc)+cIfTBA#N0moyxZ~K!`^<>*Nzv-cjOKR(kUa4AkAG#vtWpaD=!Ku&;(D#(>$&~B zI?V}e8@p%s(G|8L+B)&xE<({g^M`#TwqdB=+oP|5pF3Z8u>VA!=w6k)zc6w2=?Q2` zYCjX|)fRKI1gNj{-8ymwDOI5Mx8oNp2JJHG3dGJGg!vK>$ji?n>5qG)`6lEfc&0uV z)te%G&Q1rN;+7EPr-n8LpNz6C6N0*v{_iIbta7OTukSY zt5r@sO!)rjh0aAmShx zd3=DJ3c(pJXGXzIh?#RR_*krI1q)H$FJ#dwIvz);mn;w6Rlw+>LEq4CN6pP4AI;!Y zk-sQ?O=i1Mp5lZX3yka>p+XCraM+a!1)`F`h^cG>0)f0OApGe(^cz-WoOno-Y(EeB zVBy3=Yj}ak7OBj~V259{&B`~tbJCxeVy@OEE|ke4O2=TwIvf-=;Xt_l)y`wuQ-9#D z(xD-!k+2KQzr`l$7dLvWf*$c8=#(`40h6d$m6%!SB1JzK+tYQihGQEwR*-!cM>#LD>x_J*w(LZbcvHW@LTjM?RSN z0@Z*4$Bw~Ki3W|JRI-r3aMSepJNv;mo|5yDfqNLHQ55&A>H5>_V9<_R!Ip`7^ylX=D<5 zr40z>BKiC@4{wSUswebDlvprK4SK2!)w4KkfX~jY9!W|xUKGTVn}g@0fG94sSJGV- z9@a~d2gf5s>8XT@`If?Oway5SNZS!L5=jpB8mceuf2Nd%aK2Zt|2FVcg8~7O{VPgI z#?H*_Kl!9!B}MrK1=O!Aw&faUBluA0v#gWVlAmZt;QN7KC<$;;%p`lmn@d(yu9scs zVjomrund9+p!|LWCOoZ`ur5QXPFJtfr_b5%&Ajig2dI6}s&Fy~t^j}()~4WEpAPL= zTj^d;OoZTUf?weuf2m?|R-7 z*C4M6ZhWF(F@2}nsp85rOqt+!+uZz3$ReX#{MP5-r6b`ztXDWl$_mcjFn*{sEx7f*O(ck+ou8_?~a_2Ztsq6qB|SPw26k!tLk{Q~Rz z$(8F1B;zK-#>AmmDC7;;_!;g&CU7a?qiIT=6Ts0cbUNMT6yPRH9~g zS%x{(kxYd=D&GKCkx;N21sU;OI8@4vLg2}L>Lb{Qv`B*O0*j>yJd#`R5ypf^lp<7V zCc|+>fYgvG`ROo>HK+FAqlDm81MS>&?n2E-(;N7}oF>3T9}4^PhY=Gm`9i(DPpuS- zq)>2qz!TmZ6q8;&M?@B;p1uG6RM_Y8zyId{-~XQD_}bXL{Jp7w`)~IR{l5a2?7!Vg zp!OfP4E$Ty_-K3VY!wdGj%2RL%QPHTL)uKfO5Am5<$`5 zHCBtvI~7q-ochU`=NJF*pPx@^IhAk&ZEA>w$%oPGc-}6~ywV~3-0{>*sb=|ruD{y$ ze%@-m`u28vKDaf*_rmN`tzQT>&2ltg-lofR8~c;p;E@`zK!1lkgi?JR0 z+<61+rEupp7F=mB=Ch?HwEjuQm}1KOh=o@ zMbI}0J>5}!koi&v9?!B?4FJR88jvyXR_v{YDm}C)lp@2G2{a{~6V5CwSrp6vHQsfb-U<{SSrQ zhjRbS;qlDTA&TQ2#?M(4xsRXFZ^;3A+_yLw>o-9GJ5sgsauB`LnB-hGo9sJ~tJ`Q>=X7sVmg<=Fcv=JDe*DjP-SK-0mJ7)>I zaLDLOU*I}4@cro&?@C`hH3tiXmN`!(&>@S2bFyAvI&axlSgd=!4IOi#+W;sS>lQ28 zd}q&dew9=x;5l0kK@1y9JgKWMv9!I`*C;((P>8C@JJRGwP5EL;JAPHi5fI|4MqlLU z^4D!~w+OIklt7dx3^!m6Be{Lp55j{5gSGgJz=hlNd@tt_I>UG(GP5s^O{jFU;m~l0 zfd`QdE~0Ym=6+XN*P`i0ogbgAJVjD9#%eBYJGIbDZ4s(f-KRE_>8D1Dv*kgO1~NSn zigx8f+VcA_xS)V-O^qrs&N9(}L!_3HAcegFfzVAntKxmhgOtsb4k6qHOpGWq6Q0RS zZO=EomYL%;nKgmFqxD<68tSGFOEM^u0M(;;2m1#4GvSsz2$jawEJDNWrrCrbO<}g~ zkM6516erswSi_yWuyR}}+h!VY?-F!&Y5Z!Z`tkJz&`8AyQ=-mEXxkQ%abc`V1s>DE zLXd7!Q6C)`7#dmZ4Lm?>CTlyTOslb(wZbi|6|Pl5fFq3y^VIzE4DALm=q$pK>-WM> z@ETsJj5=7=*4 z#Q8(b#+V=~6Gxl?$xq|?@_yQJ2+hAYmuTj0F76c(B8K%;DPhGGWr)cY>SQS>s7%O- zr6Ml8h`}klA=1&wvbFMqk}6fml`4A%G=o@K@8LHifs$)}wD?ix~Id@9-`;?+I7 zOhQN(D)j=^%EHN16(Z3@mMRM5=V)_z(6y^1b?@Bn6m>LUW7}?nupv*6MUVPSjf!Ym zMPo5YoD~t(`-c9w)tV%RX*mYjAn;5MIsD?0L&NQ#IY`9k5}Fr#5{CeTr)O|C2fRhY z4zq(ltHY2X)P*f?yM#RY75m8c<%{Y?5feq6xvdMWrNuqnR%(o(uo8i|36NaN<#FnT ze-_O*q0DXqR>^*1sAnsz$Ueqe5*AD@Htx?pWR*RP=0#!NjnaE-Gq3oUM~Kc9MO+o6 z7qc6wsBxp7GXx+hwEunnebz!|CX&`z{>loyCFSF-zg za}zec;B1H7rhGMDfn+t9n*wt|C_0-MM~XO*wx7-`@9~-%t?IegrHM(6oVSG^u?q`T zO<+YuVbO2fonR-MCa6@aND4dBy^~awRZcp!&=v+#kH@4jYvxt=)zsHV0;47XjlvDC8M1hSV zm!GB(KGLwSd{F-?dmMAe%W0oxkgDv8ivbs__S{*1U}yQ=tsqHJYI9)jduSKr<63$> zp;a-B^6Hg3OLUPi1UwHnptVSH=_Km$SXrCM2w8P z%F#Boi&CcZ5vAGjR1axw&YNh~Q%)VDYUDZ6f^0;>W7_sZr&QvRWc2v~p^PqkA%m=S zCwFUg2bNM(DaY>=TLmOLaDW&uH;Za?8BAwQo4+Xy4KXX;Z}@D5+}m)U#o?3UF}+(@jr$M4ja*`Y9gy~Y`0 z6Aex1*3ng@2er)@{%E9a3A;cts9cAor=RWt7ege)z=$O3$d5CX&hORZ3htL>jj5qT zW#KGQ;AZ|YbS0fvG~Y)CvVwXnBLJkSps7d~v;cj$D3w=rB9Tx>a&4>(x00yz!o*SOd*M!yIwx;NgqW?(ysFv8XLxs6Lrh8-F`3FO$}V{Avztc4qmZ zoz&YQR`*wWy_^&k-ifJ&N8Qh=E-fH6e}-}0C{h~hYS6L^lP>=pLOmjN-z4eQL27!6 zIe2E}knE;dxIJ_!>Mt|vXj%uGY=I^8(q<4zJy~Q@_^p@JUNiGPr!oUHfL~dw9t7C4I9$7RnG5p9wBpdw^)PtGwLmaQM=KYe z;Dfw@%nquH^nOI6gjP+K@B~0g1+WROmv1sk1tV@SUr>YvK7mxV3$HR4WeQ2&Y-{q~ z4PAR&mPOEsTbo~mRwg&EJE2Dj?TOZPO_@Z|HZX9-6NA!%Pb3h;G3F5J+30BoT8-PU z_kbx`I>&nWEMtfv(-m>LzC}s6q%VdBUVI_GUv3@^6SMkEBeVjWplD5y58LyJhikp4VLHhyf?n%gk0PBr(PZ3 z+V`qF971_d@rCO8p#7*#L0^v$DH>-qB!gy@ut`3 zy3cQ8*t@@{V7F*ti(u{G4i55*xY9Erw3{JZ8T4QPjo5b{n=&z4P^}wxA;x85^fwmD z6mEq9o;kx<5VneT_c-VUqa|zLe+BFgskp_;A)b>&EDmmP7Gx#nU-T@;O+(&&n7ljK zqK7&yV!`FIJAI+SaA6y=-H=tT`zWvBlaed!3X^_Lucc%Q=kuiG%65@@6IeG}e@`ieesOL} zKHBJBso6u&7gzlrpB%_yy<>TFwDI>}Ec|Gieb4=0fGwY|3YGW2Dq46=a1 zVo`Vi%yz+L9)9hbb%FLTC@-G(lODgJ(f&WmSCK9zV3-IV7XI<{2j}ms_Vmb!os)06 zhVIZPZF)hW--kWTCyDVRd2T&t|P&aDrtO5kzXy<*A+5$k7$>4+y%;% znYN-t#1^#}Z6d+ahj*Gzor+@kBD7@f|IGNR$4U=Y0J2#D2)YSxUCtiC1weJg zLp0Q&JFrt|In8!~1?fY0?=fPyaqPy$iQXJDhHP>N%B42Yck`Qz-OM_~GMuWow)>=Q z0pCCC7d0Z^Ipx29`}P3;?b{dO?7z0e{L|O*Z}nxi>X|RL8XAw$1eOLKd5j@f{RQ~Y zG?7$`hy@s7IoRF2@KA%2ZM6{ru9T5Gj)iDCz};VvlG$WuT+>_wCTS~J6`I9D{nsrU z2;X#OyopBgo778Q>D%_E>rMN~Po~d5H<`8|Zcv}F`xL5~NCVLX4Wkg007HhMgj9Pa z94$km3A+F&LzOJlpeFR*j+Y%M!Qm42ziH~cKM&3b;15s)ycD@3_tL-dk{+xP@J7#o z-)bYa-gd2esfy<&-nrj>1{1^_L>j&(MA1#WNPg3UD?reL*}V{ag{b!uT755x>mfbZ z0PzwF+kx91`qqOn`1>xw@801XAJlH>{`~|pyi6J;3s=cTOfelA&K5HX#gBp6s<|r5 zjSSj+CU*-TulqlnlP`}?)JkJ_7fg){;bRlXf+&^e8CWwFqGY@SZ=%NmLCXpYb+}7* z$4k}%iFUi^kBdeJg^kHt)f~<;Ovlz!9frq20cIj>2eIcG(dh57ry;^E^2T)E_8#;_9iJT>4sdCB_db|zO?Z^*lBN zNCs~f+Jkx%EUgkN2-xFF?B%TMr4#)%wq?-~+Nh;g9=n3tM>i5ZcH&nkVcPXgYRjG@ zf(Y7WN@hGV7o0bjx_2@bthJ`hjXXpfaes_(lWIw!(QK_nkyqj?{j#uFKpNVpV@h?7_WC3~&%)xHR1kKo`Cypj15#%0m z-o0GXem63g^|IltM?eZV=b+Z2e8&Z1%{0;*zmFc62mNqLTy$Y_c|9HiH0l>K z+mAx7DVYoHhXfdCE8Bs@j=t0f*uM++Idd25BgIm`Ad;I_{$mO?W%=JF82blr8rl>yMk6?pM z^tMluJ-ckG_}OkxP91t2o>CQ_O8^VZn$s$M_APWIXBGBq0Lt^YrTD5(Vwe2ta4y#DEYa(W~=eLOy7rD^%Vd$kL27M)MSpwgoP3P{ z!yS$zc|uP{yzaIqCwE!AfYNS;KW|OdP1Q%!LZviA0e^WDsIS5#= z!B{TW)VB)VHg{LoS#W7i6W>*sFz!qr^YS0t2kh90y=Je5{p>8)~D@dLS@QM(F# zIp{6M*#(@?tsu1Rq-Mdq+eV}ibRSpv#976C_5xlI`$#1tN`sK1?)5M+sj=OXG6dNu zV1K{y>!i0&9w8O{a>`IA#mo(3a zf*+Q=&HW7&(nX8~C1tiHZj%>;asBEp$p_Q!@Y0T8R~OuPEy3Lq@^t$8=~(FhPVmJJ z#VF8`(fNzK-b%Iin7|cxWP0xr*M&zoz|fCx@=Y!-0j_~cuxsDHHpmSo)qOalZ$bRl z2F$j0k3llJ$>28HH3l_W(KjF^!@LwtLej_b9;i;{ku2x+&WA@jKTO0ad71@_Yta!{ z2oqhO4zaU433LK371>E{bZ?+3kLZ9WQ2+3PTZAP90%P13Yy3lr3mhmy|>eN6(SHs1C%Q39p)YsUr7(kuaoIJGJhXV-PyG zjnxhcAC;fqY@6;MWWBnRK6ocG`%T&0&*k95#yK7DFtZV?;cy;!RD_*YJjsb6Q`$;K zy)&X{P`*5xEgjTQ9r=oh0|>Z_yeFm?ev!p z7q;JA4mtu@qa39v%6i)Z4%qwdxcHuOMO;a1wFMP_290FqH1OsmCG{ zq^afYrz2BQyQ0*JGE}1h!W9fKgk$b!)|!%q(1x?5=}PpmZQ$e;2EB*k4%+&+u;(E* z2n@=9HsqMv;4>Nn^2v&@4T-YTkd`TdWU^U*;sA5|r7TjZGnLY*xC=_K-GmDfkWEGC z;oN&!c1xB-<4J7=9 zJ(BedZwZhG4|64<=wvCn4)}w%Zx_TEs6ehmjVG&p5pi46r zg=3-3Q~;v55KR&8CfG;`Lv6NsXB}RqPVyNeKAfj9=Ol>fQlEUl2cH7=mPV!68+;jgtKvo5F#8&9m? z``w+#S5UR=QHFGM~noocC zVFa#v2%oo{%;wi~_~R2ci}`=B|0@ zinDfNxV3%iHIS(7{h_WEXqu!v~`CMH+7^SkvLe_3i}=pyDRah zN#L)F-`JLj6BiG}sj*WBmrdZuVVEo86Z<6VB}s)T$ZcWvG?i0cqI}WhUq2Y#{f~x# zi1LjxSZCwiKX}*ETGVzZ157=jydo*xC^}mJ<+)!DDCd4sx?VM%Y;&CTpw5;M*ihZ| zJ!FBJj0&j&-oJs?9a_I$;jzd%7|pdsQ3m`bPBe$nLoV1!YV8?Pw~0D zmSD-5Ue60>L$Rw;yk{_2d~v@CnvZa%!7{{7lb$kxWx!pzyh;6G~RbN5+|mFTbxcxf!XyfbLI^zMQSb6P~xzESXmV{9 zCMp)baZSz%)j&JWkc|Gq;_*$K@zQ%tH^91X2|Byv>=SmWR$7-shf|_^>Ll;*9+c(e z{N%43;&e8}_QGW+zE0m0myb-@QU%=Qo>``5UzB(lH0sK=E``{ZBl2Ni^-QtDp0ME1 zK88E-db_XBZQaU}cuvkCgH7crju~9eE-Y`os~0P-J=s;aS#wil$HGdK;Ut?dSO71ssyrdm{QRpMAV2nXslvlIE#+Oh>l7y_~?;}F!;ENCR zO+IG#NWIRI`FLntsz^FldCkky2f!d-%Pij9iLKr>IfCK);=}}?(NL%#4PfE(4kPQN zSC%BpZJ*P+PO5mHw0Wd%!zJsn&4g<$n#_?(=)JnoR2DK(mCPHp6e6VdV>?E5KCUF@ zf7W9wm%G#Wfm*NxTWIcJX-qtR=~NFxz4PSmDVAU8(B2wIm#IdHae-F{3jKQFiX?8NlKEhXR2Z|JCUd@HMnNVwqF~V9YJtD+T zQlOroDX-mg2% zBKV^Q5m5ECK{nWjJ7FHOSUi*a-C_?S_yo~G5HuRZH6R``^dS3Bh6u!nD`kFbxYThD zw~2%zL4tHA26rcdln4^=A(C+f9hLlcuMCv{8`u;?uoEVbU=YVNkBP#s3KnM@Oi)fQ zt_F3VjY)zASub%Q{Y?XgzlD3M5#gUBUuhW;$>uBSJH9UBfBtug*S|-;h?|L#^Z&uE zB&)spqM89dWg9ZrXi#F{KtL@r9g^xeR8J+$EhL~2u@cf`dS{8GUC76JP0hHtCKRg0 zt*rVyl&jaJAez;!fb!yX^+So4-8XMNpP@d3H*eF%t_?I|zN^1Iu5aGBXSm+}eCqn3 z^+vzcM*J>wV-FJRrx@^5;l>h0{OYT)lg{dr8!{s7(i{5T|3bivDoTonV1yo1@nVPR zXxEgGg^x5KHgp?=$xBwm_cKHeDurCgO>$B$GSO`Cd<~J8@>ni>Z-Ef!3+ck(MHVy@ z@#<*kCOb5S$V+Fvc@{Qv$oLfnOAG&YO5z_E2j6E z7a+c(>-`H)>g+6DeY1Y*ag-B6>Cl@@VhkZY@Uihe!{LlRpuTsmIsN4;+UDsHd954n9WZV6qq*{qZ5j<W)`UorOmXtVnLo3T{t#h3q^fooqQ~A+EY<$TDG4RKP*cK0liX95STt= zToC<2M2*(H1tZ)0s|v~iSAa^F-9jMwCy4cK0HM*3$@1Q`Pz}FFYm`PGP0wuamWrt*ehz3(|Fn%;0;K4}!Q~cx{0U0L=cs6lcrY^Y%Vf_rXpQIw~DfxB-72tZU6gdK8C~ea6(2P@kGH}!2N?>r(Ca{ zsI!6B!alPl%j1CHq97PTVRng$!~?s2{+6ffC#;X2z(Xb#9GsSYYe@9zY~7Dc7Hfgh z5Tq!})o30pA3ywg<9W3NpvUs;E%Cehz=s?EfLzcV0H?b{=q?vJCih2y%dhls6w3j$ zk9LB0L&(15mtul3T^QSK7KIZVTod#Sc)?1gzY~M=?ay87V}6G?F>~AIv()-N zD3rHX`;r;L{9N|Z8REN}OZB&SZ|5a80B%dQd-CNESP7HnuNn43T~Agcl1YOF@#W03 z1b*t!>t5G@XwVygHYczDIC|RdMB+ z$s5_5_W-EXN-u_5Pb{((!+8xa+?@_#dwtYHeJ_49Dql%3Fv0yXeV?!cC&Iqx@s~P%$X6%1 zYzS9pqaUv&aBQqO zBQs7d63FZIL1B&<8^oni%CZOdf6&;^oNqQ-9j-NBuQ^|9baQuZ^Jtyt&?cHq$Q9JE z5D>QY1?MU7%VVbvjysl~-a&ImiE(uFwHo{!kp;Jd`OLE!^4k8ID{`e-&>2uB7XB~= z+nIQGZ8-Sbfa}OrVPL}!mdieCrs3Nq8Ic_lpTKMIJ{h>XS$C3`h~ z?p2AbK~%t$t(NcOq5ZB3V|`a0io8A))v_PMt)Hg3x+07RL>i zGUq@t&+VV`kj55_snp?)Y@0rKZr`riC`9Q(B1P^nxffV9AvBLPrE<8D>ZP{HCDY@JIvYcYNRz8 z0Rf+Q0riSU@KaVpK)0M{2}Wuh!o~t*6>)EZSCQD{=}N4Oxjo1KO-MNpPYuPABh}E|rM!=TSl^F%NV^dg+>WNGi@Q5C z%JGsP#em`4LxDdIzA@VF&`2bLDv%J)(7vedDiXDqx{y6$Y0o~j*nVY73pINPCY?9y z$Rd&^64MN)Pkxr-CuZ+WqAJx6vuIAwmjkN{aPkrJ0I4F5-Bl}$hRzhRhZ^xN&Oe5$ za4Wrh6PyFfDG+Nzd8NTp2})j>pGtyejb&;NkU3C5-_H;{?>xK1QQ9S`xaHoMgee=2 zEbEh+*I!ggW@{T{qENlruZT)ODp~ZXHBc_Ngqu{jyC#qjyYGAQsO8VT^lts$z0HP+ z2xs^QjUwWuiEh863(PqO4BAosmhaK`pEI{-geBD9UuIn8ugOt-|6S(xkBLeGhW~)< z8aWBs0)bzOnY4wC$yW{M@&(iTe{8zhDnKP<1yr9J8akUK)1svAuxC)}x-<>S!9(?F zcA?{_C?@ZV2Aei`n#l(9zu`WS-hJsAXWt(SGp4(xg7~3*c5@odW;kXXbGuLOFMj{d z{gx81mQREmRAUHhfp#zoWh>z}GuS|raw1R#en%9R3hSR`qGglQhaq>#K!M%tooG;? zzjo}>sL7a3M5jW*s8R;#Y8b(l;%*I$@YH9)YzWR!T6WLI{$8ScBvw+5&()>NhPzd! z{>P(yk8{(G&2ovV^|#1HbcVMvXU&;0pk&6CxBTvBAB>#tK~qALsH`Ad1P0tAKWHv+BR8Fv4!`+>Obu1UX^Ov zmOpuS@Ui|NK4k-)TbG?+9T$)rkvq+?=0RDa=xdmY#JHLastjqPXdDbShqW>7NrHZ7 z7(9(HjM1-Ef(^`%3TlhySDJ27vQ?H`xr9VOM%0ANsA|A3-jj|r`KAo%oTajX3>^E` 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 YM{}PByk10KD_nuQ4E7Du?}+~TKh4V)`~Uy| diff --git a/faroe/springrest/springrest/.mvn/wrapper/maven-wrapper.properties b/faroe/springrest/springrest/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 22f219d25..000000000 --- a/faroe/springrest/springrest/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.5/apache-maven-3.8.5-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar diff --git a/faroe/springrest/springrest/mvnw b/faroe/springrest/springrest/mvnw deleted file mode 100644 index 8a8fb2282..000000000 --- a/faroe/springrest/springrest/mvnw +++ /dev/null @@ -1,316 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# 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. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Maven 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 /usr/local/etc/mavenrc ] ; then - . /usr/local/etc/mavenrc - fi - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` - fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`\\unset -f command; \\command -v java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi -else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" - else - jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" - fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" - if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` - fi - - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" - else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl -o "$wrapperJarPath" "$jarUrl" -f - else - curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f - fi - - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaClass=`cygpath --path --windows "$javaClass"` - fi - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR -fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - $MAVEN_DEBUG_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" \ - "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/faroe/springrest/springrest/mvnw.cmd b/faroe/springrest/springrest/mvnw.cmd deleted file mode 100644 index 1d8ab018e..000000000 --- a/faroe/springrest/springrest/mvnw.cmd +++ /dev/null @@ -1,188 +0,0 @@ -@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 "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* -if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" - -FOR /F "usebackq 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%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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 "%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/faroe/springrest/springrest/pom.xml b/faroe/springrest/springrest/pom.xml deleted file mode 100644 index de7b531fe..000000000 --- a/faroe/springrest/springrest/pom.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.7.1 - - - org.n52.faroeREST - springrest - 0.0.1-SNAPSHOT - springrest - REST API for Arctic Sea - - 17 - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java b/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java deleted file mode 100644 index 0f84c998f..000000000 --- a/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.n52.faroeREST.springrest; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class SpringrestApplication { - - public static void main(String[] args) { - SpringApplication.run(SpringrestApplication.class, args); - - } - -} diff --git a/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/entities/groups.java b/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/entities/groups.java deleted file mode 100644 index 91b67e46a..000000000 --- a/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/entities/groups.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.n52.faroeREST.springrest.entities; - -public class groups { - - private String title; - private String description; - public groups(String title, String description) { - super(); - this.title = title; - this.description = description; - } - public groups() { - super(); - // TODO Auto-generated constructor stub - } - public String getTitle() { - return title; - } - public void setTitle(String title) { - this.title = title; - } - public String getDescription() { - return description; - } - public void setDescription(String description) { - this.description = description; - } - @Override - public String toString() { - return "groups [title=" + title + ", description=" + description + "]"; - } - -} diff --git a/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java b/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java deleted file mode 100644 index 011ef7455..000000000 --- a/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.n52.faroeREST.springrest.settings; - -import java.util.List; - -import org.n52.faroeREST.springrest.entities.groups; - -public interface SettingsAPI { - - public List getGroup(); - - public groups getGroupbyTitle(String groupTitle); - - public groups addGroup(groups group); - - public groups updateGroup(groups group); - - public groups deleteGroup(String groupTitle); -} diff --git a/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java b/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java deleted file mode 100644 index 3972cd973..000000000 --- a/faroe/springrest/springrest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.n52.faroeREST.springrest.settings; - -import java.util.*; -import java.util.stream.Collectors; - -import org.n52.faroeREST.springrest.entities.groups; -import org.springframework.stereotype.Service; - -@Service -public class SettingsAPIImpl implements SettingsAPI { - - List list; - - public SettingsAPIImpl() { - list=new ArrayList<>(); - list.add(new groups("Desc","This is desc")); - list.add(new groups("Desc2","This is desc2")); - } - - @Override - public List getGroup() { - return list; - } - - @Override - public groups getGroupbyTitle(String groupTitle) { - - groups g=null; - for(groups group : list) { - if(group.getTitle() == groupTitle) { - g=group; - break; - } - } - return g; - - } - - @Override - public groups addGroup(groups group) { - - list.add(group); - - return group; - } - - @Override - public groups updateGroup(groups group) { - - list.forEach(e -> { - if(e.getTitle() == group.getTitle()) { - e.setDescription(group.getDescription()); - } - - }); - - return group; - } - - @Override - public groups deleteGroup(String groupTitle) { - list=this.list.stream().filter(e->e.getTitle()!=groupTitle).collect(Collectors.toList()); - return null; - } - -} diff --git a/faroe/springrest/springrest/src/test/java/org/n52/faroeREST/springrest/SpringrestApplicationTests.java b/faroe/springrest/springrest/src/test/java/org/n52/faroeREST/springrest/SpringrestApplicationTests.java deleted file mode 100644 index 2c5604f83..000000000 --- a/faroe/springrest/springrest/src/test/java/org/n52/faroeREST/springrest/SpringrestApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.n52.faroeREST.springrest; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class SpringrestApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/pom.xml b/pom.xml index e484546cc..aeb34e6f1 100644 --- a/pom.xml +++ b/pom.xml @@ -152,7 +152,7 @@ 3.17.0 2.13.3 5.8.2 - 2.7.1 + 2.7.1 4.6.1 2.2 4.4.15 @@ -163,7 +163,6 @@ - ${project.groupId} @@ -488,6 +487,14 @@ spring-beans ${version.spring} + + + org.springframework.boot + spring-boot-dependencies + ${version.spring-boot} + pom + import + org.springframework spring-core @@ -1193,6 +1200,11 @@ + + org.springframework.boot + spring-boot-maven-plugin + ${version.spring-boot} + org.apache.maven.plugins maven-javadoc-plugin From 713e674680db106a659287cce8bd084206ce1ab1 Mon Sep 17 00:00:00 2001 From: Sujit Jaunjal Date: Fri, 22 Jul 2022 19:06:06 +0530 Subject: [PATCH 03/26] Removed all the errors in .pom file and nows its working perfectly --- NOTICE | 28 ---------------------------- faroe/rest/pom.xml | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 28 deletions(-) diff --git a/NOTICE b/NOTICE index 0a7c451f7..dcf4a6abc 100644 --- a/NOTICE +++ b/NOTICE @@ -56,8 +56,6 @@ This project includes: Apache Jena - Core under The Apache Software License, Version 2.0 Apache Jena - IRI under The Apache Software License, Version 2.0 Apache Jena - Shadowed external libraries under The Apache Software License, Version 2.0 - Apache Log4j API under Apache License, Version 2.0 - Apache Log4j to SLF4J Adapter under Apache License, Version 2.0 Apache Thrift under The Apache Software License, Version 2.0 c3p0 under GNU Lesser General Public License, Version 2.1 or Eclipse Public License, Version 1.0 Checker Qual under The MIT License @@ -100,14 +98,10 @@ This project includes: J2ObjC Annotations under The Apache Software License, Version 2.0 Jackson dataformat: CBOR under The Apache Software License, Version 2.0 Jackson dataformat: Smile under The Apache Software License, Version 2.0 - Jackson datatype: jdk8 under The Apache Software License, Version 2.0 - Jackson datatype: JSR310 under The Apache Software License, Version 2.0 Jackson-annotations under The Apache Software License, Version 2.0 Jackson-core under The Apache Software License, Version 2.0 jackson-databind under The Apache Software License, Version 2.0 Jackson-dataformat-YAML under The Apache Software License, Version 2.0 - Jackson-module-parameter-names under The Apache Software License, Version 2.0 - Jakarta Annotations API under EPL 2.0 or GPL2 w/ CPE Java archiving library under Apache 2 JavaBeans(TM) Activation Framework under COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 JavaMail API jar under CDDL or GPLv2+CE @@ -118,11 +112,8 @@ This project includes: Joda-Time under Apache License, Version 2.0 JOpt Simple under The MIT License JSONLD Java :: Core under Revised BSD License - JUL to SLF4J bridge under MIT License lang-mustache under Elastic License 2.0 or Server Side Public License, v 1 libphonenumber under The Apache Software License, Version 2.0 - Logback Classic Module under Eclipse Public License - v 1.0 or GNU Lesser General Public License - Logback Core Module under Eclipse Public License - v 1.0 or GNU Lesser General Public License Lucene Common Analyzers under Apache License, Version 2.0 Lucene Grouping under Apache License, Version 2.0 Lucene Highlighter under Apache License, Version 2.0 @@ -199,27 +190,8 @@ This project includes: Saxon-HE under Mozilla Public License Version 2.0 server under Elastic License 2.0 or Server Side Public License, v 1 SLF4J API Module under MIT License - SnakeYAML under Apache License, Version 2.0 - Spring AOP under Apache License, Version 2.0 - Spring Beans under Apache License, Version 2.0 - Spring Commons Logging Bridge under Apache License, Version 2.0 - Spring Context under Apache License, Version 2.0 Spring Context Support under Apache License, Version 2.0 - Spring Core under Apache License, Version 2.0 - Spring Expression Language (SpEL) under Apache License, Version 2.0 - Spring Web under Apache License, Version 2.0 - Spring Web MVC under Apache License, Version 2.0 - spring-boot under Apache License, Version 2.0 - spring-boot-autoconfigure under Apache License, Version 2.0 - spring-boot-starter under Apache License, Version 2.0 - spring-boot-starter-json under Apache License, Version 2.0 - spring-boot-starter-logging under Apache License, Version 2.0 - spring-boot-starter-tomcat under Apache License, Version 2.0 - spring-boot-starter-web under Apache License, Version 2.0 T-Digest under The Apache Software License, Version 2.0 - tomcat-embed-core under Apache License, Version 2.0 - tomcat-embed-el under Apache License, Version 2.0 - tomcat-embed-websocket under Apache License, Version 2.0 W3C SOAP specification recommondation (v1.1) under The Apache Software License, Version 2.0 W3C SOAP specification recommondation (v1.2 part 1) under The Apache Software License, Version 2.0 W3C WS-Addressing specification schemas (v1.0) under The Apache Software License, Version 2.0 diff --git a/faroe/rest/pom.xml b/faroe/rest/pom.xml index d570327df..efd2e654a 100644 --- a/faroe/rest/pom.xml +++ b/faroe/rest/pom.xml @@ -34,10 +34,40 @@ spring-boot-starter-web provided + + org.springframework.boot + spring-boot-test + provided + + + org.springframework.boot + spring-boot + provided + + + org.springframework.boot + spring-boot-autoconfigure + provided + org.springframework.boot spring-boot-starter-test provided + + + org.springframework + spring-web + provided + + + org.springframework + spring-context + provided + + + org.springframework + spring-beans + provided ${project.groupId} @@ -60,6 +90,11 @@ faroe-utils provided + + org.junit.jupiter + junit-jupiter-api + test + From ff8be0173d5dbf1349b0799376abf3bfaa5911be Mon Sep 17 00:00:00 2001 From: Sujit Jaunjal Date: Mon, 25 Jul 2022 18:17:30 +0530 Subject: [PATCH 04/26] added faroe.xml file --- .../springrest/SpringrestApplication.java | 9 +++++++ .../springrest/controller/APIController.java | 13 +++++----- .../springrest/settings/SettingsAPI.java | 10 +++++--- .../springrest/settings/SettingsAPIImpl.java | 25 +++++++++++++------ faroe/rest/src/main/resources/faroe.xml | 15 +++++++++++ 5 files changed, 55 insertions(+), 17 deletions(-) create mode 100644 faroe/rest/src/main/resources/faroe.xml diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java index 5da61bbba..24972be2e 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java @@ -16,7 +16,16 @@ package org.n52.faroeREST.springrest; import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.ImportResource; +import org.n52.janmayen.ConfigLocationProvider; +import org.n52.janmayen.event.EventBus; + +@Configuration +@EnableAutoConfiguration +@ImportResource("classpath:faroe.xml") @SpringBootApplication public class SpringrestApplication { diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java index 3f2fefee2..7012ffc6c 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java @@ -15,8 +15,9 @@ */ package org.n52.faroeREST.springrest.controller; -import java.util.List; +import java.util.Set; +import org.n52.faroe.SettingDefinition; import org.n52.faroeREST.springrest.entities.Groups; import org.n52.faroeREST.springrest.settings.SettingsAPI; import org.springframework.beans.factory.annotation.Autowired; @@ -37,28 +38,28 @@ public class APIController { private SettingsAPI api; @GetMapping(path = "/groups") - public List getGroup(){ + public Set> getGroup(){ - return this.api.getGroup(); + return this.api.getSettings(); } @GetMapping(path = "/groups/{groupTitle}") public Groups getGroupbyTitle(@PathVariable String groupTitle) { - return this.api.getGroupbyTitle(groupTitle); + return this.api.getSettingsbyTitle(groupTitle); } @PostMapping(path = "/groups", consumes = "application/json") public Groups addGroup(@RequestBody Groups group) { - return this.api.addGroup(group); + return this.api.addSettings(group); } @PutMapping(path = "/groups", consumes = "application/json") public Groups updateGroup(@RequestBody Groups group) { - return this.api.updateGroup(group); + return this.api.updateSettings(group); } diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java index 485cacde0..4e7d9335e 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java @@ -16,18 +16,20 @@ package org.n52.faroeREST.springrest.settings; import java.util.List; +import java.util.Set; +import org.n52.faroe.SettingDefinition; import org.n52.faroeREST.springrest.entities.Groups; public interface SettingsAPI { - public List getGroup(); + public Set> getSettings(); - public Groups getGroupbyTitle(String groupTitle); + public Groups getSettingsbyTitle(String groupTitle); - public Groups addGroup(Groups group); + public Groups addSettings(Groups group); - public Groups updateGroup(Groups group); + public Groups updateSettings(Groups group); public Groups deleteGroup(String groupTitle); } diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java index fa6bf5c16..81307676f 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java @@ -18,12 +18,27 @@ import java.util.*; import java.util.stream.Collectors; + +import javax.inject.Inject; + +import org.n52.faroe.SettingDefinition; +import org.n52.faroe.SettingsService; import org.n52.faroeREST.springrest.entities.Groups; import org.springframework.stereotype.Service; + @Service public class SettingsAPIImpl implements SettingsAPI { + @Inject + private SettingsService service; + + + @Override + public Set> getSettings() { + return service.getSettingDefinitions(); + } + List list; public SettingsAPIImpl() { @@ -32,13 +47,9 @@ public SettingsAPIImpl() { list.add(new Groups("Desc2","This is desc2")); } - @Override - public List getGroup() { - return list; - } @Override - public Groups getGroupbyTitle(String groupTitle) { + public Groups getSettingsbyTitle(String groupTitle) { Groups g=null; for(Groups group : list) { @@ -52,7 +63,7 @@ public Groups getGroupbyTitle(String groupTitle) { } @Override - public Groups addGroup(Groups group) { + public Groups addSettings(Groups group) { list.add(group); @@ -60,7 +71,7 @@ public Groups addGroup(Groups group) { } @Override - public Groups updateGroup(Groups group) { + public Groups updateSettings(Groups group) { list.forEach(e -> { if(e.getTitle() == group.getTitle()) { diff --git a/faroe/rest/src/main/resources/faroe.xml b/faroe/rest/src/main/resources/faroe.xml new file mode 100644 index 000000000..99b63a5b3 --- /dev/null +++ b/faroe/rest/src/main/resources/faroe.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + From 5feb3d8fdfd6355c52a05d51f2f5979f8c0522ae Mon Sep 17 00:00:00 2001 From: Sujit Jaunjal Date: Tue, 26 Jul 2022 02:18:40 +0530 Subject: [PATCH 05/26] Resolved all issues in faroe.xml --- faroe/rest/pom.xml | 5 +++++ faroe/rest/src/main/resources/faroe.xml | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/faroe/rest/pom.xml b/faroe/rest/pom.xml index efd2e654a..e13dded99 100644 --- a/faroe/rest/pom.xml +++ b/faroe/rest/pom.xml @@ -95,6 +95,11 @@ junit-jupiter-api test + + ${project.groupId} + iceland + ${project.version} + diff --git a/faroe/rest/src/main/resources/faroe.xml b/faroe/rest/src/main/resources/faroe.xml index 99b63a5b3..178932a40 100644 --- a/faroe/rest/src/main/resources/faroe.xml +++ b/faroe/rest/src/main/resources/faroe.xml @@ -9,7 +9,7 @@ - - - + + + From 175674301f4fb2d045d572e9462e9e8683a6c7b5 Mon Sep 17 00:00:00 2001 From: Sujit Jaunjal Date: Tue, 26 Jul 2022 03:12:03 +0530 Subject: [PATCH 06/26] Removed minor errors and performed successful build --- NOTICE | 18 ------------------ faroe/rest/pom.xml | 7 ++++++- .../springrest/SpringrestApplication.java | 2 -- .../springrest/settings/SettingsAPI.java | 3 +-- faroe/rest/src/main/resources/faroe.xml | 17 +++++++++++++++++ 5 files changed, 24 insertions(+), 23 deletions(-) diff --git a/NOTICE b/NOTICE index dcf4a6abc..10a59977c 100644 --- a/NOTICE +++ b/NOTICE @@ -21,17 +21,14 @@ This project includes: 52°North Faroe JSON Backend under The Apache Software License, Version 2.0 52°North Faroe Parent under The Apache Software License, Version 2.0 52°North Faroe Utilities under The Apache Software License, Version 2.0 - 52°North Iceland under The Apache Software License, Version 2.0 52°North Iceland Aggregator Project under The Apache Software License, Version 2.0 52°North Iceland Statistics under The Apache Software License, Version 2.0 52°North Iceland Statistics Documentation Generator under The Apache Software License, Version 2.0 52°North Iceland Statistics Geolocation Feature under The Apache Software License, Version 2.0 52°North Iceland Statistics Kibana Exporter Tool under The Apache Software License, Version 2.0 52°North Jan Mayen under The Apache Software License, Version 2.0 - 52°North Shetland under The Apache Software License, Version 2.0 52°North Shetland Parent under The Apache Software License, Version 2.0 52°North Shetland RDF under The Apache Software License, Version 2.0 - 52°North Svalbard Core under The Apache Software License, Version 2.0 52°North Svalbard Exi under The Apache Software License, Version 2.0 52°North Svalbard JSON Common under The Apache Software License, Version 2.0 52°North Svalbard JSON encoding under The Apache Software License, Version 2.0 @@ -42,14 +39,11 @@ This project includes: aggs-matrix-stats under Elastic License 2.0 or Server Side Public License, v 1 ANTLR 4 Runtime under The BSD License Apache Commons CLI under Apache License, Version 2.0 - Apache Commons Codec under Apache License, Version 2.0 Apache Commons Compress under Apache License, Version 2.0 Apache Commons CSV under Apache License, Version 2.0 Apache Commons IO under Apache License, Version 2.0 Apache HttpAsyncClient under Apache License, Version 2.0 - Apache HttpClient under Apache License, Version 2.0 Apache HttpClient Cache under Apache License, Version 2.0 - Apache HttpCore under Apache License, Version 2.0 Apache HttpCore NIO under Apache License, Version 2.0 Apache Jena - ARQ (SPARQL 1.1 Query Engine) under The Apache Software License, Version 2.0 Apache Jena - Base Common Environment under The Apache Software License, Version 2.0 @@ -57,9 +51,7 @@ This project includes: Apache Jena - IRI under The Apache Software License, Version 2.0 Apache Jena - Shadowed external libraries under The Apache Software License, Version 2.0 Apache Thrift under The Apache Software License, Version 2.0 - c3p0 under GNU Lesser General Public License, Version 2.1 or Eclipse Public License, Version 1.0 Checker Qual under The MIT License - Commons Lang under The Apache Software License, Version 2.0 compiler under Apache License 2.0 dexx under MIT License elasticsearch-cli under Elastic License 2.0 or Server Side Public License, v 1 @@ -79,7 +71,6 @@ This project includes: Guava ListenableFuture only under The Apache Software License, Version 2.0 Guava: Google Core Libraries for Java under Apache License, Version 2.0 HdrHistogram under Public Domain, per Creative Commons CC0 - HikariCP under The Apache Software License, Version 2.0 HPPC Collections under The Apache Software License, Version 2.0 INSPIRE Addresses schema (spec. v4.0) under The Apache Software License, Version 2.0 INSPIRE Administrative Units schema (spec. v4.0) under The Apache Software License, Version 2.0 @@ -103,12 +94,10 @@ This project includes: jackson-databind under The Apache Software License, Version 2.0 Jackson-dataformat-YAML under The Apache Software License, Version 2.0 Java archiving library under Apache 2 - JavaBeans(TM) Activation Framework under COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 JavaMail API jar under CDDL or GPLv2+CE javax.annotation API under CDDL + GPLv2 with classpath exception javax.inject under The Apache Software License, Version 2.0 jaxb-api under CDDL 1.1 or GPL2 w/ CPE - JCL 1.2 implemented over SLF4J under Apache License, Version 2.0 Joda-Time under Apache License, Version 2.0 JOpt Simple under The MIT License JSONLD Java :: Core under Revised BSD License @@ -129,7 +118,6 @@ This project includes: mapper-extras under Elastic License 2.0 or Server Side Public License, v 1 MaxMind DB Reader under Apache License 2.0 MaxMind GeoIP2 API under Apache License, Version 2.0 - mchange-commons-java under GNU Lesser General Public License, Version 2.1 or Eclipse Public License, Version 1.0 Neo Visionaries Internationalization Package under The Apache Software License, Version 2.0 Netty/Buffer under Apache License, Version 2.0 Netty/Codec under Apache License, Version 2.0 @@ -178,12 +166,8 @@ This project includes: OGC WaterML DR schema (spec. v2.0) under The Apache Software License, Version 2.0 OGC WaterML schema (spec. v2.0) under The Apache Software License, Version 2.0 OGC XML schemas under The Apache Software License, Version 2.0 - Old JAXB Core under CDDL+GPL License - Old JAXB Runtime under CDDL+GPL License - org.locationtech.jts:jts-core under Eclipse Public License, Version 2.0 or Eclipse Distribution License - v 1.0 parent-join under Elastic License 2.0 or Server Side Public License, v 1 Portele Schape Change schema (spec. v3.0) under The Apache Software License, Version 2.0 - quartz under The Apache Software License, Version 2.0 rank-eval under Elastic License 2.0 or Server Side Public License, v 1 rest under The Apache Software License, Version 2.0 rest-high-level under Elastic License 2.0 @@ -196,9 +180,7 @@ This project includes: W3C SOAP specification recommondation (v1.2 part 1) under The Apache Software License, Version 2.0 W3C WS-Addressing specification schemas (v1.0) under The Apache Software License, Version 2.0 W3C xlink schema (spec. v1.1.0) under The Apache Software License, Version 2.0 - XML Commons External Components XML APIs under The Apache Software License, Version 2.0 or The SAX License or The W3C License XML Resolver under Apache License version 2.0 - XmlBeans under The Apache Software License, Version 2.0 XmlBeansXPath under The Apache Software License, Version 2.0 XMLUnit for Java under BSD License diff --git a/faroe/rest/pom.xml b/faroe/rest/pom.xml index e13dded99..f9d93f51d 100644 --- a/faroe/rest/pom.xml +++ b/faroe/rest/pom.xml @@ -98,7 +98,12 @@ ${project.groupId} iceland - ${project.version} + provided + + + javax.inject + javax.inject + provided diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java index 24972be2e..061441cf5 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java @@ -20,8 +20,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; -import org.n52.janmayen.ConfigLocationProvider; -import org.n52.janmayen.event.EventBus; @Configuration @EnableAutoConfiguration diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java index 4e7d9335e..dc770d23c 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java @@ -15,8 +15,7 @@ */ package org.n52.faroeREST.springrest.settings; -import java.util.List; -import java.util.Set; +import java.util.*; import org.n52.faroe.SettingDefinition; import org.n52.faroeREST.springrest.entities.Groups; diff --git a/faroe/rest/src/main/resources/faroe.xml b/faroe/rest/src/main/resources/faroe.xml index 178932a40..96e101113 100644 --- a/faroe/rest/src/main/resources/faroe.xml +++ b/faroe/rest/src/main/resources/faroe.xml @@ -1,3 +1,20 @@ + Date: Wed, 27 Jul 2022 14:25:12 +0530 Subject: [PATCH 08/26] Add files via upload --- .../settings-service-identification.xml | 76 +++++++ .../resources/settings-service-provider.xml | 154 +++++++++++++ .../src/main/resources/settings-service.xml | 206 ++++++++++++++++++ 3 files changed, 436 insertions(+) create mode 100644 faroe/rest/src/main/resources/settings-service-identification.xml create mode 100644 faroe/rest/src/main/resources/settings-service-provider.xml create mode 100644 faroe/rest/src/main/resources/settings-service.xml diff --git a/faroe/rest/src/main/resources/settings-service-identification.xml b/faroe/rest/src/main/resources/settings-service-identification.xml new file mode 100644 index 000000000..c81059889 --- /dev/null +++ b/faroe/rest/src/main/resources/settings-service-identification.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/faroe/rest/src/main/resources/settings-service-provider.xml b/faroe/rest/src/main/resources/settings-service-provider.xml new file mode 100644 index 000000000..523f58e3c --- /dev/null +++ b/faroe/rest/src/main/resources/settings-service-provider.xml @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/faroe/rest/src/main/resources/settings-service.xml b/faroe/rest/src/main/resources/settings-service.xml new file mode 100644 index 000000000..c98141262 --- /dev/null +++ b/faroe/rest/src/main/resources/settings-service.xml @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From b6183fa3a13601cc10c081a93ccd9d94cb5d245d Mon Sep 17 00:00:00 2001 From: Sujit Jaunjal Date: Thu, 28 Jul 2022 19:09:35 +0530 Subject: [PATCH 09/26] Implemented GETGroups and GETGroupDefinitionsByTitle --- .../springrest/controller/APIController.java | 48 +++++++------ .../springrest/settings/SettingsAPI.java | 15 ++-- .../springrest/settings/SettingsAPIImpl.java | 72 +++++++++++-------- 3 files changed, 76 insertions(+), 59 deletions(-) diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java index 3f2fefee2..5e65d249b 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java @@ -15,8 +15,10 @@ */ package org.n52.faroeREST.springrest.controller; -import java.util.List; +import java.util.Collection; +import java.util.Set; +import org.n52.faroe.SettingDefinition; import org.n52.faroeREST.springrest.entities.Groups; import org.n52.faroeREST.springrest.settings.SettingsAPI; import org.springframework.beans.factory.annotation.Autowired; @@ -36,40 +38,42 @@ public class APIController { @Autowired private SettingsAPI api; - @GetMapping(path = "/groups") - public List getGroup(){ + @GetMapping(path = "/settings") + public Set> getSettings(){ - return this.api.getGroup(); + return this.api.getSettings(); } + + @GetMapping(path = "/settings/groups") + public Set getGroups(){ - @GetMapping(path = "/groups/{groupTitle}") - public Groups getGroupbyTitle(@PathVariable String groupTitle) { - return this.api.getGroupbyTitle(groupTitle); + return this.api.getGroups(); + + } + + @GetMapping(path = "/settings/{groupTitle}") + public Collection> getSettingsbyTitle(@PathVariable String groupTitle) { + return this.api.getSettingsbyTitle(groupTitle); } - @PostMapping(path = "/groups", consumes = "application/json") - public Groups addGroup(@RequestBody Groups group) { - return this.api.addGroup(group); + @PostMapping(path = "/settings", consumes = "application/json") + public Set> addGroup(@RequestBody Groups group) { + + return this.api.addSettings(group); } - @PutMapping(path = "/groups", consumes = "application/json") + @PutMapping(path = "/settings", consumes = "application/json") public Groups updateGroup(@RequestBody Groups group) { - return this.api.updateGroup(group); - - } + return this.api.updateSettings(group); - @DeleteMapping(path = "/groups/{groupTitle}") - public ResponseEntity deleteGroup(@PathVariable String groupTitle){ - try { - this.api.deleteGroup(groupTitle); - return new ResponseEntity<>(HttpStatus.OK); - } catch (Exception e) { - return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); - } } + @DeleteMapping(path = "/settings") + public Set> deleteGroup() { + return this.api.deleteGroup(); + } } diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java index 485cacde0..19d0c5a27 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java @@ -15,19 +15,22 @@ */ package org.n52.faroeREST.springrest.settings; -import java.util.List; +import java.util.*; +import org.n52.faroe.SettingDefinition; import org.n52.faroeREST.springrest.entities.Groups; public interface SettingsAPI { - public List getGroup(); + public Set> getSettings(); - public Groups getGroupbyTitle(String groupTitle); + public Collection> getSettingsbyTitle(String groupTitle); - public Groups addGroup(Groups group); + public Set> addSettings(Groups group); - public Groups updateGroup(Groups group); + public Groups updateSettings(Groups group); - public Groups deleteGroup(String groupTitle); + public Set> deleteGroup(); + + public Set getGroups(); } diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java index fa6bf5c16..c471f0fe7 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java @@ -16,66 +16,76 @@ package org.n52.faroeREST.springrest.settings; import java.util.*; -import java.util.stream.Collectors; +import javax.inject.Inject; +import org.n52.faroe.SettingDefinition; +import org.n52.faroe.SettingsService; import org.n52.faroeREST.springrest.entities.Groups; import org.springframework.stereotype.Service; + @Service public class SettingsAPIImpl implements SettingsAPI { - List list; + @Inject + private SettingsService service; + private Collection> titles = new ArrayList>(); + private Set groups = new HashSet(); - public SettingsAPIImpl() { - list=new ArrayList<>(); - list.add(new Groups("Desc","This is desc")); - list.add(new Groups("Desc2","This is desc2")); + @Override + public Set> getSettings() { + return service.getSettingDefinitions(); } + @Override - public List getGroup() { - return list; + public Collection> getSettingsbyTitle(String groupTitle) { + service.getSettingDefinitions().forEach(definition -> { + if(definition.getGroup().getTitle().equalsIgnoreCase(groupTitle)) + { + this.titles.add(definition); + } + }); + + return this.titles; } - + @Override - public Groups getGroupbyTitle(String groupTitle) { - - Groups g=null; - for(Groups group : list) { - if(group.getTitle() == groupTitle) { - g=group; - break; - } - } - return g; - + public Set getGroups() { + service.getSettingDefinitions().forEach(definition -> { + + this.groups.add(definition.getGroup().getTitle()); + }); + + return this.groups; } + @SuppressWarnings("unchecked") @Override - public Groups addGroup(Groups group) { + public Set> addSettings(Groups group) { - list.add(group); + service.addSettings((Collection>) group); - return group; + return service.getSettingDefinitions(); } @Override - public Groups updateGroup(Groups group) { - + public Groups updateSettings(Groups group) { +/* list.forEach(e -> { if(e.getTitle() == group.getTitle()) { e.setDescription(group.getDescription()); } }); - - return group; +*/ + return /*group*/ null; } - @Override - public Groups deleteGroup(String groupTitle) { - list=this.list.stream().filter(e->e.getTitle()!=groupTitle).collect(Collectors.toList()); - return null; + public Set> deleteGroup() { + + service.deleteAll(); + return service.getSettingDefinitions(); } } From 04d49986d798653f4e7480dcb31373167e0f4044 Mon Sep 17 00:00:00 2001 From: Sujit Jaunjal Date: Mon, 1 Aug 2022 17:05:54 +0530 Subject: [PATCH 10/26] Working on delete API --- .../java/org/n52/faroe/SettingsService.java | 9 +++- .../org/n52/faroe/SettingsServiceImpl.java | 16 +++++++ .../springrest/controller/APIController.java | 14 +++--- .../springrest/settings/SettingAPIDao.java | 47 +++++++++++++++++++ .../springrest/settings/SettingsAPI.java | 4 +- .../springrest/settings/SettingsAPIImpl.java | 18 +++---- 6 files changed, 89 insertions(+), 19 deletions(-) create mode 100644 faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingAPIDao.java diff --git a/faroe/core/src/main/java/org/n52/faroe/SettingsService.java b/faroe/core/src/main/java/org/n52/faroe/SettingsService.java index d22c658d5..7d22116e2 100644 --- a/faroe/core/src/main/java/org/n52/faroe/SettingsService.java +++ b/faroe/core/src/main/java/org/n52/faroe/SettingsService.java @@ -72,6 +72,8 @@ public interface SettingsService { */ void deleteSetting(SettingDefinition setting) throws ConfigurationError; + + public void deleteSetting(String setting) throws ConfigurationError; /** * Get the definition that is defined with the specified key. * @@ -80,9 +82,13 @@ public interface SettingsService { * @return the definition or {@code null} if there is no definition for the key */ SettingDefinition getDefinitionByKey(String key); - /** * @return the keys for all definitions + */ + + SettingDefinition getDefinitionByTitle(String title); + /** + * @return the titles for all definitions */ Set getKeys(); @@ -136,4 +142,5 @@ public interface SettingsService { void addSettings(Collection> defs); + } diff --git a/faroe/core/src/main/java/org/n52/faroe/SettingsServiceImpl.java b/faroe/core/src/main/java/org/n52/faroe/SettingsServiceImpl.java index eb4a676fb..8245763ba 100644 --- a/faroe/core/src/main/java/org/n52/faroe/SettingsServiceImpl.java +++ b/faroe/core/src/main/java/org/n52/faroe/SettingsServiceImpl.java @@ -67,6 +67,7 @@ public class SettingsServiceImpl implements SettingsService { private final ReadWriteLock configurableObjectsLock = new ReentrantReadWriteLock(); private Set> definitions; private Map> definitionByKey; + private Map> definitionByTitle; private SettingsDao settingsManagerDao; private SettingValueFactory settingValueFactory; private EventBus serviceEventBus; @@ -205,6 +206,12 @@ public SettingDefinition getDefinitionByKey(String key) { return this.definitionByKey.get(key); } + @Override + public SettingDefinition getDefinitionByTitle(String title) { + return this.definitionByTitle.get(title); + } + + /** * Gets the value of the setting defined by {@code key}. * @@ -284,6 +291,15 @@ public void deleteSetting(SettingDefinition setting) throws ConfigurationErro this.serviceEventBus.submit(new SettingsChangeEvent(setting, oldValue, null)); } } + + public void deleteSetting(String setting) throws ConfigurationError { + SettingValue oldValue = this.settingsManagerDao.getSettingValue(setting); + if (oldValue != null) { + // applySetting(setting, oldValue, null); + this.settingsManagerDao.deleteSettingValue(setting); + // this.serviceEventBus.submit(new SettingsChangeEvent(setting, oldValue, null)); + } + } /** * @return the keys for all definitions diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java index afb931518..6ed6053a5 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java @@ -60,8 +60,8 @@ public Collection> getSettingsbyTitle(@PathVariable String @PostMapping(path = "/settings", consumes = "application/json") - public String addGroup(@RequestBody SettingAPIDao group) { -// this.api.addSettings(group); + public String addGroup(@RequestBody Collection> group) { + this.api.addSettings(group); return "Added"; } @@ -73,11 +73,11 @@ public Collection> updateSettings(@RequestBody Collection setting) { - System.out.println(setting.getTitle()); -// this.api.deleteSettings(setting); - return "Hello"; + @DeleteMapping("/settings/{setting}") + public String deleteSetting(@PathVariable String setting) { +// System.out.println(setting.getTitle()); + this.api.deleteSettings(setting); + return "Deleted setting"; } diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingAPIDao.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingAPIDao.java new file mode 100644 index 000000000..d40462663 --- /dev/null +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingAPIDao.java @@ -0,0 +1,47 @@ +package org.n52.faroeREST.springrest.settings; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +@JsonDeserialize +public class SettingAPIDao { + + String title,description,href; + + public SettingAPIDao(String title, String description, String href) { + super(); + this.title = title; + this.description = description; + this.href = href; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getHref() { + return href; + } + + public void setHref(String href) { + this.href = href; + } + + @Override + public String toString() { + return "SettingAPIDao [title=" + title + ", description=" + description + ", href=" + href + "]"; + } + + +} diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java index f5a882601..f077a23a2 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java @@ -28,13 +28,13 @@ public interface SettingsAPI { public Collection> getSettingsbyTitle(String groupTitle); - public String addSettings(SettingAPIDao group); + public String addSettings(Collection> group); public Collection> updateSettings(Collection> group); public Set> deleteGroup(); - public String deleteSettings(Collection> setting); + public String deleteSettings(String setting); public String deleteAllSettings(); } diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java index 016f29cc1..f09ed63eb 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java @@ -30,7 +30,7 @@ public class SettingsAPIImpl implements SettingsAPI { @Inject private SettingsService service; private Collection> titles = new ArrayList>(); - private Collection settings = new ArrayList(); + private Collection settings = new LinkedList(); private Set groups = new HashSet(); @Override @@ -38,9 +38,9 @@ public Collection getSettings() { service.getSettingDefinitions().forEach(definition -> { SettingAPIDao setting = new SettingAPIDao(definition.getGroup().getTitle(), definition.getGroup().getDescription(), "Sujit"); -// if(this.settings.toArray().length == 0) { -// this.settings.add(setting); -// } + if(this.settings.toArray().length == 0) { + this.settings.add(setting); + } // System.out.println(setting); this.settings.forEach(definitions -> { @@ -83,9 +83,9 @@ public Set getGroups() { @SuppressWarnings("unchecked") @Override - public String addSettings(SettingAPIDao group) { - System.out.println(group); -// service.addSettings((Collection>) group); + public String addSettings(Collection> group) { +// System.out.println(group); + service.addSettings(group); return "Added Successfully"; } @@ -110,9 +110,9 @@ public Set> deleteGroup() { @Override - public String deleteSettings(Collection> setting) { + public String deleteSettings(String setting) { -// service.deleteSetting(setting); + service.deleteSetting(setting); return "Deleted Successfully"; } From 1592bdb9e344662f6ced5975c2fbeb0396079471 Mon Sep 17 00:00:00 2001 From: Sujit Jaunjal Date: Wed, 14 Sep 2022 17:44:42 +0530 Subject: [PATCH 11/26] Added .json file storage --- .../java/org/n52/faroe/SettingDefinition.java | 5 +- .../main/java/org/n52/faroe/SettingValue.java | 3 + .../org/n52/faroe/SettingsChangeEvent.java | 21 +- .../main/java/org/n52/faroe/SettingsDao.java | 1 + .../org/n52/faroe/SettingsDefinitionDao.java | 11 + .../org/n52/faroe/SettingsServiceImpl.java | 51 ++++- .../faroe/json/AbstractJsonSettingsDao.java | 62 ++++++ .../org/n52/faroe/json/CRUDSettingsDao.java | 156 ++++++++++++++ .../org/n52/faroe/json/JsonSettingsDao.java | 8 +- .../org/n52/faroe/json/JsonSettingsFile.java | 198 ++++++++++++++++++ faroe/rest/pom.xml | 31 +++ .../springrest/SpringrestApplication.java | 14 ++ .../springrest/controller/APIController.java | 28 +-- .../settings/LocalConfigLocation.java | 12 ++ .../springrest/settings/SettingsAPI.java | 11 +- .../springrest/settings/SettingsAPIImpl.java | 57 +++-- .../src/main/resources/application.properties | 1 + faroe/rest/src/main/resources/faroe.xml | 15 +- 18 files changed, 632 insertions(+), 53 deletions(-) create mode 100644 faroe/core/src/main/java/org/n52/faroe/SettingsDefinitionDao.java create mode 100644 faroe/json/src/main/java/org/n52/faroe/json/AbstractJsonSettingsDao.java create mode 100644 faroe/json/src/main/java/org/n52/faroe/json/CRUDSettingsDao.java create mode 100644 faroe/json/src/main/java/org/n52/faroe/json/JsonSettingsFile.java create mode 100644 faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/LocalConfigLocation.java diff --git a/faroe/core/src/main/java/org/n52/faroe/SettingDefinition.java b/faroe/core/src/main/java/org/n52/faroe/SettingDefinition.java index 5999e2b94..334f09549 100644 --- a/faroe/core/src/main/java/org/n52/faroe/SettingDefinition.java +++ b/faroe/core/src/main/java/org/n52/faroe/SettingDefinition.java @@ -18,6 +18,8 @@ import java.io.Serializable; import java.util.Optional; +import com.fasterxml.jackson.annotation.JsonTypeInfo; + /** * * Interface for setting definitions that can be used within the Service. Defined settings will be presented in the @@ -36,6 +38,7 @@ * @author Christian Autermann * @since 1.0.0 */ +@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="_class") public interface SettingDefinition extends Ordered, Serializable { /** * @return the unique key of this definition @@ -53,7 +56,7 @@ public interface SettingDefinition extends Ordered, Serializable { String getDescription(); /** - * @return wether this setting is optional or required. + * @return weather this setting is optional or required. */ boolean isOptional(); diff --git a/faroe/core/src/main/java/org/n52/faroe/SettingValue.java b/faroe/core/src/main/java/org/n52/faroe/SettingValue.java index 6783487ba..b3916bdb8 100644 --- a/faroe/core/src/main/java/org/n52/faroe/SettingValue.java +++ b/faroe/core/src/main/java/org/n52/faroe/SettingValue.java @@ -17,6 +17,8 @@ import java.io.Serializable; +import com.fasterxml.jackson.annotation.JsonTypeInfo; + /** * Holder for generic settings. Implementations are {@link SettingsService} specific. * @@ -25,6 +27,7 @@ * @author Christian Autermann * @since 1.0.0 */ +@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="_class") public interface SettingValue extends Serializable { /** diff --git a/faroe/core/src/main/java/org/n52/faroe/SettingsChangeEvent.java b/faroe/core/src/main/java/org/n52/faroe/SettingsChangeEvent.java index afdc796ea..154d9c2f3 100644 --- a/faroe/core/src/main/java/org/n52/faroe/SettingsChangeEvent.java +++ b/faroe/core/src/main/java/org/n52/faroe/SettingsChangeEvent.java @@ -31,20 +31,34 @@ public class SettingsChangeEvent implements Event { private final SettingDefinition setting; + private final String settings; private final SettingValue oldValue; private final SettingValue newValue; @SuppressFBWarnings({"EI_EXPOSE_REP2"}) public SettingsChangeEvent(SettingDefinition setting, SettingValue oldValue, SettingValue newValue) { this.setting = setting; + this.settings = null; this.oldValue = oldValue; this.newValue = newValue; } + + public SettingsChangeEvent(String settings, SettingValue oldValue, SettingValue newValue) { + this.setting = null; + this.settings = settings; + this.oldValue = oldValue; + this.newValue = newValue; + } + public SettingDefinition getSetting() { return setting; } - + + public String getSettings() { + return settings; + } + @SuppressFBWarnings({"EI_EXPOSE_REP"}) public SettingValue getOldValue() { return oldValue; @@ -65,7 +79,8 @@ public boolean hasOldValue() { @Override public String toString() { - return String.format("SettingsChangeEvent[setting=%s, oldValue=%s, newValue=%s", - getSetting(), getOldValue(), getNewValue()); + return String.format("SettingsChangeEvent[setting=%s, settings=%s, oldValue=%s, newValue=%s", + getSetting(), getSettings(), getOldValue(), getNewValue()); } + } diff --git a/faroe/core/src/main/java/org/n52/faroe/SettingsDao.java b/faroe/core/src/main/java/org/n52/faroe/SettingsDao.java index 352433605..bbfdd6063 100644 --- a/faroe/core/src/main/java/org/n52/faroe/SettingsDao.java +++ b/faroe/core/src/main/java/org/n52/faroe/SettingsDao.java @@ -50,6 +50,7 @@ public interface SettingsDao { * @param setting the value */ void saveSettingValue(SettingValue setting); + void deleteAll(); diff --git a/faroe/core/src/main/java/org/n52/faroe/SettingsDefinitionDao.java b/faroe/core/src/main/java/org/n52/faroe/SettingsDefinitionDao.java new file mode 100644 index 000000000..f1160f3a0 --- /dev/null +++ b/faroe/core/src/main/java/org/n52/faroe/SettingsDefinitionDao.java @@ -0,0 +1,11 @@ +package org.n52.faroe; + +import java.util.Collection; + +public interface SettingsDefinitionDao extends SettingsDao { + + Collection> getAllSettings(); + + void saveSettings(Collection> settings); + +} diff --git a/faroe/core/src/main/java/org/n52/faroe/SettingsServiceImpl.java b/faroe/core/src/main/java/org/n52/faroe/SettingsServiceImpl.java index 8245763ba..8e411899f 100644 --- a/faroe/core/src/main/java/org/n52/faroe/SettingsServiceImpl.java +++ b/faroe/core/src/main/java/org/n52/faroe/SettingsServiceImpl.java @@ -35,7 +35,6 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import javax.inject.Inject; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -82,10 +81,10 @@ public void setServiceEventBus(EventBus serviceEventBus) { public void setSettingValueFactory(SettingValueFactory settingValueFactory) { this.settingValueFactory = settingValueFactory; } - + @Inject @SuppressFBWarnings({ "EI_EXPOSE_REP2" }) - public void setSettingsManagerDao(SettingsDao settingsManagerDao) { + public void setSettingsManagerDao(SettingsDao settingsManagerDao) { this.settingsManagerDao = settingsManagerDao; } @@ -292,12 +291,13 @@ public void deleteSetting(SettingDefinition setting) throws ConfigurationErro } } - public void deleteSetting(String setting) throws ConfigurationError { + @SuppressWarnings({ "unchecked", "rawtypes" }) + public void deleteSetting(String setting) throws ConfigurationError { SettingValue oldValue = this.settingsManagerDao.getSettingValue(setting); if (oldValue != null) { - // applySetting(setting, oldValue, null); + applySetting(setting, oldValue, null); this.settingsManagerDao.deleteSettingValue(setting); - // this.serviceEventBus.submit(new SettingsChangeEvent(setting, oldValue, null)); + this.serviceEventBus.submit(new SettingsChangeEvent(setting, oldValue, null)); } } @@ -361,6 +361,45 @@ private void applySetting(SettingDefinition setting, SettingValue oldValue } } + private void applySetting(String setting, SettingValue oldValue, SettingValue newValue) + throws ConfigurationError { + List changed = new LinkedList<>(); + ConfigurationError e = null; + configurableObjectsLock.readLock().lock(); + try { + Set cos = configurableObjects.get(setting); + if (cos != null) { + for (ConfigurableObject co : cos) { + try { + if (newValue != null) { + co.configure(newValue.getValue()); + } + } catch (ConfigurationError ce) { + e = ce; + break; + } finally { + changed.add(co); + } + } + if (e != null) { + LOG.debug("Reverting setting..."); + changed.stream().forEach(co -> { + try { + co.configure(oldValue.getValue()); + } catch (ConfigurationError ce) { + /* there is nothing we can do... */ + LOG.error("Error reverting setting!", ce); + } + }); + throw e; + } + } + } finally { + configurableObjectsLock.readLock().unlock(); + } + } + + private SettingValue getSettingValue(ConfigurableObject co) { return getSettingValue(co.getKey(), co.isRequired()); } diff --git a/faroe/json/src/main/java/org/n52/faroe/json/AbstractJsonSettingsDao.java b/faroe/json/src/main/java/org/n52/faroe/json/AbstractJsonSettingsDao.java new file mode 100644 index 000000000..47fb000dc --- /dev/null +++ b/faroe/json/src/main/java/org/n52/faroe/json/AbstractJsonSettingsDao.java @@ -0,0 +1,62 @@ +package org.n52.faroe.json; + +import java.util.Map.Entry; +import java.util.Spliterators; +import java.util.concurrent.locks.Lock; +import java.util.function.Predicate; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +import javax.inject.Inject; + +import org.n52.janmayen.Json; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; + +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + +public abstract class AbstractJsonSettingsDao { + + private final JsonNodeFactory nodeFactory = Json.nodeFactory(); + private JsonSettingsFile settings; + + @Inject + @SuppressFBWarnings({"EI_EXPOSE_REP2"}) + public void setConfiguration(JsonSettingsFile settings) { + this.settings = settings; + } + + protected JsonNodeFactory nodeFactory() { + return nodeFactory; + } + + protected Lock writeLock() { + return settings().writeLock(); + } + + protected Lock readLock() { + return settings().readLock(); + } + + protected JsonSettingsFile settings() { + return this.settings; + } + + protected ObjectNode getSettings() { + return settings().get(); + } + + protected Stream createStream(JsonNode node) { + return StreamSupport.stream(node.spliterator(), false); + } + + protected Stream> createEntryStream(JsonNode node) { + return StreamSupport.stream(Spliterators.spliteratorUnknownSize(node.fields(), 0), true); + } + + protected Predicate isNullOrMissing(String key) { + return n -> n.path(key).isNull() || n.path(key).isMissingNode(); + } +} diff --git a/faroe/json/src/main/java/org/n52/faroe/json/CRUDSettingsDao.java b/faroe/json/src/main/java/org/n52/faroe/json/CRUDSettingsDao.java new file mode 100644 index 000000000..fbe68bb36 --- /dev/null +++ b/faroe/json/src/main/java/org/n52/faroe/json/CRUDSettingsDao.java @@ -0,0 +1,156 @@ +package org.n52.faroe.json; + +import java.util.Collection; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.Module; +import java.util.Optional; +import java.util.Set; + +import javax.inject.Inject; + +import org.n52.faroe.JSONSettingConstants; +import org.n52.faroe.SettingDefinition; +import org.n52.faroe.SettingValue; +import org.n52.faroe.SettingsDao; +import org.n52.faroe.SettingsDefinitionDao; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; + +public class CRUDSettingsDao extends AbstractJsonSettingsDao implements SettingsDefinitionDao { + + private JsonSettingsEncoder settingsEncoder; + private JsonSettingsDecoder settingsDecoder; + + + @Inject + public void setSettingsEncoder(JsonSettingsEncoder settingsEncoder) { + this.settingsEncoder = settingsEncoder; + } + + protected JsonSettingsEncoder getSettingsEncoder() { + return this.settingsEncoder; + } + + @Inject + public void setSettingsDecoder(Optional settingsDecoder) { + this.settingsDecoder = settingsDecoder.isPresent() ? settingsDecoder.get() : new JsonSettingsDecoder(); + } + + protected JsonSettingsDecoder getSettingsDecoder() { + return this.settingsDecoder; + } + + @Override + public Set> getSettingValues() { + readLock().lock(); + try { + JsonNode node = getSettings().path(JSONSettingConstants.SETTINGS_KEY); + return getSettingsDecoder().decode(node); + } finally { + readLock().unlock(); + } + } + + @Override + public SettingValue getSettingValue(String key) { + readLock().lock(); + try { + JsonNode node = getSettings().path(JSONSettingConstants.SETTINGS_KEY).path(key); + if (!node.isObject()) { + return null; + } + return getSettingsDecoder().decode(key, node); + } finally { + readLock().unlock(); + } + } + + @Override + public void deleteSettingValue(String key) { + writeLock().lock(); + try { + getSettings().with(JSONSettingConstants.SETTINGS_KEY).remove(key); + } finally { + writeLock().unlock(); + } + settings().scheduleWrite(); + } + + @Override + public void saveSettingValue(SettingValue value) { + writeLock().lock(); + try { + ObjectNode settings = getSettings().with(JSONSettingConstants.SETTINGS_KEY); + JsonNode node = settings.path(value.getKey()); + ObjectNode settingNode = (ObjectNode) Optional.ofNullable(node.isObject() ? node : null) + .orElseGet(() -> settings.putObject(value.getKey())); + settingNode.put(JSONSettingConstants.TYPE_KEY, value.getType().toString()); + settingNode.set(JSONSettingConstants.VALUE_KEY, getSettingsEncoder().encodeValue(value)); + } finally { + writeLock().unlock(); + } + settings().scheduleWrite(); + } + + @Override + public void deleteAll() { + this.settings().delete(); + } + + @Override + public Collection> getAllSettings() { + + readLock().lock(); + + try { + ObjectNode settings = getSettings().with("SettingDefinitions"); + + ObjectMapper mapper = new ObjectMapper(); + mapper.registerModule(new Jdk8Module()); + Iterator it = settings.iterator(); + List> list = new LinkedList<>(); + + while(it.hasNext()) { + list.add(mapper.treeToValue(it.next(), SettingDefinition.class)); + } + return list; + + }catch(JsonProcessingException e){ + throw new RuntimeException(e); + } + finally { + readLock().unlock(); + } + } + + @Override + public void saveSettings(Collection> settings) { + + settings.forEach(setting -> { + saveSetting(setting); + }); + + } + + private void saveSetting(SettingDefinition setting) { + + writeLock().lock(); + try { + ObjectNode settings = getSettings().with("SettingDefinitions"); + ObjectMapper mapper = new ObjectMapper(); + // mapper.registerModule(new Jdk8Module()); + settings.set(setting.getKey(),mapper.valueToTree(setting)); + + } finally { + writeLock().unlock(); + } + settings().scheduleWrite(); + } + +} diff --git a/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingsDao.java b/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingsDao.java index a9e9d7551..687769d50 100644 --- a/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingsDao.java +++ b/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingsDao.java @@ -15,12 +15,15 @@ */ package org.n52.faroe.json; + +import java.util.Collection; import java.util.Optional; import java.util.Set; import javax.inject.Inject; import org.n52.faroe.JSONSettingConstants; + import org.n52.faroe.SettingValue; import org.n52.faroe.SettingsDao; @@ -36,6 +39,7 @@ public class JsonSettingsDao extends AbstractJsonDao implements SettingsDao { private JsonSettingsEncoder settingsEncoder; private JsonSettingsDecoder settingsDecoder; + @Inject public void setSettingsEncoder(JsonSettingsEncoder settingsEncoder) { this.settingsEncoder = settingsEncoder; @@ -53,7 +57,7 @@ public void setSettingsDecoder(Optional settingsDecoder) { protected JsonSettingsDecoder getSettingsDecoder() { return this.settingsDecoder; } - + @Override public Set> getSettingValues() { readLock().lock(); @@ -110,4 +114,6 @@ public void saveSettingValue(SettingValue value) { public void deleteAll() { this.configuration().delete(); } + + } diff --git a/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingsFile.java b/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingsFile.java new file mode 100644 index 000000000..286367944 --- /dev/null +++ b/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingsFile.java @@ -0,0 +1,198 @@ +package org.n52.faroe.json; + + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +import org.n52.faroe.ConfigurationError; +import org.n52.faroe.FileSettingsConfiguration; +import org.n52.janmayen.ConfigLocationProvider; +import org.n52.janmayen.Debouncer; +import org.n52.janmayen.Json; +import org.n52.janmayen.Producer; +import org.n52.janmayen.lifecycle.Destroyable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; + +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + +public class JsonSettingsFile implements Destroyable, +Producer, +FileSettingsConfiguration{ + + private static final Logger LOG = LoggerFactory.getLogger(JsonSettingsFile.class); + private static final String DEFAULT_FILE_NAME = "settings.json"; + private static final int DEFAULT_WRITE_TIMEOUT = 1000; + private static final String CONFIG_PATH = "config"; + private static final String WEB_INF_PATH = "WEB-INF"; + private String fileName = DEFAULT_FILE_NAME; + private int writeTimeout = DEFAULT_WRITE_TIMEOUT; + private Debouncer debouncer; + private ObjectNode settings; + private final ReadWriteLock lock = new ReentrantReadWriteLock(); + private File file; + private boolean readonly; + private ConfigLocationProvider configLocationProvider; + private final JsonNodeFactory nodeFactory = Json.nodeFactory(); + + public void init() { + writeLock().lock(); + try { + this.debouncer = new Debouncer(this.writeTimeout, this::persist); + Path path = buildPath(); + Path parent = path.getParent(); + if (parent != null) { + if (!Files.isSymbolicLink(parent)) { + Files.createDirectories(parent); + } + } else { + throw new RuntimeException("Error while creating config file path."); + } + this.file = path.toFile(); + this.refresh(); + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + writeLock().unlock(); + } + } + + private Path buildPath() { + if (configLocationProvider != null && configLocationProvider.get() != null) { + return Paths.get(configLocationProvider.get(), WEB_INF_PATH, CONFIG_PATH, this.fileName); + } + return Paths.get(WEB_INF_PATH, CONFIG_PATH, this.fileName); + } + + private synchronized void persist() { + if (!readonly) { + readLock().lock(); + try { + LOG.debug("Writing configuration file"); + try (FileOutputStream fos = new FileOutputStream(this.file)) { + Json.print(fos, this.settings); + } + } catch (IOException e) { + throw new ConfigurationError("Could not persist configuration", e); + } finally { + readLock().unlock(); + } + } + } + + public void delete() { + writeLock().lock(); + try { + if (this.file.exists() && this.file.isFile()) { + if (!this.file.delete()) { + throw new ConfigurationError("Can not delete configuration file %s", file + .getAbsolutePath()); + } + } + } finally { + writeLock().unlock(); + } + } + + public void setWriteTimeout(int writeTimeout) { + this.writeTimeout = writeTimeout; + } + + + public synchronized void setReadonly(boolean readonly) { + this.readonly = readonly; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public void setConfigLocationProvider(ConfigLocationProvider configLocationProvider) { + this.configLocationProvider = configLocationProvider; + } + + + @Override + public Path getPath() { + return this.file.toPath(); + } + + public Lock readLock() { + return this.lock.readLock(); + } + + public Lock writeLock() { + return this.lock.writeLock(); + } + + public void scheduleWrite() { + this.debouncer.call(); + } + + + @Override + public void refresh() { + writeLock().lock(); + try { + this.settings = readSettings(this.file) + .orElseGet(nodeFactory::objectNode); + } finally { + writeLock().unlock(); + } + } + + private Optional readSettings(File f) { + if (!f.exists()) { + return Optional.empty(); + } + if (!f.isFile()) { + throw new ConfigurationError("%s is not a file", f.getAbsolutePath()); + } + if (!f.canRead()) { + throw new ConfigurationError("%s is not a readable file", f.getAbsolutePath()); + } + try { + JsonNode node = Json.loadFile(f); + if (!node.isObject()) { + throw new ConfigurationError("%s does not contain a JSON object", f.getAbsolutePath()); + } + return Optional.of((ObjectNode) node); + } catch (IOException ex) { + throw new ConfigurationError("Could not read " + f.getAbsolutePath(), ex); + } + } + + @SuppressFBWarnings({"EI_EXPOSE_REP2"}) + public void set(ObjectNode settings) { + this.settings = settings; + } + + + @Override + public ObjectNode get() { + return this.settings; + } + + + @Override + public void destroy() { + LOG.info("Destroying {}", System.identityHashCode(this)); + this.debouncer.finish(); + } + public String toString() { + return "JsonConfiguration{" + "file=" + file + '}'; + } + +} \ No newline at end of file diff --git a/faroe/rest/pom.xml b/faroe/rest/pom.xml index f9d93f51d..bcb96217c 100644 --- a/faroe/rest/pom.xml +++ b/faroe/rest/pom.xml @@ -44,6 +44,11 @@ spring-boot provided + + org.json + json + 20210307 + org.springframework.boot spring-boot-autoconfigure @@ -105,6 +110,32 @@ javax.inject provided + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-annotations + + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.datatype + jackson-datatype-hibernate5 + + + com.fasterxml.jackson.datatype + jackson-datatype-jdk8 + + + com.googlecode.json-simple + json-simple + 1.1.1 + diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java index 44654ed28..1d456f153 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java @@ -18,8 +18,11 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration @EnableAutoConfiguration @@ -32,5 +35,16 @@ public static void main(String[] args) { SpringApplication.run(SpringrestApplication.class, args); } + + @Bean + public WebMvcConfigurer corsConfigurer() { + return new WebMvcConfigurer() { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/settings/groups").allowedOrigins("http://localhost:3000"); + registry.addMapping("/settings/groups/{groupTitle}").allowedOrigins("http://localhost:3000"); + } + }; + } } diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java index 6ed6053a5..67cbde690 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java @@ -19,12 +19,13 @@ import java.util.Set; import org.n52.faroe.SettingDefinition; -import org.n52.faroeREST.springrest.entities.Groups; +import org.n52.faroe.SettingValue; import org.n52.faroeREST.springrest.settings.SettingAPIDao; import org.n52.faroeREST.springrest.settings.SettingsAPI; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -46,6 +47,14 @@ public Collection getSettings(){ } + @GetMapping(path = "/setting") + public Collection> setSettings(){ + + return this.api.setSettings(); + + } + + @CrossOrigin(origins = "http://localhost:3000/groups") @GetMapping(path = "/settings/groups") public Set getGroups(){ @@ -58,28 +67,23 @@ public Collection> getSettingsbyTitle(@PathVariable String return this.api.getSettingsbyTitle(groupTitle); } - @PostMapping(path = "/settings", consumes = "application/json") - public String addGroup(@RequestBody Collection> group) { - this.api.addSettings(group); + public String addSettings(@RequestBody Collection> value) { + this.api.addSettings(value); return "Added"; - } @PutMapping(path = "/settings", consumes = "application/json") - public Collection> updateSettings(@RequestBody Collection> group) { - - return this.api.updateSettings(group); - + public String updateSettings(@RequestBody SettingValue value) { + this.api.updateSettings(value); + return "Updated"; } @DeleteMapping("/settings/{setting}") public String deleteSetting(@PathVariable String setting) { // System.out.println(setting.getTitle()); this.api.deleteSettings(setting); - return "Deleted setting"; - - + return "Deleted setting"; } diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/LocalConfigLocation.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/LocalConfigLocation.java new file mode 100644 index 000000000..52a7efa86 --- /dev/null +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/LocalConfigLocation.java @@ -0,0 +1,12 @@ +package org.n52.faroeREST.springrest.settings; + +import org.n52.janmayen.ConfigLocationProvider; + +public class LocalConfigLocation implements ConfigLocationProvider { + + @Override + public String get() { + return "E:\\52 North\\arctic-sea\\faroe\\rest"; + } + +} diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java index f077a23a2..5be9149c4 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java @@ -18,23 +18,24 @@ import java.util.*; import org.n52.faroe.SettingDefinition; -import org.n52.faroeREST.springrest.entities.Groups; +import org.n52.faroe.SettingValue; public interface SettingsAPI { public Collection getSettings(); + public Collection> setSettings(); + public Set getGroups(); public Collection> getSettingsbyTitle(String groupTitle); - + public String addSettings(Collection> group); - public Collection> updateSettings(Collection> group); - - public Set> deleteGroup(); + public String updateSettings(SettingValue group); public String deleteSettings(String setting); public String deleteAllSettings(); + } diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java index f09ed63eb..c3832ad1f 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java @@ -15,24 +15,49 @@ */ package org.n52.faroeREST.springrest.settings; + +import java.io.File; +import java.io.IOException; import java.util.*; import javax.inject.Inject; +import javax.inject.Qualifier; import org.n52.faroe.SettingDefinition; +import org.n52.faroe.SettingValue; +import org.n52.faroe.SettingsDefinitionDao; import org.n52.faroe.SettingsService; -import org.n52.faroeREST.springrest.entities.Groups; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Service; +import com.fasterxml.jackson.databind.ObjectMapper; @Service -public class SettingsAPIImpl implements SettingsAPI { +public class SettingsAPIImpl implements InitializingBean,SettingsAPI { @Inject private SettingsService service; + + @Inject + private SettingsDefinitionDao dao; + + private Collection> titles = new ArrayList>(); + //private Collection> assignData = new ArrayList>(); private Collection settings = new LinkedList(); private Set groups = new HashSet(); + + public void afterPropertiesSet() { + service.addSettings(dao.getAllSettings()); + } + + @Override + public Collection> setSettings() { + return null; + + } + @Override public Collection getSettings() { @@ -60,6 +85,8 @@ public Collection getSettings() { @Override public Collection> getSettingsbyTitle(String groupTitle) { + titles.clear(); + service.getSettingDefinitions().forEach(definition -> { if(definition.getGroup().getTitle().equalsIgnoreCase(groupTitle)) { @@ -80,32 +107,20 @@ public Set getGroups() { return this.groups; } - + @SuppressWarnings("unchecked") @Override public String addSettings(Collection> group) { -// System.out.println(group); + dao.saveSettings(group); service.addSettings(group); - return "Added Successfully"; + return "Settings Added Successfully"; } + @Override - public Collection> updateSettings(Collection> group) { - - service.getSettingDefinitions().forEach(e -> { - if(e.getKey() == ((SettingDefinition) group).getKey()) { - e.setDescription(((SettingDefinition) group).getDescription()); - } - - }); - - return /*group*/ null; - } - - public Set> deleteGroup() { - - service.deleteAll(); - return this.service.getSettingDefinitions(); + public String updateSettings(SettingValue group) { + service.changeSetting(group); + return "Settings updated"; } diff --git a/faroe/rest/src/main/resources/application.properties b/faroe/rest/src/main/resources/application.properties index f620381b5..bf323d887 100644 --- a/faroe/rest/src/main/resources/application.properties +++ b/faroe/rest/src/main/resources/application.properties @@ -1 +1,2 @@ server.port=8090 +spring.main.allow-bean-definition-overriding=true \ No newline at end of file diff --git a/faroe/rest/src/main/resources/faroe.xml b/faroe/rest/src/main/resources/faroe.xml index 96e101113..45687c02c 100644 --- a/faroe/rest/src/main/resources/faroe.xml +++ b/faroe/rest/src/main/resources/faroe.xml @@ -22,11 +22,18 @@ - + + - - - + + + + + + + + + From 3ca1da8227bf202af220443d8e223702f19b88c7 Mon Sep 17 00:00:00 2001 From: Christian Autermann Date: Thu, 15 Sep 2022 23:31:09 +0200 Subject: [PATCH 12/26] code formatting, dependency issues and imports --- NOTICE | 7 + faroe/core/pom.xml | 4 + .../org/n52/faroe/SettingsChangeEvent.java | 8 +- .../main/java/org/n52/faroe/SettingsDao.java | 2 +- .../org/n52/faroe/SettingsDefinitionDao.java | 19 +- .../java/org/n52/faroe/SettingsService.java | 2 +- .../org/n52/faroe/SettingsServiceImpl.java | 10 +- faroe/json/pom.xml | 8 + .../faroe/json/AbstractJsonSettingsDao.java | 15 + .../org/n52/faroe/json/CRUDSettingsDao.java | 34 ++- .../org/n52/faroe/json/JsonSettingsDao.java | 4 +- .../org/n52/faroe/json/JsonSettingsFile.java | 35 ++- faroe/rest/pom.xml | 257 +++++++++--------- .../springrest/SpringrestApplication.java | 33 +-- .../springrest/controller/APIController.java | 18 +- .../settings/LocalConfigLocation.java | 15 + .../springrest/settings/SettingAPIDao.java | 19 +- .../springrest/settings/SettingsAPI.java | 8 +- .../springrest/settings/SettingsAPIImpl.java | 199 +++++++------- faroe/rest/src/main/resources/faroe.xml | 2 +- .../settings-service-identification.xml | 17 ++ .../resources/settings-service-provider.xml | 17 ++ .../src/main/resources/settings-service.xml | 17 ++ .../statistics/mock/MockSettingsService.java | 10 + 24 files changed, 465 insertions(+), 295 deletions(-) diff --git a/NOTICE b/NOTICE index 10a59977c..e12e24c0d 100644 --- a/NOTICE +++ b/NOTICE @@ -70,6 +70,7 @@ This project includes: Guava InternalFutureFailureAccess and InternalFutures under The Apache Software License, Version 2.0 Guava ListenableFuture only under The Apache Software License, Version 2.0 Guava: Google Core Libraries for Java under Apache License, Version 2.0 + Hamcrest Core under BSD License 3 HdrHistogram under Public Domain, per Creative Commons CC0 HPPC Collections under The Apache Software License, Version 2.0 INSPIRE Addresses schema (spec. v4.0) under The Apache Software License, Version 2.0 @@ -89,18 +90,24 @@ This project includes: J2ObjC Annotations under The Apache Software License, Version 2.0 Jackson dataformat: CBOR under The Apache Software License, Version 2.0 Jackson dataformat: Smile under The Apache Software License, Version 2.0 + Jackson datatype: jdk8 under The Apache Software License, Version 2.0 Jackson-annotations under The Apache Software License, Version 2.0 Jackson-core under The Apache Software License, Version 2.0 jackson-databind under The Apache Software License, Version 2.0 Jackson-dataformat-YAML under The Apache Software License, Version 2.0 + Jackson-datatype-Hibernate5 under The Apache Software License, Version 2.0 Java archiving library under Apache 2 JavaMail API jar under CDDL or GPLv2+CE javax.annotation API under CDDL + GPLv2 with classpath exception javax.inject under The Apache Software License, Version 2.0 + javax.transaction API under CDDL + GPLv2 with classpath exception jaxb-api under CDDL 1.1 or GPL2 w/ CPE Joda-Time under Apache License, Version 2.0 JOpt Simple under The MIT License + JSON in Java under The JSON License + JSON.simple under The Apache Software License, Version 2.0 JSONLD Java :: Core under Revised BSD License + JUnit under Eclipse Public License 1.0 lang-mustache under Elastic License 2.0 or Server Side Public License, v 1 libphonenumber under The Apache Software License, Version 2.0 Lucene Common Analyzers under Apache License, Version 2.0 diff --git a/faroe/core/pom.xml b/faroe/core/pom.xml index 37e3b6a4e..0b45f661e 100644 --- a/faroe/core/pom.xml +++ b/faroe/core/pom.xml @@ -54,6 +54,10 @@ com.fasterxml.jackson.core jackson-databind + + com.fasterxml.jackson.core + jackson-annotations + javax.inject javax.inject diff --git a/faroe/core/src/main/java/org/n52/faroe/SettingsChangeEvent.java b/faroe/core/src/main/java/org/n52/faroe/SettingsChangeEvent.java index 154d9c2f3..5efa92479 100644 --- a/faroe/core/src/main/java/org/n52/faroe/SettingsChangeEvent.java +++ b/faroe/core/src/main/java/org/n52/faroe/SettingsChangeEvent.java @@ -43,22 +43,22 @@ public SettingsChangeEvent(SettingDefinition setting, SettingValue oldValu this.newValue = newValue; } - + public SettingsChangeEvent(String settings, SettingValue oldValue, SettingValue newValue) { this.setting = null; this.settings = settings; this.oldValue = oldValue; this.newValue = newValue; } - + public SettingDefinition getSetting() { return setting; } - + public String getSettings() { return settings; } - + @SuppressFBWarnings({"EI_EXPOSE_REP"}) public SettingValue getOldValue() { return oldValue; diff --git a/faroe/core/src/main/java/org/n52/faroe/SettingsDao.java b/faroe/core/src/main/java/org/n52/faroe/SettingsDao.java index bbfdd6063..9e2e46d3e 100644 --- a/faroe/core/src/main/java/org/n52/faroe/SettingsDao.java +++ b/faroe/core/src/main/java/org/n52/faroe/SettingsDao.java @@ -50,7 +50,7 @@ public interface SettingsDao { * @param setting the value */ void saveSettingValue(SettingValue setting); - + void deleteAll(); diff --git a/faroe/core/src/main/java/org/n52/faroe/SettingsDefinitionDao.java b/faroe/core/src/main/java/org/n52/faroe/SettingsDefinitionDao.java index f1160f3a0..08a136aa3 100644 --- a/faroe/core/src/main/java/org/n52/faroe/SettingsDefinitionDao.java +++ b/faroe/core/src/main/java/org/n52/faroe/SettingsDefinitionDao.java @@ -1,11 +1,26 @@ +/* + * Copyright (C) 2015-2022 52°North Spatial Information Research GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.n52.faroe; import java.util.Collection; public interface SettingsDefinitionDao extends SettingsDao { - + Collection> getAllSettings(); - + void saveSettings(Collection> settings); } diff --git a/faroe/core/src/main/java/org/n52/faroe/SettingsService.java b/faroe/core/src/main/java/org/n52/faroe/SettingsService.java index 7d22116e2..aca0f6d48 100644 --- a/faroe/core/src/main/java/org/n52/faroe/SettingsService.java +++ b/faroe/core/src/main/java/org/n52/faroe/SettingsService.java @@ -72,7 +72,7 @@ public interface SettingsService { */ void deleteSetting(SettingDefinition setting) throws ConfigurationError; - + public void deleteSetting(String setting) throws ConfigurationError; /** * Get the definition that is defined with the specified key. diff --git a/faroe/core/src/main/java/org/n52/faroe/SettingsServiceImpl.java b/faroe/core/src/main/java/org/n52/faroe/SettingsServiceImpl.java index 8e411899f..bc836aad5 100644 --- a/faroe/core/src/main/java/org/n52/faroe/SettingsServiceImpl.java +++ b/faroe/core/src/main/java/org/n52/faroe/SettingsServiceImpl.java @@ -81,7 +81,7 @@ public void setServiceEventBus(EventBus serviceEventBus) { public void setSettingValueFactory(SettingValueFactory settingValueFactory) { this.settingValueFactory = settingValueFactory; } - + @Inject @SuppressFBWarnings({ "EI_EXPOSE_REP2" }) public void setSettingsManagerDao(SettingsDao settingsManagerDao) { @@ -210,7 +210,7 @@ public SettingDefinition getDefinitionByTitle(String title) { return this.definitionByTitle.get(title); } - + /** * Gets the value of the setting defined by {@code key}. * @@ -290,7 +290,7 @@ public void deleteSetting(SettingDefinition setting) throws ConfigurationErro this.serviceEventBus.submit(new SettingsChangeEvent(setting, oldValue, null)); } } - + @SuppressWarnings({ "unchecked", "rawtypes" }) public void deleteSetting(String setting) throws ConfigurationError { SettingValue oldValue = this.settingsManagerDao.getSettingValue(setting); @@ -398,8 +398,8 @@ private void applySetting(String setting, SettingValue oldValue, SettingValue configurableObjectsLock.readLock().unlock(); } } - - + + private SettingValue getSettingValue(ConfigurableObject co) { return getSettingValue(co.getKey(), co.isRequired()); } diff --git a/faroe/json/pom.xml b/faroe/json/pom.xml index bca1fa530..63fe5c594 100644 --- a/faroe/json/pom.xml +++ b/faroe/json/pom.xml @@ -43,6 +43,14 @@ com.fasterxml.jackson.core jackson-databind + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.datatype + jackson-datatype-jdk8 + org.slf4j slf4j-api diff --git a/faroe/json/src/main/java/org/n52/faroe/json/AbstractJsonSettingsDao.java b/faroe/json/src/main/java/org/n52/faroe/json/AbstractJsonSettingsDao.java index 47fb000dc..291cc34d3 100644 --- a/faroe/json/src/main/java/org/n52/faroe/json/AbstractJsonSettingsDao.java +++ b/faroe/json/src/main/java/org/n52/faroe/json/AbstractJsonSettingsDao.java @@ -1,3 +1,18 @@ +/* + * Copyright (C) 2015-2022 52°North Spatial Information Research GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.n52.faroe.json; import java.util.Map.Entry; diff --git a/faroe/json/src/main/java/org/n52/faroe/json/CRUDSettingsDao.java b/faroe/json/src/main/java/org/n52/faroe/json/CRUDSettingsDao.java index fbe68bb36..5e4f0db79 100644 --- a/faroe/json/src/main/java/org/n52/faroe/json/CRUDSettingsDao.java +++ b/faroe/json/src/main/java/org/n52/faroe/json/CRUDSettingsDao.java @@ -1,3 +1,18 @@ +/* + * Copyright (C) 2015-2022 52°North Spatial Information Research GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.n52.faroe.json; import java.util.Collection; @@ -21,13 +36,14 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; public class CRUDSettingsDao extends AbstractJsonSettingsDao implements SettingsDefinitionDao { private JsonSettingsEncoder settingsEncoder; private JsonSettingsDecoder settingsDecoder; - + @Inject public void setSettingsEncoder(JsonSettingsEncoder settingsEncoder) { this.settingsEncoder = settingsEncoder; @@ -45,7 +61,7 @@ public void setSettingsDecoder(Optional settingsDecoder) { protected JsonSettingsDecoder getSettingsDecoder() { return this.settingsDecoder; } - + @Override public Set> getSettingValues() { readLock().lock(); @@ -105,12 +121,12 @@ public void deleteAll() { @Override public Collection> getAllSettings() { - + readLock().lock(); - + try { ObjectNode settings = getSettings().with("SettingDefinitions"); - + ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new Jdk8Module()); Iterator it = settings.iterator(); @@ -120,7 +136,7 @@ public Collection> getAllSettings() { list.add(mapper.treeToValue(it.next(), SettingDefinition.class)); } return list; - + }catch(JsonProcessingException e){ throw new RuntimeException(e); } @@ -135,18 +151,18 @@ public void saveSettings(Collection> settings) { settings.forEach(setting -> { saveSetting(setting); }); - + } private void saveSetting(SettingDefinition setting) { - + writeLock().lock(); try { ObjectNode settings = getSettings().with("SettingDefinitions"); ObjectMapper mapper = new ObjectMapper(); // mapper.registerModule(new Jdk8Module()); settings.set(setting.getKey(),mapper.valueToTree(setting)); - + } finally { writeLock().unlock(); } diff --git a/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingsDao.java b/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingsDao.java index 687769d50..9d7f8b08d 100644 --- a/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingsDao.java +++ b/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingsDao.java @@ -39,7 +39,7 @@ public class JsonSettingsDao extends AbstractJsonDao implements SettingsDao { private JsonSettingsEncoder settingsEncoder; private JsonSettingsDecoder settingsDecoder; - + @Inject public void setSettingsEncoder(JsonSettingsEncoder settingsEncoder) { this.settingsEncoder = settingsEncoder; @@ -57,7 +57,7 @@ public void setSettingsDecoder(Optional settingsDecoder) { protected JsonSettingsDecoder getSettingsDecoder() { return this.settingsDecoder; } - + @Override public Set> getSettingValues() { readLock().lock(); diff --git a/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingsFile.java b/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingsFile.java index 286367944..55253ba3d 100644 --- a/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingsFile.java +++ b/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingsFile.java @@ -1,3 +1,18 @@ +/* + * Copyright (C) 2015-2022 52°North Spatial Information Research GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.n52.faroe.json; @@ -31,7 +46,7 @@ public class JsonSettingsFile implements Destroyable, Producer, FileSettingsConfiguration{ - + private static final Logger LOG = LoggerFactory.getLogger(JsonSettingsFile.class); private static final String DEFAULT_FILE_NAME = "settings.json"; private static final int DEFAULT_WRITE_TIMEOUT = 1000; @@ -46,7 +61,7 @@ public class JsonSettingsFile implements Destroyable, private boolean readonly; private ConfigLocationProvider configLocationProvider; private final JsonNodeFactory nodeFactory = Json.nodeFactory(); - + public void init() { writeLock().lock(); try { @@ -68,14 +83,14 @@ public void init() { writeLock().unlock(); } } - + private Path buildPath() { if (configLocationProvider != null && configLocationProvider.get() != null) { return Paths.get(configLocationProvider.get(), WEB_INF_PATH, CONFIG_PATH, this.fileName); } return Paths.get(WEB_INF_PATH, CONFIG_PATH, this.fileName); } - + private synchronized void persist() { if (!readonly) { readLock().lock(); @@ -105,12 +120,12 @@ public void delete() { writeLock().unlock(); } } - + public void setWriteTimeout(int writeTimeout) { this.writeTimeout = writeTimeout; } - + public synchronized void setReadonly(boolean readonly) { this.readonly = readonly; } @@ -123,7 +138,7 @@ public void setConfigLocationProvider(ConfigLocationProvider configLocationProvi this.configLocationProvider = configLocationProvider; } - + @Override public Path getPath() { return this.file.toPath(); @@ -136,7 +151,7 @@ public Lock readLock() { public Lock writeLock() { return this.lock.writeLock(); } - + public void scheduleWrite() { this.debouncer.call(); } @@ -152,7 +167,7 @@ public void refresh() { writeLock().unlock(); } } - + private Optional readSettings(File f) { if (!f.exists()) { return Optional.empty(); @@ -195,4 +210,4 @@ public String toString() { return "JsonConfiguration{" + "file=" + file + '}'; } -} \ No newline at end of file +} diff --git a/faroe/rest/pom.xml b/faroe/rest/pom.xml index bcb96217c..a72210aa7 100644 --- a/faroe/rest/pom.xml +++ b/faroe/rest/pom.xml @@ -16,135 +16,142 @@ limitations under the License. --> - - 4.0.0 - + + 4.0.0 + org.n52.arctic-sea faroe-parent 9.7.0-SNAPSHOT - org.n52.arctic-sea - faroe-rest - faroe-rest - REST API for Arctic Sea - - - org.springframework.boot - spring-boot-starter-web - provided - - - org.springframework.boot - spring-boot-test - provided - - - org.springframework.boot - spring-boot - provided - - - org.json - json - 20210307 - - - org.springframework.boot - spring-boot-autoconfigure - provided - - - org.springframework.boot - spring-boot-starter-test - provided - - - org.springframework - spring-web - provided - - - org.springframework - spring-context - provided - - - org.springframework - spring-beans - provided - - - ${project.groupId} - faroe - ${project.version} - provided - - - ${project.groupId} - faroe-json - provided - - - ${project.groupId} - faroe-annotations - provided - - - ${project.groupId} - faroe-utils - provided - - - org.junit.jupiter - junit-jupiter-api - test - - - ${project.groupId} - iceland - provided - - - javax.inject - javax.inject - provided - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.core - jackson-annotations - - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.datatype - jackson-datatype-hibernate5 - - - com.fasterxml.jackson.datatype - jackson-datatype-jdk8 - - - com.googlecode.json-simple - json-simple - 1.1.1 - - + org.n52.arctic-sea + faroe-rest + faroe-rest + REST API for Arctic Sea + + + org.springframework.boot + spring-boot-starter-web + provided + + + org.springframework.boot + spring-boot-test + provided + + + org.springframework.boot + spring-boot + provided + + + org.springframework.boot + spring-boot-autoconfigure + provided + + + org.springframework.boot + spring-boot-starter-test + provided + + + org.springframework + spring-web + provided + + + org.springframework + spring-context + provided + + + org.springframework + spring-beans + provided + + + ${project.groupId} + faroe + ${project.version} + provided + + + ${project.groupId} + faroe-json + provided + + + ${project.groupId} + faroe-utils + provided + + + org.junit.jupiter + junit-jupiter-api + test + + + ${project.groupId} + iceland + provided + + + javax.inject + javax.inject + provided + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.datatype + jackson-datatype-hibernate5 + + + javax.enterprise + cdi-api + + + runtime + + + javax.enterprise + cdi-api + 1.2 + provided + + + com.fasterxml.jackson.datatype + jackson-datatype-jdk8 + runtime + + + org.n52.arctic-sea + janmayen + + + org.springframework + spring-webmvc + + - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + src/main/resources + + **/*.xml + + + + diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java index 1d456f153..9e13e7cdb 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java @@ -25,26 +25,27 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration -@EnableAutoConfiguration -@ImportResource({ "faroe.xml", "settings-service.xml", "settings-service-identification.xml", "settings-service-provider.xml" }) +@ImportResource({"classpath:/faroe.xml", + "classpath:/settings-service.xml", + "classpath:/settings-service-identification.xml", + "classpath:/settings-service-provider.xml"}) @SpringBootApplication public class SpringrestApplication { - public static void main(String[] args) { - SpringApplication.run(SpringrestApplication.class, args); + public static void main(String[] args) { + SpringApplication.run(SpringrestApplication.class, args); + } - } - - @Bean - public WebMvcConfigurer corsConfigurer() { - return new WebMvcConfigurer() { - @Override - public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/settings/groups").allowedOrigins("http://localhost:3000"); - registry.addMapping("/settings/groups/{groupTitle}").allowedOrigins("http://localhost:3000"); - } - }; - } + @Bean + public WebMvcConfigurer corsConfigurer() { + return new WebMvcConfigurer() { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/settings/groups").allowedOrigins("http://localhost:3000"); + registry.addMapping("/settings/groups/{groupTitle}").allowedOrigins("http://localhost:3000"); + } + }; + } } diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java index 67cbde690..44d10b36f 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java @@ -42,18 +42,18 @@ public class APIController { @GetMapping(path = "/settings") public Collection getSettings(){ - + return this.api.getSettings(); } - + @GetMapping(path = "/setting") public Collection> setSettings(){ - + return this.api.setSettings(); } - + @CrossOrigin(origins = "http://localhost:3000/groups") @GetMapping(path = "/settings/groups") public Set getGroups(){ @@ -83,15 +83,15 @@ public String updateSettings(@RequestBody SettingValue value) { public String deleteSetting(@PathVariable String setting) { // System.out.println(setting.getTitle()); this.api.deleteSettings(setting); - return "Deleted setting"; - } - + return "Deleted setting"; + } + @DeleteMapping(path = "/settings/deleteAll") public String deleteAllSettings() { this.api.deleteAllSettings(); return "Deleted Settings"; - + } -} \ No newline at end of file +} diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/LocalConfigLocation.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/LocalConfigLocation.java index 52a7efa86..0803d61fe 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/LocalConfigLocation.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/LocalConfigLocation.java @@ -1,3 +1,18 @@ +/* + * Copyright (C) 2015-2022 52°North Spatial Information Research GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.n52.faroeREST.springrest.settings; import org.n52.janmayen.ConfigLocationProvider; diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingAPIDao.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingAPIDao.java index d40462663..d9d94a07e 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingAPIDao.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingAPIDao.java @@ -1,10 +1,25 @@ +/* + * Copyright (C) 2015-2022 52°North Spatial Information Research GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.n52.faroeREST.springrest.settings; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; @JsonDeserialize public class SettingAPIDao { - + String title,description,href; public SettingAPIDao(String title, String description, String href) { @@ -43,5 +58,5 @@ public String toString() { return "SettingAPIDao [title=" + title + ", description=" + description + ", href=" + href + "]"; } - + } diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java index 5be9149c4..35dcabb6c 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java @@ -23,13 +23,13 @@ public interface SettingsAPI { public Collection getSettings(); - + public Collection> setSettings(); - + public Set getGroups(); public Collection> getSettingsbyTitle(String groupTitle); - + public String addSettings(Collection> group); public String updateSettings(SettingValue group); @@ -37,5 +37,5 @@ public interface SettingsAPI { public String deleteSettings(String setting); public String deleteAllSettings(); - + } diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java index c3832ad1f..de1844c2f 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java @@ -15,7 +15,6 @@ */ package org.n52.faroeREST.springrest.settings; - import java.io.File; import java.io.IOException; import java.util.*; @@ -31,113 +30,105 @@ import org.springframework.stereotype.Service; import com.fasterxml.jackson.databind.ObjectMapper; - @Service -public class SettingsAPIImpl implements InitializingBean,SettingsAPI { - - @Inject - private SettingsService service; - - @Inject - private SettingsDefinitionDao dao; - - - private Collection> titles = new ArrayList>(); - //private Collection> assignData = new ArrayList>(); - private Collection settings = new LinkedList(); - private Set groups = new HashSet(); - - - public void afterPropertiesSet() { - service.addSettings(dao.getAllSettings()); - } - - @Override - public Collection> setSettings() { - return null; - - } - - @Override - public Collection getSettings() { - - service.getSettingDefinitions().forEach(definition -> { - SettingAPIDao setting = new SettingAPIDao(definition.getGroup().getTitle(), definition.getGroup().getDescription(), "Sujit"); - if(this.settings.toArray().length == 0) { - this.settings.add(setting); - } +public class SettingsAPIImpl implements InitializingBean, SettingsAPI { + + @Inject + private SettingsService service; + + @Inject + private SettingsDefinitionDao dao; + + private Collection> titles = new ArrayList>(); + //private Collection> assignData = new ArrayList>(); + private Collection settings = new LinkedList(); + private Set groups = new HashSet(); + + public void afterPropertiesSet() { + service.addSettings(dao.getAllSettings()); + } + + @Override + public Collection> setSettings() { + return null; + + } + + @Override + public Collection getSettings() { + + service.getSettingDefinitions().forEach(definition -> { + SettingAPIDao setting = new SettingAPIDao(definition.getGroup().getTitle(), definition.getGroup() + .getDescription(), "Sujit"); + if (this.settings.toArray().length == 0) { + this.settings.add(setting); + } // System.out.println(setting); - - this.settings.forEach(definitions -> { + + this.settings.forEach(definitions -> { // System.out.println(this.service.getSettingDefinitions()); - if(definitions.getTitle()!=(definition.getGroup().getTitle())) { - this.settings.add(setting); - } - }); - - -}); + if (definitions.getTitle() != (definition.getGroup().getTitle())) { + this.settings.add(setting); + } + }); + + }); // System.out.println(this.settings.size()); - return this.settings; - } - - - @Override - public Collection> getSettingsbyTitle(String groupTitle) { - titles.clear(); - - service.getSettingDefinitions().forEach(definition -> { - if(definition.getGroup().getTitle().equalsIgnoreCase(groupTitle)) - { - - this.titles.add(definition); - } - }); - - return this.titles; - } - - @Override - public Set getGroups() { - service.getSettingDefinitions().forEach(definition -> { - - this.groups.add(definition.getGroup().getTitle()); - }); - - return this.groups; - } - - @SuppressWarnings("unchecked") - @Override - public String addSettings(Collection> group) { - dao.saveSettings(group); - service.addSettings(group); - return "Settings Added Successfully"; - } - - - @Override - public String updateSettings(SettingValue group) { - service.changeSetting(group); - return "Settings updated"; - } - - - @Override - public String deleteSettings(String setting) { - - service.deleteSetting(setting); - - return "Deleted Successfully"; - } - - - @Override - public String deleteAllSettings() { - - service.deleteAll(); - return "Everything deleted Successfully"; - } + return this.settings; + } + + @Override + public Collection> getSettingsbyTitle(String groupTitle) { + titles.clear(); + + service.getSettingDefinitions().forEach(definition -> { + if (definition.getGroup().getTitle().equalsIgnoreCase(groupTitle)) { + + this.titles.add(definition); + } + }); + + return this.titles; + } + + @Override + public Set getGroups() { + service.getSettingDefinitions().forEach(definition -> { + + this.groups.add(definition.getGroup().getTitle()); + }); + + return this.groups; + } + + @SuppressWarnings("unchecked") + @Override + public String addSettings(Collection> group) { + dao.saveSettings(group); + service.addSettings(group); + return "Settings Added Successfully"; + } + + @Override + public String updateSettings(SettingValue group) { + service.changeSetting(group); + return "Settings updated"; + } + + @Override + public String deleteSettings(String setting) { + + service.deleteSetting(setting); + + return "Deleted Successfully"; + } + + @Override + public String deleteAllSettings() { + + service.deleteAll(); + return "Everything deleted Successfully"; + } } diff --git a/faroe/rest/src/main/resources/faroe.xml b/faroe/rest/src/main/resources/faroe.xml index 45687c02c..1a93ededb 100644 --- a/faroe/rest/src/main/resources/faroe.xml +++ b/faroe/rest/src/main/resources/faroe.xml @@ -35,5 +35,5 @@ - + diff --git a/faroe/rest/src/main/resources/settings-service-identification.xml b/faroe/rest/src/main/resources/settings-service-identification.xml index c81059889..6f8f274cb 100644 --- a/faroe/rest/src/main/resources/settings-service-identification.xml +++ b/faroe/rest/src/main/resources/settings-service-identification.xml @@ -1,4 +1,21 @@ + + createStream(JsonNode node) { - return StreamSupport.stream(node.spliterator(), false); - } - - protected Stream> createEntryStream(JsonNode node) { - return StreamSupport.stream(Spliterators.spliteratorUnknownSize(node.fields(), 0), true); - } - - protected Predicate isNullOrMissing(String key) { - return n -> n.path(key).isNull() || n.path(key).isMissingNode(); - } -} diff --git a/faroe/json/src/main/java/org/n52/faroe/json/CRUDSettingsDao.java b/faroe/json/src/main/java/org/n52/faroe/json/CRUDSettingsDao.java index 5e4f0db79..293fb7af1 100644 --- a/faroe/json/src/main/java/org/n52/faroe/json/CRUDSettingsDao.java +++ b/faroe/json/src/main/java/org/n52/faroe/json/CRUDSettingsDao.java @@ -15,158 +15,61 @@ */ package org.n52.faroe.json; -import java.util.Collection; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.Module; -import java.util.Optional; -import java.util.Set; - -import javax.inject.Inject; - -import org.n52.faroe.JSONSettingConstants; -import org.n52.faroe.SettingDefinition; -import org.n52.faroe.SettingValue; -import org.n52.faroe.SettingsDao; -import org.n52.faroe.SettingsDefinitionDao; - import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; +import org.n52.faroe.JSONSettingConstants; +import org.n52.faroe.SettingDefinition; +import org.n52.faroe.SettingsDefinitionDao; -public class CRUDSettingsDao extends AbstractJsonSettingsDao implements SettingsDefinitionDao { - - private JsonSettingsEncoder settingsEncoder; - private JsonSettingsDecoder settingsDecoder; - - - @Inject - public void setSettingsEncoder(JsonSettingsEncoder settingsEncoder) { - this.settingsEncoder = settingsEncoder; - } - - protected JsonSettingsEncoder getSettingsEncoder() { - return this.settingsEncoder; - } - - @Inject - public void setSettingsDecoder(Optional settingsDecoder) { - this.settingsDecoder = settingsDecoder.isPresent() ? settingsDecoder.get() : new JsonSettingsDecoder(); - } - - protected JsonSettingsDecoder getSettingsDecoder() { - return this.settingsDecoder; - } - - @Override - public Set> getSettingValues() { - readLock().lock(); - try { - JsonNode node = getSettings().path(JSONSettingConstants.SETTINGS_KEY); - return getSettingsDecoder().decode(node); - } finally { - readLock().unlock(); - } - } - - @Override - public SettingValue getSettingValue(String key) { - readLock().lock(); - try { - JsonNode node = getSettings().path(JSONSettingConstants.SETTINGS_KEY).path(key); - if (!node.isObject()) { - return null; - } - return getSettingsDecoder().decode(key, node); - } finally { - readLock().unlock(); - } - } - - @Override - public void deleteSettingValue(String key) { - writeLock().lock(); - try { - getSettings().with(JSONSettingConstants.SETTINGS_KEY).remove(key); - } finally { - writeLock().unlock(); - } - settings().scheduleWrite(); - } - - @Override - public void saveSettingValue(SettingValue value) { - writeLock().lock(); - try { - ObjectNode settings = getSettings().with(JSONSettingConstants.SETTINGS_KEY); - JsonNode node = settings.path(value.getKey()); - ObjectNode settingNode = (ObjectNode) Optional.ofNullable(node.isObject() ? node : null) - .orElseGet(() -> settings.putObject(value.getKey())); - settingNode.put(JSONSettingConstants.TYPE_KEY, value.getType().toString()); - settingNode.set(JSONSettingConstants.VALUE_KEY, getSettingsEncoder().encodeValue(value)); - } finally { - writeLock().unlock(); - } - settings().scheduleWrite(); - } - - @Override - public void deleteAll() { - this.settings().delete(); - } - - @Override - public Collection> getAllSettings() { - - readLock().lock(); - - try { - ObjectNode settings = getSettings().with("SettingDefinitions"); - - ObjectMapper mapper = new ObjectMapper(); - mapper.registerModule(new Jdk8Module()); - Iterator it = settings.iterator(); - List> list = new LinkedList<>(); - - while(it.hasNext()) { - list.add(mapper.treeToValue(it.next(), SettingDefinition.class)); - } - return list; - - }catch(JsonProcessingException e){ - throw new RuntimeException(e); - } - finally { - readLock().unlock(); - } - } - - @Override - public void saveSettings(Collection> settings) { - - settings.forEach(setting -> { - saveSetting(setting); - }); - - } - - private void saveSetting(SettingDefinition setting) { - - writeLock().lock(); - try { - ObjectNode settings = getSettings().with("SettingDefinitions"); - ObjectMapper mapper = new ObjectMapper(); - // mapper.registerModule(new Jdk8Module()); - settings.set(setting.getKey(),mapper.valueToTree(setting)); - - } finally { - writeLock().unlock(); - } - settings().scheduleWrite(); - } +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +public class CRUDSettingsDao extends JsonSettingsDao implements SettingsDefinitionDao { + + private final ObjectMapper objectMapper = createObjectMapper(); + + @Override + public Collection> getAllSettings() { + readLock().lock(); + + try { + ObjectNode settings = getConfiguration().with(JSONSettingConstants.SETTING_DEFINITIONS); + List> list = new ArrayList<>(settings.size()); + for (JsonNode setting : settings) { + list.add(objectMapper.treeToValue(setting, SettingDefinition.class)); + } + return list; + + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } finally { + readLock().unlock(); + } + } + + @Override + public void saveSettings(Collection> settings) { + settings.forEach(this::saveSetting); + } + + private void saveSetting(SettingDefinition setting) { + writeLock().lock(); + try { + ObjectNode settings = getConfiguration().with(JSONSettingConstants.SETTING_DEFINITIONS); + settings.set(setting.getKey(), objectMapper.valueToTree(setting)); + } finally { + writeLock().unlock(); + } + configuration().scheduleWrite(); + } + + private static ObjectMapper createObjectMapper() { + ObjectMapper mapper = new ObjectMapper(); + mapper.registerModule(new Jdk8Module()); + return mapper; + } } diff --git a/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingsDao.java b/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingsDao.java index 9d7f8b08d..05d5d12db 100644 --- a/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingsDao.java +++ b/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingsDao.java @@ -15,20 +15,15 @@ */ package org.n52.faroe.json; - -import java.util.Collection; -import java.util.Optional; -import java.util.Set; - -import javax.inject.Inject; - +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import org.n52.faroe.JSONSettingConstants; - import org.n52.faroe.SettingValue; import org.n52.faroe.SettingsDao; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import javax.inject.Inject; +import java.util.Optional; +import java.util.Set; /** * @@ -51,7 +46,7 @@ protected JsonSettingsEncoder getSettingsEncoder() { @Inject public void setSettingsDecoder(Optional settingsDecoder) { - this.settingsDecoder = settingsDecoder.isPresent() ? settingsDecoder.get() : new JsonSettingsDecoder(); + this.settingsDecoder = settingsDecoder.orElseGet(JsonSettingsDecoder::new); } protected JsonSettingsDecoder getSettingsDecoder() { diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/entities/Groups.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/entities/Groups.java index 47b547867..ee87cbf11 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/entities/Groups.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/entities/Groups.java @@ -17,31 +17,38 @@ public class Groups { - private String title; - private String description; - public Groups(String title, String description) { - super(); - this.title = title; - this.description = description; - } - public Groups() { - super(); - } - public String getTitle() { - return title; - } - public void setTitle(String title) { - this.title = title; - } - public String getDescription() { - return description; - } - public void setDescription(String description) { - this.description = description; - } - @Override - public String toString() { - return "Groups [title=" + title + ", description=" + description + "]"; - } + private String title; + private String description; + + public Groups(String title, String description) { + super(); + this.title = title; + this.description = description; + } + + public Groups() { + super(); + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + @Override + public String toString() { + return "Groups [title=" + title + ", description=" + description + "]"; + } } diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/LocalConfigLocation.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/LocalConfigLocation.java index 0803d61fe..9acba5bfa 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/LocalConfigLocation.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/LocalConfigLocation.java @@ -19,9 +19,9 @@ public class LocalConfigLocation implements ConfigLocationProvider { - @Override - public String get() { - return "E:\\52 North\\arctic-sea\\faroe\\rest"; - } + @Override + public String get() { + return "E:\\52 North\\arctic-sea\\faroe\\rest"; + } } diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingAPIDao.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingAPIDao.java index d9d94a07e..ec7d070f2 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingAPIDao.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingAPIDao.java @@ -20,43 +20,44 @@ @JsonDeserialize public class SettingAPIDao { - String title,description,href; - - public SettingAPIDao(String title, String description, String href) { - super(); - this.title = title; - this.description = description; - this.href = href; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public String getHref() { - return href; - } - - public void setHref(String href) { - this.href = href; - } - - @Override - public String toString() { - return "SettingAPIDao [title=" + title + ", description=" + description + ", href=" + href + "]"; - } - + private String title; + private String description; + private String href; + + public SettingAPIDao(String title, String description, String href) { + super(); + this.title = title; + this.description = description; + this.href = href; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getHref() { + return href; + } + + public void setHref(String href) { + this.href = href; + } + + @Override + public String toString() { + return "SettingAPIDao [title=" + title + ", description=" + description + ", href=" + href + "]"; + } } diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java index de1844c2f..018872205 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java @@ -15,20 +15,19 @@ */ package org.n52.faroeREST.springrest.settings; -import java.io.File; -import java.io.IOException; -import java.util.*; -import javax.inject.Inject; -import javax.inject.Qualifier; - import org.n52.faroe.SettingDefinition; +import org.n52.faroe.SettingDefinitionGroup; import org.n52.faroe.SettingValue; import org.n52.faroe.SettingsDefinitionDao; import org.n52.faroe.SettingsService; import org.springframework.beans.factory.InitializingBean; -import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Service; -import com.fasterxml.jackson.databind.ObjectMapper; + +import javax.inject.Inject; +import java.util.Collection; +import java.util.LinkedList; +import java.util.Set; +import java.util.stream.Collectors; @Service public class SettingsAPIImpl implements InitializingBean, SettingsAPI { @@ -38,11 +37,8 @@ public class SettingsAPIImpl implements InitializingBean, SettingsAPI { @Inject private SettingsDefinitionDao dao; - - private Collection> titles = new ArrayList>(); //private Collection> assignData = new ArrayList>(); private Collection settings = new LinkedList(); - private Set groups = new HashSet(); public void afterPropertiesSet() { service.addSettings(dao.getAllSettings()); @@ -58,16 +54,17 @@ public Collection> setSettings() { public Collection getSettings() { service.getSettingDefinitions().forEach(definition -> { - SettingAPIDao setting = new SettingAPIDao(definition.getGroup().getTitle(), definition.getGroup() - .getDescription(), "Sujit"); - if (this.settings.toArray().length == 0) { + SettingAPIDao setting = new SettingAPIDao(definition.getGroup().getTitle(), + definition.getGroup().getDescription(), + "Sujit"); + if (this.settings.isEmpty()) { this.settings.add(setting); } // System.out.println(setting); this.settings.forEach(definitions -> { // System.out.println(this.service.getSettingDefinitions()); - if (definitions.getTitle() != (definition.getGroup().getTitle())) { + if (!definitions.getTitle().equals(definition.getGroup().getTitle())) { this.settings.add(setting); } }); @@ -80,26 +77,15 @@ public Collection getSettings() { @Override public Collection> getSettingsbyTitle(String groupTitle) { - titles.clear(); - - service.getSettingDefinitions().forEach(definition -> { - if (definition.getGroup().getTitle().equalsIgnoreCase(groupTitle)) { - - this.titles.add(definition); - } - }); - - return this.titles; + return service.getSettingDefinitions().stream() + .filter(definition -> definition.getGroup().getTitle().equalsIgnoreCase(groupTitle)) + .collect(Collectors.toList()); } @Override public Set getGroups() { - service.getSettingDefinitions().forEach(definition -> { - - this.groups.add(definition.getGroup().getTitle()); - }); - - return this.groups; + return service.getSettingDefinitions().stream().map(SettingDefinition::getGroup) + .map(SettingDefinitionGroup::getTitle).collect(Collectors.toSet()); } @SuppressWarnings("unchecked") @@ -118,15 +104,12 @@ public String updateSettings(SettingValue group) { @Override public String deleteSettings(String setting) { - service.deleteSetting(setting); - return "Deleted Successfully"; } @Override public String deleteAllSettings() { - service.deleteAll(); return "Everything deleted Successfully"; } From c67b889f1618f1152f71f09b56ac1a8a14e1450a Mon Sep 17 00:00:00 2001 From: Christian Autermann Date: Mon, 19 Sep 2022 14:45:44 +0200 Subject: [PATCH 14/26] api refactoring --- NOTICE | 9 +- .../springrest/controller/APIController.java | 104 ++++++++---------- .../springrest/settings/SettingAPIDao.java | 63 ----------- .../springrest/settings/SettingsAPI.java | 17 ++- .../springrest/settings/SettingsAPIImpl.java | 51 +++------ 5 files changed, 70 insertions(+), 174 deletions(-) delete mode 100644 faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingAPIDao.java diff --git a/NOTICE b/NOTICE index e12e24c0d..9a20039fe 100644 --- a/NOTICE +++ b/NOTICE @@ -70,7 +70,6 @@ This project includes: Guava InternalFutureFailureAccess and InternalFutures under The Apache Software License, Version 2.0 Guava ListenableFuture only under The Apache Software License, Version 2.0 Guava: Google Core Libraries for Java under Apache License, Version 2.0 - Hamcrest Core under BSD License 3 HdrHistogram under Public Domain, per Creative Commons CC0 HPPC Collections under The Apache Software License, Version 2.0 INSPIRE Addresses schema (spec. v4.0) under The Apache Software License, Version 2.0 @@ -104,10 +103,7 @@ This project includes: jaxb-api under CDDL 1.1 or GPL2 w/ CPE Joda-Time under Apache License, Version 2.0 JOpt Simple under The MIT License - JSON in Java under The JSON License - JSON.simple under The Apache Software License, Version 2.0 JSONLD Java :: Core under Revised BSD License - JUnit under Eclipse Public License 1.0 lang-mustache under Elastic License 2.0 or Server Side Public License, v 1 libphonenumber under The Apache Software License, Version 2.0 Lucene Common Analyzers under Apache License, Version 2.0 @@ -181,7 +177,12 @@ This project includes: Saxon-HE under Mozilla Public License Version 2.0 server under Elastic License 2.0 or Server Side Public License, v 1 SLF4J API Module under MIT License + Spring AOP under Apache License, Version 2.0 + Spring Commons Logging Bridge under Apache License, Version 2.0 Spring Context Support under Apache License, Version 2.0 + Spring Core under Apache License, Version 2.0 + Spring Expression Language (SpEL) under Apache License, Version 2.0 + Spring Web MVC under Apache License, Version 2.0 T-Digest under The Apache Software License, Version 2.0 W3C SOAP specification recommondation (v1.1) under The Apache Software License, Version 2.0 W3C SOAP specification recommondation (v1.2 part 1) under The Apache Software License, Version 2.0 diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java index 44d10b36f..e2c5b1f35 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java @@ -20,11 +20,8 @@ import org.n52.faroe.SettingDefinition; import org.n52.faroe.SettingValue; -import org.n52.faroeREST.springrest.settings.SettingAPIDao; import org.n52.faroeREST.springrest.settings.SettingsAPI; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -37,61 +34,48 @@ @RestController public class APIController { - @Autowired - private SettingsAPI api; - - @GetMapping(path = "/settings") - public Collection getSettings(){ - - return this.api.getSettings(); - - } - - @GetMapping(path = "/setting") - public Collection> setSettings(){ - - return this.api.setSettings(); - - } - - @CrossOrigin(origins = "http://localhost:3000/groups") - @GetMapping(path = "/settings/groups") - public Set getGroups(){ - - return this.api.getGroups(); - - } - - @GetMapping(path = "/settings/groups/{groupTitle}") - public Collection> getSettingsbyTitle(@PathVariable String groupTitle) { - return this.api.getSettingsbyTitle(groupTitle); - } - - @PostMapping(path = "/settings", consumes = "application/json") - public String addSettings(@RequestBody Collection> value) { - this.api.addSettings(value); - return "Added"; - } - - @PutMapping(path = "/settings", consumes = "application/json") - public String updateSettings(@RequestBody SettingValue value) { - this.api.updateSettings(value); - return "Updated"; - } - - @DeleteMapping("/settings/{setting}") - public String deleteSetting(@PathVariable String setting) { -// System.out.println(setting.getTitle()); - this.api.deleteSettings(setting); - return "Deleted setting"; - } - - - @DeleteMapping(path = "/settings/deleteAll") - public String deleteAllSettings() { - this.api.deleteAllSettings(); - return "Deleted Settings"; - - } - + @Autowired + private SettingsAPI api; + + @GetMapping(path = "/definitions") + public Collection> getSettingDefinitions() { + return this.api.getSettingDefinitions(); + + } + + @PostMapping(path = "/definitions", consumes = "application/json") + public void addSettingDefinitions(@RequestBody Collection> value) { + this.api.addSettingDefinitions(value); + } + + @CrossOrigin(origins = "http://localhost:3000/groups") + @GetMapping(path = "/definitions/groups") + public Set getGroups() { + return this.api.getGroups(); + } + + @GetMapping(path = "/definitions/groups/{groupTitle}") + public Collection> getSettingDefinitionByTitle(@PathVariable String groupTitle) { + return this.api.getSettingsByTitle(groupTitle); + } + + @PutMapping(path = "/settings", consumes = "application/json") + public void updateSettingValue(@RequestBody SettingValue value) { + this.api.updateSettingValue(value); + } + + @GetMapping("/settings") + public Collection> getSettingValues() { + return this.api.getSettingValues(); + } + + @GetMapping("/settings/{groupTitle}") + public Collection> getSettingValuesByGroup(String groupTitle) { + return this.api.getSettingValuesByGroup(groupTitle); + } + + @DeleteMapping("/settings/{setting}") + public void deleteSettingValue(@PathVariable String setting) { + this.api.deleteSettingValue(setting); + } } diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingAPIDao.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingAPIDao.java deleted file mode 100644 index ec7d070f2..000000000 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingAPIDao.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2015-2022 52°North Spatial Information Research GmbH - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.n52.faroeREST.springrest.settings; - -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; - -@JsonDeserialize -public class SettingAPIDao { - - private String title; - private String description; - private String href; - - public SettingAPIDao(String title, String description, String href) { - super(); - this.title = title; - this.description = description; - this.href = href; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public String getHref() { - return href; - } - - public void setHref(String href) { - this.href = href; - } - - @Override - public String toString() { - return "SettingAPIDao [title=" + title + ", description=" + description + ", href=" + href + "]"; - } - -} diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java index 35dcabb6c..f2871de4b 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPI.java @@ -22,20 +22,19 @@ public interface SettingsAPI { - public Collection getSettings(); + public Collection> getSettingValues(); - public Collection> setSettings(); + public Collection> getSettingDefinitions(); - public Set getGroups(); + public Set getGroups(); - public Collection> getSettingsbyTitle(String groupTitle); + public Collection> getSettingsByTitle(String groupTitle); - public String addSettings(Collection> group); + public void addSettingDefinitions(Collection> group); - public String updateSettings(SettingValue group); + public void updateSettingValue(SettingValue group); - public String deleteSettings(String setting); - - public String deleteAllSettings(); + public void deleteSettingValue(String setting); + Collection> getSettingValuesByGroup(String title); } diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java index 018872205..4ad71a3eb 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java @@ -25,7 +25,6 @@ import javax.inject.Inject; import java.util.Collection; -import java.util.LinkedList; import java.util.Set; import java.util.stream.Collectors; @@ -37,46 +36,24 @@ public class SettingsAPIImpl implements InitializingBean, SettingsAPI { @Inject private SettingsDefinitionDao dao; - //private Collection> assignData = new ArrayList>(); - private Collection settings = new LinkedList(); public void afterPropertiesSet() { service.addSettings(dao.getAllSettings()); } @Override - public Collection> setSettings() { - return null; + public Collection> getSettingDefinitions() { + return service.getSettingDefinitions(); } @Override - public Collection getSettings() { - - service.getSettingDefinitions().forEach(definition -> { - SettingAPIDao setting = new SettingAPIDao(definition.getGroup().getTitle(), - definition.getGroup().getDescription(), - "Sujit"); - if (this.settings.isEmpty()) { - this.settings.add(setting); - } -// System.out.println(setting); - - this.settings.forEach(definitions -> { -// System.out.println(this.service.getSettingDefinitions()); - if (!definitions.getTitle().equals(definition.getGroup().getTitle())) { - this.settings.add(setting); - } - }); - - }); - -// System.out.println(this.settings.size()); - return this.settings; + public Collection> getSettingValues() { + return service.getSettings().values(); } @Override - public Collection> getSettingsbyTitle(String groupTitle) { + public Collection> getSettingsByTitle(String groupTitle) { return service.getSettingDefinitions().stream() .filter(definition -> definition.getGroup().getTitle().equalsIgnoreCase(groupTitle)) .collect(Collectors.toList()); @@ -90,28 +67,26 @@ public Set getGroups() { @SuppressWarnings("unchecked") @Override - public String addSettings(Collection> group) { + public void addSettingDefinitions(Collection> group) { dao.saveSettings(group); service.addSettings(group); - return "Settings Added Successfully"; } @Override - public String updateSettings(SettingValue group) { + public void updateSettingValue(SettingValue group) { service.changeSetting(group); - return "Settings updated"; } @Override - public String deleteSettings(String setting) { + public void deleteSettingValue(String setting) { service.deleteSetting(setting); - return "Deleted Successfully"; } @Override - public String deleteAllSettings() { - service.deleteAll(); - return "Everything deleted Successfully"; + public Collection> getSettingValuesByGroup(String title) { + return service.getSettingDefinitions().stream() + .filter(definition -> definition.getGroup().getTitle().equalsIgnoreCase(title)) + .map(definition -> service.getSetting(definition)) + .collect(Collectors.toList()); } - } From c519f4d5262f67469031b882364d15e956887e95 Mon Sep 17 00:00:00 2001 From: Sujit Jaunjal <78826399+sujit-jaunjal@users.noreply.github.com> Date: Mon, 19 Sep 2022 18:17:31 +0530 Subject: [PATCH 15/26] Update SettingDefinition.java --- .../main/java/org/n52/faroe/SettingDefinition.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/faroe/core/src/main/java/org/n52/faroe/SettingDefinition.java b/faroe/core/src/main/java/org/n52/faroe/SettingDefinition.java index 334f09549..7ac1f082a 100644 --- a/faroe/core/src/main/java/org/n52/faroe/SettingDefinition.java +++ b/faroe/core/src/main/java/org/n52/faroe/SettingDefinition.java @@ -38,7 +38,18 @@ * @author Christian Autermann * @since 1.0.0 */ -@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="_class") +@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") + @JsonSubTypes({ + @Type(value = org.n52.faroe.settings.BooleanSettingDefinition.class, name = org.n52.faroe.JSONSettingConstants.BOOLEAN_TYPE), + @Type(value = org.n52.faroe.settings.StringSettingDefinition.class, name = org.n52.faroe.JSONSettingConstants.STRING_TYPE), + @Type(value = org.n52.faroe.settings.ChoiceSettingDefinition.class, name = org.n52.faroe.JSONSettingConstants.CHOICE_TYPE), + @Type(value = org.n52.faroe.settings.DateTimeSettingDefinition.class, name = org.n52.faroe.JSONSettingConstants.TIME_INSTANT_TYPE), + @Type(value = org.n52.faroe.settings.FileSettingDefinition.class, name = org.n52.faroe.JSONSettingConstants.FILE_TYPE), + @Type(value = org.n52.faroe.settings.IntegerSettingDefinition.class, name = org.n52.faroe.JSONSettingConstants.INTEGER_TYPE), + @Type(value = org.n52.faroe.settings.MultilingualStringSettingDefinition.class, name = org.n52.faroe.JSONSettingConstants.MULTILINGUAL_TYPE), + @Type(value = org.n52.faroe.settings.NumericSettingDefinition.class, name = org.n52.faroe.JSONSettingConstants.NUMBER_TYPE), + @Type(value = org.n52.faroe.settings.UriSettingDefinition.class, name = org.n52.faroe.JSONSettingConstants.URI_TYPE) + }) public interface SettingDefinition extends Ordered, Serializable { /** * @return the unique key of this definition From 20309a70f6d06796be2873290460711f5917e865 Mon Sep 17 00:00:00 2001 From: Christian Autermann Date: Mon, 19 Sep 2022 15:22:08 +0200 Subject: [PATCH 16/26] settings values --- .../java/org/n52/faroe/SettingDefinition.java | 54 ++++++++---- .../main/java/org/n52/faroe/SettingType.java | 4 + .../main/java/org/n52/faroe/SettingValue.java | 1 - .../org/n52/faroe/json/JsonSettingValue.java | 16 ++-- .../springrest/controller/APIController.java | 3 +- .../settings/LocalConfigLocation.java | 5 +- .../springrest/settings/SettingsAPIImpl.java | 85 ++++++++++++++++++- faroe/rest/src/main/resources/faroe.xml | 2 +- 8 files changed, 141 insertions(+), 29 deletions(-) diff --git a/faroe/core/src/main/java/org/n52/faroe/SettingDefinition.java b/faroe/core/src/main/java/org/n52/faroe/SettingDefinition.java index 7ac1f082a..3c3edcaff 100644 --- a/faroe/core/src/main/java/org/n52/faroe/SettingDefinition.java +++ b/faroe/core/src/main/java/org/n52/faroe/SettingDefinition.java @@ -18,38 +18,56 @@ import java.io.Serializable; import java.util.Optional; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; +import org.n52.faroe.settings.BooleanSettingDefinition; +import org.n52.faroe.settings.ChoiceSettingDefinition; +import org.n52.faroe.settings.DateTimeSettingDefinition; +import org.n52.faroe.settings.FileSettingDefinition; +import org.n52.faroe.settings.IntegerSettingDefinition; +import org.n52.faroe.settings.MultilingualStringSettingDefinition; +import org.n52.faroe.settings.NumericSettingDefinition; +import org.n52.faroe.settings.StringSettingDefinition; +import org.n52.faroe.settings.UriSettingDefinition; /** - * * Interface for setting definitions that can be used within the Service. Defined settings will be presented in the * administrator and installer view. * + * @param The type of the value + * @author Christian Autermann * @see SettingDefinitionGroup * @see SettingsService * @see org.n52.faroe.settings.FileSettingDefinition - * @see org.n52.faroe.settings.BooleanSettingDefinition + * @see BooleanSettingDefinition * @see org.n52.faroe.settings.IntegerSettingDefinition * @see org.n52.faroe.settings.NumericSettingDefinition * @see org.n52.faroe.settings.StringSettingDefinition * @see org.n52.faroe.settings.UriSettingDefinition - * @param The type of the value - * - * @author Christian Autermann * @since 1.0.0 */ -@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") - @JsonSubTypes({ - @Type(value = org.n52.faroe.settings.BooleanSettingDefinition.class, name = org.n52.faroe.JSONSettingConstants.BOOLEAN_TYPE), - @Type(value = org.n52.faroe.settings.StringSettingDefinition.class, name = org.n52.faroe.JSONSettingConstants.STRING_TYPE), - @Type(value = org.n52.faroe.settings.ChoiceSettingDefinition.class, name = org.n52.faroe.JSONSettingConstants.CHOICE_TYPE), - @Type(value = org.n52.faroe.settings.DateTimeSettingDefinition.class, name = org.n52.faroe.JSONSettingConstants.TIME_INSTANT_TYPE), - @Type(value = org.n52.faroe.settings.FileSettingDefinition.class, name = org.n52.faroe.JSONSettingConstants.FILE_TYPE), - @Type(value = org.n52.faroe.settings.IntegerSettingDefinition.class, name = org.n52.faroe.JSONSettingConstants.INTEGER_TYPE), - @Type(value = org.n52.faroe.settings.MultilingualStringSettingDefinition.class, name = org.n52.faroe.JSONSettingConstants.MULTILINGUAL_TYPE), - @Type(value = org.n52.faroe.settings.NumericSettingDefinition.class, name = org.n52.faroe.JSONSettingConstants.NUMBER_TYPE), - @Type(value = org.n52.faroe.settings.UriSettingDefinition.class, name = org.n52.faroe.JSONSettingConstants.URI_TYPE) - }) +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") +@JsonSubTypes(value = { + @JsonSubTypes.Type(value = BooleanSettingDefinition.class, + name = JSONSettingConstants.BOOLEAN_TYPE), + @JsonSubTypes.Type(value = StringSettingDefinition.class, + name = JSONSettingConstants.STRING_TYPE), + @JsonSubTypes.Type(value = ChoiceSettingDefinition.class, + name = JSONSettingConstants.CHOICE_TYPE), + @JsonSubTypes.Type(value = DateTimeSettingDefinition.class, + name = JSONSettingConstants.TIME_INSTANT_TYPE), + @JsonSubTypes.Type(value = FileSettingDefinition.class, + name = JSONSettingConstants.FILE_TYPE), + @JsonSubTypes.Type(value = IntegerSettingDefinition.class, + name = JSONSettingConstants.INTEGER_TYPE), + @JsonSubTypes.Type(value = MultilingualStringSettingDefinition.class, + name = JSONSettingConstants.MULTILINGUAL_TYPE), + @JsonSubTypes.Type(value = NumericSettingDefinition.class, + name = JSONSettingConstants.NUMBER_TYPE), + @JsonSubTypes.Type(value = UriSettingDefinition.class, + name = JSONSettingConstants.URI_TYPE) +}) public interface SettingDefinition extends Ordered, Serializable { /** * @return the unique key of this definition @@ -139,7 +157,6 @@ default SettingDefinitionGroup getGroup(SettingDefinitionGroup defaultGroup) { * Sets whether this setting is optional or can be null. By default all settings are required. * * @param optional if this setting is optional - * */ SettingDefinition setOptional(boolean optional); @@ -161,5 +178,6 @@ default SettingDefinitionGroup getGroup(SettingDefinitionGroup defaultGroup) { /** * @return the type of the value of this definition */ + @JsonIgnore SettingType getType(); } diff --git a/faroe/core/src/main/java/org/n52/faroe/SettingType.java b/faroe/core/src/main/java/org/n52/faroe/SettingType.java index b4f41484d..26a93fbd5 100644 --- a/faroe/core/src/main/java/org/n52/faroe/SettingType.java +++ b/faroe/core/src/main/java/org/n52/faroe/SettingType.java @@ -18,6 +18,8 @@ import java.io.File; import java.net.URI; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; import org.joda.time.DateTime; import org.n52.janmayen.i18n.LocalizedString; @@ -69,6 +71,7 @@ public enum SettingType { */ CHOICE; + @JsonCreator public static SettingType fromString(String type) { switch (type) { case JSONSettingConstants.INTEGER_TYPE: @@ -120,6 +123,7 @@ public static String toString(SettingType type) { } @Override + @JsonValue public String toString() { return toString(this); } diff --git a/faroe/core/src/main/java/org/n52/faroe/SettingValue.java b/faroe/core/src/main/java/org/n52/faroe/SettingValue.java index b3916bdb8..36c6903ae 100644 --- a/faroe/core/src/main/java/org/n52/faroe/SettingValue.java +++ b/faroe/core/src/main/java/org/n52/faroe/SettingValue.java @@ -27,7 +27,6 @@ * @author Christian Autermann * @since 1.0.0 */ -@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="_class") public interface SettingValue extends Serializable { /** diff --git a/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingValue.java b/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingValue.java index 7fa6e2bf8..137a5dc12 100644 --- a/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingValue.java +++ b/faroe/json/src/main/java/org/n52/faroe/json/JsonSettingValue.java @@ -17,12 +17,13 @@ import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import org.n52.faroe.SettingType; import org.n52.faroe.SettingValue; import com.google.common.base.MoreObjects; - /** * TODO JavaDoc * @@ -35,7 +36,10 @@ public class JsonSettingValue implements SettingValue { private String key; private T value; - public JsonSettingValue(SettingType type, String key, T value) { + @JsonCreator + public JsonSettingValue(@JsonProperty("type") SettingType type, + @JsonProperty("key") String key, + @JsonProperty("value") T value) { this.type = type; this.key = key; this.value = value; @@ -94,9 +98,9 @@ public int hashCode() { @Override public String toString() { return MoreObjects.toStringHelper(this) - .add("type", getType()) - .add("key", getKey()) - .add("value", getValue()) - .toString(); + .add("type", getType()) + .add("key", getKey()) + .add("value", getValue()) + .toString(); } } diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java index e2c5b1f35..c4d61316d 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java @@ -20,6 +20,7 @@ import org.n52.faroe.SettingDefinition; import org.n52.faroe.SettingValue; +import org.n52.faroe.json.JsonSettingValue; import org.n52.faroeREST.springrest.settings.SettingsAPI; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.CrossOrigin; @@ -60,7 +61,7 @@ public Collection> getSettingDefinitionByTitle(@PathVariabl } @PutMapping(path = "/settings", consumes = "application/json") - public void updateSettingValue(@RequestBody SettingValue value) { + public void updateSettingValue(@RequestBody JsonSettingValue value) { this.api.updateSettingValue(value); } diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/LocalConfigLocation.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/LocalConfigLocation.java index 9acba5bfa..47349b6e3 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/LocalConfigLocation.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/LocalConfigLocation.java @@ -17,11 +17,14 @@ import org.n52.janmayen.ConfigLocationProvider; +import java.nio.file.Path; +import java.nio.file.Paths; + public class LocalConfigLocation implements ConfigLocationProvider { @Override public String get() { - return "E:\\52 North\\arctic-sea\\faroe\\rest"; + return Paths.get(".").toAbsolutePath().toString(); } } diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java index 4ad71a3eb..e2726cb92 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java @@ -15,15 +15,22 @@ */ package org.n52.faroeREST.springrest.settings; +import org.joda.time.DateTime; import org.n52.faroe.SettingDefinition; import org.n52.faroe.SettingDefinitionGroup; +import org.n52.faroe.SettingType; import org.n52.faroe.SettingValue; import org.n52.faroe.SettingsDefinitionDao; import org.n52.faroe.SettingsService; +import org.n52.faroe.settings.ChoiceSettingDefinition; +import org.n52.janmayen.i18n.MultilingualString; import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Service; import javax.inject.Inject; +import java.io.File; +import java.io.Serializable; +import java.net.URI; import java.util.Collection; import java.util.Set; import java.util.stream.Collectors; @@ -49,7 +56,51 @@ public Collection> getSettingDefinitions() { @Override public Collection> getSettingValues() { - return service.getSettings().values(); + return service.getSettingDefinitions().stream().map(definition -> { + SettingValue setting = service.getSetting(definition.getKey()); + if (setting == null) { + if (definition.hasDefaultValue()) { + return createDefaultSettingValue(definition); + } else { + return new NullSetting(definition); + } + } + return setting; + }).collect(Collectors.toList()); + } + + private SettingValue createDefaultSettingValue(SettingDefinition definition) { + switch (definition.getType()) { + case BOOLEAN: + return service.getSettingFactory() + .newBooleanSettingValue(definition.getKey(), (Boolean) definition.getDefaultValue()); + case FILE: + return service.getSettingFactory() + .newFileSettingValue(definition.getKey(), (File) definition.getDefaultValue()); + case INTEGER: + return service.getSettingFactory() + .newIntegerSettingValue(definition.getKey(), (Integer) definition.getDefaultValue()); + case NUMERIC: + return service.getSettingFactory() + .newNumericSettingValue(definition.getKey(), (Double) definition.getDefaultValue()); + case STRING: + return service.getSettingFactory() + .newStringSettingValue(definition.getKey(), (String) definition.getDefaultValue()); + case URI: + return service.getSettingFactory() + .newUriSettingValue(definition.getKey(), (URI) definition.getDefaultValue()); + case TIMEINSTANT: + return service.getSettingFactory() + .newDateTimeSettingValue(definition.getKey(), (DateTime) definition.getDefaultValue()); + case MULTILINGUAL_STRING: + return service.getSettingFactory() + .newMultiLingualStringSettingValue(definition.getKey(), (MultilingualString) definition.getDefaultValue()); + case CHOICE: + return service.getSettingFactory() + .newChoiceSettingValue(definition.getKey(), (String) definition.getDefaultValue()); + default: + throw new IllegalArgumentException(String.format("Type %s not supported", definition.getType())); + } } @Override @@ -89,4 +140,36 @@ public Collection> getSettingValuesByGroup(String title) { .map(definition -> service.getSetting(definition)) .collect(Collectors.toList()); } + + private static class NullSetting implements SettingValue { + private final SettingDefinition definition; + + public NullSetting(SettingDefinition definition) {this.definition = definition;} + + @Override + public String getKey() { + return definition.getKey(); + } + + @Override + public Object getValue() { + return null; + } + + @Override + public void setKey(String key) { + throw new UnsupportedOperationException(); + } + + @Override + public void setValue(Object value) { + throw new UnsupportedOperationException(); + } + + @Override + public SettingType getType() { + return definition.getType(); + } + + } } diff --git a/faroe/rest/src/main/resources/faroe.xml b/faroe/rest/src/main/resources/faroe.xml index 1a93ededb..83d57df06 100644 --- a/faroe/rest/src/main/resources/faroe.xml +++ b/faroe/rest/src/main/resources/faroe.xml @@ -28,7 +28,7 @@ - + From 53c721036b677825f3eb176ff6b4d258c4c0cd59 Mon Sep 17 00:00:00 2001 From: Christian Autermann Date: Mon, 19 Sep 2022 15:28:33 +0200 Subject: [PATCH 17/26] remove obsolete line --- faroe/core/src/main/java/org/n52/faroe/SettingsServiceImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/faroe/core/src/main/java/org/n52/faroe/SettingsServiceImpl.java b/faroe/core/src/main/java/org/n52/faroe/SettingsServiceImpl.java index bc836aad5..6b03058bd 100644 --- a/faroe/core/src/main/java/org/n52/faroe/SettingsServiceImpl.java +++ b/faroe/core/src/main/java/org/n52/faroe/SettingsServiceImpl.java @@ -66,7 +66,6 @@ public class SettingsServiceImpl implements SettingsService { private final ReadWriteLock configurableObjectsLock = new ReentrantReadWriteLock(); private Set> definitions; private Map> definitionByKey; - private Map> definitionByTitle; private SettingsDao settingsManagerDao; private SettingValueFactory settingValueFactory; private EventBus serviceEventBus; From 5845e0275d7b87cb7483c101bf268daebcd67c7e Mon Sep 17 00:00:00 2001 From: Christian Autermann Date: Mon, 19 Sep 2022 15:36:49 +0200 Subject: [PATCH 18/26] do not allow to override existing defintions --- .../n52/faroeREST/springrest/settings/SettingsAPIImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java index e2726cb92..80c538d80 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/settings/SettingsAPIImpl.java @@ -119,6 +119,10 @@ public Set getGroups() { @SuppressWarnings("unchecked") @Override public void addSettingDefinitions(Collection> group) { + if (group.stream().anyMatch(settingDefinition -> service.getKeys().contains(settingDefinition.getKey()))) { + throw new IllegalArgumentException("definition already exists"); + } + dao.saveSettings(group); service.addSettings(group); } From 2c4643d8b34c650004c7b33fd4229b06ec689796 Mon Sep 17 00:00:00 2001 From: Christian Autermann Date: Tue, 20 Sep 2022 21:21:48 +0200 Subject: [PATCH 19/26] fix compile and build errors --- faroe/core/src/main/java/org/n52/faroe/SettingsService.java | 4 ---- .../src/main/java/org/n52/faroe/SettingsServiceImpl.java | 6 ------ faroe/json/pom.xml | 4 ++++ faroe/rest/pom.xml | 4 ++-- .../n52/iceland/statistics/mock/MockSettingsService.java | 5 ----- 5 files changed, 6 insertions(+), 17 deletions(-) diff --git a/faroe/core/src/main/java/org/n52/faroe/SettingsService.java b/faroe/core/src/main/java/org/n52/faroe/SettingsService.java index aca0f6d48..38a78fca8 100644 --- a/faroe/core/src/main/java/org/n52/faroe/SettingsService.java +++ b/faroe/core/src/main/java/org/n52/faroe/SettingsService.java @@ -82,11 +82,7 @@ public interface SettingsService { * @return the definition or {@code null} if there is no definition for the key */ SettingDefinition getDefinitionByKey(String key); - /** - * @return the keys for all definitions - */ - SettingDefinition getDefinitionByTitle(String title); /** * @return the titles for all definitions */ diff --git a/faroe/core/src/main/java/org/n52/faroe/SettingsServiceImpl.java b/faroe/core/src/main/java/org/n52/faroe/SettingsServiceImpl.java index 6b03058bd..cc056d7b6 100644 --- a/faroe/core/src/main/java/org/n52/faroe/SettingsServiceImpl.java +++ b/faroe/core/src/main/java/org/n52/faroe/SettingsServiceImpl.java @@ -204,12 +204,6 @@ public SettingDefinition getDefinitionByKey(String key) { return this.definitionByKey.get(key); } - @Override - public SettingDefinition getDefinitionByTitle(String title) { - return this.definitionByTitle.get(title); - } - - /** * Gets the value of the setting defined by {@code key}. * diff --git a/faroe/json/pom.xml b/faroe/json/pom.xml index 63fe5c594..5e6a94beb 100644 --- a/faroe/json/pom.xml +++ b/faroe/json/pom.xml @@ -43,6 +43,10 @@ com.fasterxml.jackson.core jackson-databind + + com.fasterxml.jackson.core + jackson-annotations + com.fasterxml.jackson.core jackson-core diff --git a/faroe/rest/pom.xml b/faroe/rest/pom.xml index a72210aa7..6b427451d 100644 --- a/faroe/rest/pom.xml +++ b/faroe/rest/pom.xml @@ -102,8 +102,8 @@ provided - com.fasterxml.jackson.core - jackson-databind + joda-time + joda-time com.fasterxml.jackson.datatype diff --git a/iceland/statistics/core/src/test/java/org/n52/iceland/statistics/mock/MockSettingsService.java b/iceland/statistics/core/src/test/java/org/n52/iceland/statistics/mock/MockSettingsService.java index 94128d5ff..a2d253d80 100644 --- a/iceland/statistics/core/src/test/java/org/n52/iceland/statistics/mock/MockSettingsService.java +++ b/iceland/statistics/core/src/test/java/org/n52/iceland/statistics/mock/MockSettingsService.java @@ -53,11 +53,6 @@ public SettingDefinition getDefinitionByKey(String key) { throw new UnsupportedOperationException(); } - @Override - public SettingDefinition getDefinitionByTitle(String title) { - return null; - } - @Override public Set getKeys() { throw new UnsupportedOperationException(); From 28d4518d44748727bd5d549c955e9e9e8081e01c Mon Sep 17 00:00:00 2001 From: Christian Autermann Date: Tue, 20 Sep 2022 21:54:12 +0200 Subject: [PATCH 20/26] better encoding for localized strings --- .../java/org/n52/faroe/SettingDefinition.java | 1 + .../n52/janmayen/i18n/LocalizedString.java | 13 +++++++--- .../n52/janmayen/i18n/MultilingualString.java | 26 ++++++++++++++----- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/faroe/core/src/main/java/org/n52/faroe/SettingDefinition.java b/faroe/core/src/main/java/org/n52/faroe/SettingDefinition.java index 3c3edcaff..673a0f97e 100644 --- a/faroe/core/src/main/java/org/n52/faroe/SettingDefinition.java +++ b/faroe/core/src/main/java/org/n52/faroe/SettingDefinition.java @@ -94,6 +94,7 @@ public interface SettingDefinition extends Ordered, Serializable { */ T getDefaultValue(); + @JsonIgnore default Optional getOptionalDefaultValue() { if (hasDefaultValue()) { return Optional.of(getDefaultValue()); diff --git a/janmayen/src/main/java/org/n52/janmayen/i18n/LocalizedString.java b/janmayen/src/main/java/org/n52/janmayen/i18n/LocalizedString.java index 93dcbf7bb..f0f0f5019 100644 --- a/janmayen/src/main/java/org/n52/janmayen/i18n/LocalizedString.java +++ b/janmayen/src/main/java/org/n52/janmayen/i18n/LocalizedString.java @@ -19,6 +19,9 @@ import java.util.Locale; import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import com.google.common.base.Strings; @@ -40,7 +43,8 @@ public LocalizedString(String value) { this(null, value); } - public LocalizedString(Locale lang, String value) { + @JsonCreator + public LocalizedString(@JsonProperty("lang") Locale lang, @JsonProperty("lang") String value) { Preconditions.checkArgument(!Strings.isNullOrEmpty(value)); this.text = value; this.lang = lang == null ? NULL_LOCALE : lang; @@ -61,6 +65,7 @@ public Locale getLang() { return this.lang; } + @JsonIgnore public String getLangString() { String country = this.lang.getISO3Country(); String language = this.lang.getISO3Language(); @@ -74,9 +79,9 @@ public String getLangString() { @Override public String toString() { return MoreObjects.toStringHelper(this) - .add("lang", getLang()) - .add("text", getText()) - .toString(); + .add("lang", getLang()) + .add("text", getText()) + .toString(); } @Override diff --git a/janmayen/src/main/java/org/n52/janmayen/i18n/MultilingualString.java b/janmayen/src/main/java/org/n52/janmayen/i18n/MultilingualString.java index 0a5561592..cd4699381 100644 --- a/janmayen/src/main/java/org/n52/janmayen/i18n/MultilingualString.java +++ b/janmayen/src/main/java/org/n52/janmayen/i18n/MultilingualString.java @@ -25,7 +25,13 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.stream.Collectors; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonGetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.JsonValue; import org.n52.janmayen.Optionals; import org.n52.janmayen.stream.StreamingIterable; @@ -118,19 +124,27 @@ public MultilingualString setLocalizations(Map localizations) { return this; } + @JsonValue + private Map getLocalizationsJSON() { + return this.localizations.values().stream() + .collect(Collectors.toMap(e -> LocaleHelper.encode(e.getLang()), LocalizedString::getText)); + } + public MultilingualString only(Locale... locale) { return only(Arrays.asList(locale)); } public MultilingualString only(Iterable locales) { MultilingualString mls = new MultilingualString(); - for (Locale locale : locales) { - Optional localization = getLocalization(locale); - if (localization.isPresent()) { - mls.addLocalization(localization.get()); - } - } + locales.forEach(locale -> getLocalization(locale).ifPresent(mls::addLocalization)); return mls; } + @JsonCreator + private static MultilingualString fromStringMap(Map localizations) { + MultilingualString ms = new MultilingualString(); + ms.setLocalizations(localizations); + return ms; + } + } From f7391e4b47edaeeb496b985c875d3f0f494fcc51 Mon Sep 17 00:00:00 2001 From: Sujit Jaunjal <78826399+sujit-jaunjal@users.noreply.github.com> Date: Thu, 22 Sep 2022 03:25:42 +0530 Subject: [PATCH 21/26] Create sudoku_solver.cpp --- faroe/rest/rest-ui/sudoku_solver.cpp | 1 + 1 file changed, 1 insertion(+) create mode 100644 faroe/rest/rest-ui/sudoku_solver.cpp diff --git a/faroe/rest/rest-ui/sudoku_solver.cpp b/faroe/rest/rest-ui/sudoku_solver.cpp new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/faroe/rest/rest-ui/sudoku_solver.cpp @@ -0,0 +1 @@ + From d135d473caec0767f069baf534a4f648520ebb82 Mon Sep 17 00:00:00 2001 From: Sujit Jaunjal <78826399+sujit-jaunjal@users.noreply.github.com> Date: Thu, 22 Sep 2022 03:26:11 +0530 Subject: [PATCH 22/26] Delete sudoku_solver.cpp --- faroe/rest/rest-ui/sudoku_solver.cpp | 1 - 1 file changed, 1 deletion(-) delete mode 100644 faroe/rest/rest-ui/sudoku_solver.cpp diff --git a/faroe/rest/rest-ui/sudoku_solver.cpp b/faroe/rest/rest-ui/sudoku_solver.cpp deleted file mode 100644 index 8b1378917..000000000 --- a/faroe/rest/rest-ui/sudoku_solver.cpp +++ /dev/null @@ -1 +0,0 @@ - From 9615da590fdb516e34de45b7e87c5b8935927002 Mon Sep 17 00:00:00 2001 From: Sujit Jaunjal Date: Thu, 22 Sep 2022 19:12:23 +0530 Subject: [PATCH 23/26] Added the UI for FAROE REST API --- faroe/rest/.gitignore | 1 + faroe/rest/rest-ui | 1 + .../n52/faroeREST/springrest/SpringrestApplication.java | 7 +++++-- 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 faroe/rest/.gitignore create mode 160000 faroe/rest/rest-ui diff --git a/faroe/rest/.gitignore b/faroe/rest/.gitignore new file mode 100644 index 000000000..b83d22266 --- /dev/null +++ b/faroe/rest/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/faroe/rest/rest-ui b/faroe/rest/rest-ui new file mode 160000 index 000000000..7757310c4 --- /dev/null +++ b/faroe/rest/rest-ui @@ -0,0 +1 @@ +Subproject commit 7757310c4a9ffcc4c83cee2c1eab92a3cfb77cdb diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java index 9e13e7cdb..d11dabb85 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java @@ -40,10 +40,13 @@ public static void main(String[] args) { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { + + @Override public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/settings/groups").allowedOrigins("http://localhost:3000"); - registry.addMapping("/settings/groups/{groupTitle}").allowedOrigins("http://localhost:3000"); + registry.addMapping("/**") + .allowedOrigins("http://localhost:3000") + .allowedMethods("GET","PUT", "POST", "DELETE"); } }; } From 86ec38b1df01d9cf87fd9fa565ef5ca42ecf627c Mon Sep 17 00:00:00 2001 From: Sujit Jaunjal Date: Sat, 24 Sep 2022 01:09:56 +0530 Subject: [PATCH 24/26] Final cleanup for REST API --- faroe/rest/rest-ui | 1 - .../org/n52/faroeREST/springrest/controller/APIController.java | 1 - 2 files changed, 2 deletions(-) delete mode 160000 faroe/rest/rest-ui diff --git a/faroe/rest/rest-ui b/faroe/rest/rest-ui deleted file mode 160000 index 7757310c4..000000000 --- a/faroe/rest/rest-ui +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7757310c4a9ffcc4c83cee2c1eab92a3cfb77cdb diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java index c4d61316d..b32611725 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/controller/APIController.java @@ -49,7 +49,6 @@ public void addSettingDefinitions(@RequestBody Collection> this.api.addSettingDefinitions(value); } - @CrossOrigin(origins = "http://localhost:3000/groups") @GetMapping(path = "/definitions/groups") public Set getGroups() { return this.api.getGroups(); From b5a0d3e78f0614c54d464c69ff25f84036d3a1e8 Mon Sep 17 00:00:00 2001 From: Sujit Jaunjal Date: Mon, 3 Apr 2023 12:26:02 +0530 Subject: [PATCH 25/26] Updated Springrest and other files --- faroe/rest/WEB-INF/config/configuration.json | 62 +++++++++++++++++++ .../springrest/SpringrestApplication.java | 4 +- 2 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 faroe/rest/WEB-INF/config/configuration.json diff --git a/faroe/rest/WEB-INF/config/configuration.json b/faroe/rest/WEB-INF/config/configuration.json new file mode 100644 index 000000000..1001ff1bd --- /dev/null +++ b/faroe/rest/WEB-INF/config/configuration.json @@ -0,0 +1,62 @@ +{ + "settingDefinitions" : { + "serviceProvider.isrequired" : { + "type" : "boolean", + "order" : 0.0, + "optional" : true, + "title" : "Required", + "description" : "Is this field required", + "group" : { + "order" : 0.0, + "title" : "Service Provider", + "description" : null, + "showInDefaultSettings" : true + }, + "defaultValue" : true, + "key" : "serviceProvider.isrequired", + "optionalDefaultValue" : true + }, + "serviceProvider.eval" : { + "type" : "boolean", + "order" : 0.0, + "optional" : true, + "title" : "Eval", + "description" : "Project eval for GSOC22", + "group" : { + "order" : 0.0, + "title" : "Service Provider", + "description" : null, + "showInDefaultSettings" : true + }, + "defaultValue" : false, + "key" : "serviceProvider.eval", + "optionalDefaultValue" : false + }, + "serviceProvider.evaluation" : { + "type" : "string", + "order" : 0.0, + "optional" : true, + "title" : "Eval", + "description" : "Project eval for GSOC22", + "group" : { + "order" : 0.0, + "title" : "Service Provider", + "description" : null, + "showInDefaultSettings" : true + }, + "defaultValue" : "Pass/Fail", + "key" : "serviceProvider.evaluation", + "optionalDefaultValue" : "Pass/Fail" + } + }, + "settings" : { + "serviceProvider.isrequired" : { + "type" : "boolean", + "value" : false + }, + "serviceProvider.eval" : { + "type" : "boolean", + "value" : true + } + } +} \ No newline at end of file diff --git a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java index d11dabb85..dcfe5e83a 100644 --- a/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java +++ b/faroe/rest/src/main/java/org/n52/faroeREST/springrest/SpringrestApplication.java @@ -40,8 +40,8 @@ public static void main(String[] args) { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { - - + + @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") From 3f8dc09f8d574e35c313ba9c4ae413e6ee521c6b Mon Sep 17 00:00:00 2001 From: sameer Date: Mon, 3 Apr 2023 18:58:57 +0530 Subject: [PATCH 26/26] Added setup steps for the Faroe Settings API --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 42eaa8a0f..f8cf7029b 100644 --- a/README.md +++ b/README.md @@ -237,3 +237,12 @@ The development of the 52°North Arctic Sea implementation was supported by se | [![BMVI](https://raw.githubusercontent.com/52North/arctic-sea/master/etc/images/bmvi-logo.png)](https://www.bmvi.de/)[![mFund](https://raw.githubusercontent.com/52North/arctic-sea/master/etc/images/mfund-logo.jpg)](https://www.bmvi.de/DE/Themen/Digitales/mFund/Ueberblick/ueberblick.html)[![WaCoDis](https://raw.githubusercontent.com/52North/arctic-sea/master/etc/images/wacodis-logo.png)](http://wacodis.fbg-hsbo.de/) | The development of this version of 52°North Arctic Sea was supported by the [German Federal Ministry of of Transport and Digital Infrastructure](https://www.bmvi.de/) research project [WaCoDis](http://wacodis.fbg-hsbo.de/) (co-funded by the German Federal Ministry of Transport and Digital Infrastructure, programme mFund) | | [![BMBF](https://raw.githubusercontent.com/52North/arctic-sea/master/etc/images/bmbf-logo.png)](https://www.bmbf.de/)[![fona](https://raw.githubusercontent.com/52North/arctic-sea/master/etc/images/fona-logo.png)](https://www.fona.de/)[![MuDak-WRM](https://raw.githubusercontent.com/52North/arctic-sea/master/etc/images/mudak-wrm-logo.png)](http://www.mudak-wrm.kit.edu/) | The development of this version of 52°North Arctic Sea was supported by the [German Federal Ministry of Education and Research](https://www.bmbf.de/) research project [MuDak-WRM](http://www.mudak-wrm.kit.edu/) (co-funded by the German Federal Ministry of Education and Research, programme [fona](https://www.fona.de/)) | | [![BRIDGES](https://raw.githubusercontent.com/52North/arctic-sea/master/etc/images/bridges-logo.jpg)](http://www.bridges-h2020.eu/)| The development of this version of the 52°North Arctic Sea was supported by the [Horizon 2020](https://ec.europa.eu/programmes/horizon2020/) research project [BRIDGES](http://www.bridges-h2020.eu/) (co-funded by the European Commission under the grant agreement n°635359) + +
+ +## Steps to Run Faroe REST Backend---------> + + - 1. Open the project in a Java IDE (Ecplise or intellij) + - 2. Go to the faroe--->rest--->src/main/java/--->org.n52.faroeREST.springrest--->SpringrestApplication.java + - 3. Run this file as a Java Application + - (The above steps aresufficient, however, If you encounter any error, then try: maven clean ---> maven build ---> update project---> and repeat step 3) \ No newline at end of file