diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml new file mode 100644 index 0000000000..81ff760025 --- /dev/null +++ b/.github/workflows/maven.yml @@ -0,0 +1,32 @@ +name: CI/CD Pipeline + +on: + push: + branches: + - master + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout Repository + uses: actions/checkout@v2 + + - name: Set up Java + uses: actions/setup-java@v2 + with: + java-version: '17' + distribution: 'adopt' + maven-version: '3.8.4' + + - name: Build and Test + run: | + mvn clean install + + - name: Upload JAR + uses: actions/upload-artifact@v2 + with: + name: app-jar + path: target/*.jar + diff --git a/TourGuide/mvnw b/TourGuide/mvnw deleted file mode 100644 index 66df285428..0000000000 --- a/TourGuide/mvnw +++ /dev/null @@ -1,308 +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. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Apache Maven Wrapper startup batch script, version 3.2.0 -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /usr/local/etc/mavenrc ] ; then - . /usr/local/etc/mavenrc - fi - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "$(uname)" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME - else - JAVA_HOME="/Library/Java/Home"; export JAVA_HOME - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=$(java-config --jre-home) - fi -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$JAVA_HOME" ] && - JAVA_HOME=$(cygpath --unix "$JAVA_HOME") - [ -n "$CLASSPATH" ] && - CLASSPATH=$(cygpath --path --unix "$CLASSPATH") -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && - JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="$(which javac)" - if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=$(which readlink) - if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then - if $darwin ; then - javaHome="$(dirname "\"$javaExecutable\"")" - javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" - else - javaExecutable="$(readlink -f "\"$javaExecutable\"")" - fi - javaHome="$(dirname "\"$javaExecutable\"")" - javaHome=$(expr "$javaHome" : '\(.*\)/bin') - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=$(cd "$wdir/.." || exit 1; pwd) - fi - # end of workaround - done - printf '%s' "$(cd "$basedir" || exit 1; pwd)" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - # Remove \r in case we run on Windows within Git Bash - # and check out the repository with auto CRLF management - # enabled. Otherwise, we may read lines that are delimited with - # \r\n and produce $'-Xarg\r' rather than -Xarg due to word - # splitting rules. - tr -s '\r\n' ' ' < "$1" - fi -} - -log() { - if [ "$MVNW_VERBOSE" = true ]; then - printf '%s\n' "$1" - fi -} - -BASE_DIR=$(find_maven_basedir "$(dirname "$0")") -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR -log "$MAVEN_PROJECTBASEDIR" - -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" -if [ -r "$wrapperJarPath" ]; then - log "Found $wrapperJarPath" -else - log "Couldn't find $wrapperJarPath, downloading it ..." - - if [ -n "$MVNW_REPOURL" ]; then - wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - else - wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - fi - while IFS="=" read -r key value; do - # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) - safeValue=$(echo "$value" | tr -d '\r') - case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; - esac - done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" - log "Downloading from: $wrapperUrl" - - if $cygwin; then - wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") - fi - - if command -v wget > /dev/null; then - log "Found wget ... using wget" - [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" - else - wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - log "Found curl ... using curl" - [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" - else - curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" - fi - else - log "Falling back to using Java to download" - javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" - javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaSource=$(cygpath --path --windows "$javaSource") - javaClass=$(cygpath --path --windows "$javaClass") - fi - if [ -e "$javaSource" ]; then - if [ ! -e "$javaClass" ]; then - log " - Compiling MavenWrapperDownloader.java ..." - ("$JAVA_HOME/bin/javac" "$javaSource") - fi - if [ -e "$javaClass" ]; then - log " - Running MavenWrapperDownloader.java ..." - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -# If specified, validate the SHA-256 sum of the Maven wrapper jar file -wrapperSha256Sum="" -while IFS="=" read -r key value; do - case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; - esac -done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" -if [ -n "$wrapperSha256Sum" ]; then - wrapperSha256Result=false - if command -v sha256sum > /dev/null; then - if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then - wrapperSha256Result=true - fi - elif command -v shasum > /dev/null; then - if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then - wrapperSha256Result=true - fi - else - echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." - echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." - exit 1 - fi - if [ $wrapperSha256Result = false ]; then - echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 - echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 - echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 - exit 1 - fi -fi - -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$JAVA_HOME" ] && - JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") - [ -n "$CLASSPATH" ] && - CLASSPATH=$(cygpath --path --windows "$CLASSPATH") - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") -fi - -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -# shellcheck disable=SC2086 # safe args -exec "$JAVACMD" \ - $MAVEN_OPTS \ - $MAVEN_DEBUG_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/TourGuide/mvnw.cmd b/TourGuide/mvnw.cmd deleted file mode 100644 index 95ba6f54ac..0000000000 --- a/TourGuide/mvnw.cmd +++ /dev/null @@ -1,205 +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 Apache Maven Wrapper startup batch script, version 3.2.0 -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* -if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - -FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %WRAPPER_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file -SET WRAPPER_SHA_256_SUM="" -FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B -) -IF NOT %WRAPPER_SHA_256_SUM%=="" ( - powershell -Command "&{"^ - "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ - "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ - " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ - " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ - " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ - " exit 1;"^ - "}"^ - "}" - if ERRORLEVEL 1 goto error -) - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% ^ - %JVM_CONFIG_MAVEN_PROPS% ^ - %MAVEN_OPTS% ^ - %MAVEN_DEBUG_OPTS% ^ - -classpath %WRAPPER_JAR% ^ - "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ - %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" -if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%"=="on" pause - -if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% - -cmd /C exit /B %ERROR_CODE% diff --git a/TourGuide/readme.md b/TourGuide/readme.md deleted file mode 100644 index ed94ac4763..0000000000 --- a/TourGuide/readme.md +++ /dev/null @@ -1,12 +0,0 @@ -# Technologies - -> Java 17 -> Spring Boot 3.X -> JUnit 5 - -# How to have gpsUtil, rewardCentral and tripPricer dependencies available ? - -> Run : -- mvn install:install-file -Dfile=/libs/gpsUtil.jar -DgroupId=gpsUtil -DartifactId=gpsUtil -Dversion=1.0.0 -Dpackaging=jar -- mvn install:install-file -Dfile=/libs/RewardCentral.jar -DgroupId=rewardCentral -DartifactId=rewardCentral -Dversion=1.0.0 -Dpackaging=jar -- mvn install:install-file -Dfile=/libs/TripPricer.jar -DgroupId=tripPricer -DartifactId=tripPricer -Dversion=1.0.0 -Dpackaging=jar diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/service/RewardsService.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/service/RewardsService.java deleted file mode 100644 index ad440eb484..0000000000 --- a/TourGuide/src/main/java/com/openclassrooms/tourguide/service/RewardsService.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.openclassrooms.tourguide.service; - -import java.util.List; - -import org.springframework.stereotype.Service; - -import gpsUtil.GpsUtil; -import gpsUtil.location.Attraction; -import gpsUtil.location.Location; -import gpsUtil.location.VisitedLocation; -import rewardCentral.RewardCentral; -import com.openclassrooms.tourguide.user.User; -import com.openclassrooms.tourguide.user.UserReward; - -@Service -public class RewardsService { - private static final double STATUTE_MILES_PER_NAUTICAL_MILE = 1.15077945; - - // proximity in miles - private int defaultProximityBuffer = 10; - private int proximityBuffer = defaultProximityBuffer; - private int attractionProximityRange = 200; - private final GpsUtil gpsUtil; - private final RewardCentral rewardsCentral; - - public RewardsService(GpsUtil gpsUtil, RewardCentral rewardCentral) { - this.gpsUtil = gpsUtil; - this.rewardsCentral = rewardCentral; - } - - public void setProximityBuffer(int proximityBuffer) { - this.proximityBuffer = proximityBuffer; - } - - public void setDefaultProximityBuffer() { - proximityBuffer = defaultProximityBuffer; - } - - public void calculateRewards(User user) { - List userLocations = user.getVisitedLocations(); - List attractions = gpsUtil.getAttractions(); - - for(VisitedLocation visitedLocation : userLocations) { - for(Attraction attraction : attractions) { - if(user.getUserRewards().stream().filter(r -> r.attraction.attractionName.equals(attraction.attractionName)).count() == 0) { - if(nearAttraction(visitedLocation, attraction)) { - user.addUserReward(new UserReward(visitedLocation, attraction, getRewardPoints(attraction, user))); - } - } - } - } - } - - public boolean isWithinAttractionProximity(Attraction attraction, Location location) { - return getDistance(attraction, location) > attractionProximityRange ? false : true; - } - - private boolean nearAttraction(VisitedLocation visitedLocation, Attraction attraction) { - return getDistance(attraction, visitedLocation.location) > proximityBuffer ? false : true; - } - - private int getRewardPoints(Attraction attraction, User user) { - return rewardsCentral.getAttractionRewardPoints(attraction.attractionId, user.getUserId()); - } - - public double getDistance(Location loc1, Location loc2) { - double lat1 = Math.toRadians(loc1.latitude); - double lon1 = Math.toRadians(loc1.longitude); - double lat2 = Math.toRadians(loc2.latitude); - double lon2 = Math.toRadians(loc2.longitude); - - double angle = Math.acos(Math.sin(lat1) * Math.sin(lat2) - + Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon1 - lon2)); - - double nauticalMiles = 60 * Math.toDegrees(angle); - double statuteMiles = STATUTE_MILES_PER_NAUTICAL_MILE * nauticalMiles; - return statuteMiles; - } - -} diff --git a/TourGuide/libs/RewardCentral.jar b/libs/RewardCentral.jar similarity index 100% rename from TourGuide/libs/RewardCentral.jar rename to libs/RewardCentral.jar diff --git a/TourGuide/libs/TripPricer.jar b/libs/TripPricer.jar similarity index 100% rename from TourGuide/libs/TripPricer.jar rename to libs/TripPricer.jar diff --git a/TourGuide/libs/gpsUtil.jar b/libs/gpsUtil.jar similarity index 100% rename from TourGuide/libs/gpsUtil.jar rename to libs/gpsUtil.jar diff --git a/TourGuide/pom.xml b/pom.xml similarity index 85% rename from TourGuide/pom.xml rename to pom.xml index d3aaeeb349..ed42a98f31 100644 --- a/TourGuide/pom.xml +++ b/pom.xml @@ -72,6 +72,18 @@ org.springframework.boot spring-boot-maven-plugin + + org.apache.maven.plugins + maven-jar-plugin + 3.1.0 + + + + com.openclassrooms.tourguide.TourguideApplication + + + + diff --git a/readme.md b/readme.md new file mode 100644 index 0000000000..180666a159 --- /dev/null +++ b/readme.md @@ -0,0 +1,12 @@ +# Technologies + +> Java 17 +> Spring Boot 3.X +> JUnit 5 + +# How to have gpsUtil, rewardCentral and tripPricer dependencies available ? + +> Run : +mvn install:install-file -Dfile=./libs/TripPricer.jar -DgroupId=tripPricer -DartifactId=tripPricer -Dversion=1.0.0 -Dpackaging=jar +mvn install:install-file -Dfile=./libs/gpsUtil.jar -DgroupId=gpsUtil -DartifactId=gpsUtil -Dversion=1.0.0 -Dpackaging=jar +mvn install:install-file -Dfile=./libs/RewardCentral.jar -DgroupId=rewardCentral -DartifactId=rewardCentral -Dversion=1.0.0 -Dpackaging=jar diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/TourguideApplication.java b/src/main/java/com/openclassrooms/tourguide/TourguideApplication.java similarity index 100% rename from TourGuide/src/main/java/com/openclassrooms/tourguide/TourguideApplication.java rename to src/main/java/com/openclassrooms/tourguide/TourguideApplication.java diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/TourGuideModule.java b/src/main/java/com/openclassrooms/tourguide/config/TourGuideModule.java similarity index 92% rename from TourGuide/src/main/java/com/openclassrooms/tourguide/TourGuideModule.java rename to src/main/java/com/openclassrooms/tourguide/config/TourGuideModule.java index 8c005856d7..650b4fbaf9 100644 --- a/TourGuide/src/main/java/com/openclassrooms/tourguide/TourGuideModule.java +++ b/src/main/java/com/openclassrooms/tourguide/config/TourGuideModule.java @@ -1,4 +1,4 @@ -package com.openclassrooms.tourguide; +package com.openclassrooms.tourguide.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/TourGuideController.java b/src/main/java/com/openclassrooms/tourguide/controller/TourGuideController.java similarity index 61% rename from TourGuide/src/main/java/com/openclassrooms/tourguide/TourGuideController.java rename to src/main/java/com/openclassrooms/tourguide/controller/TourGuideController.java index a884e6590b..5459c60e76 100644 --- a/TourGuide/src/main/java/com/openclassrooms/tourguide/TourGuideController.java +++ b/src/main/java/com/openclassrooms/tourguide/controller/TourGuideController.java @@ -1,18 +1,18 @@ -package com.openclassrooms.tourguide; +package com.openclassrooms.tourguide.controller; import java.util.List; +import com.openclassrooms.tourguide.model.NearbyAttraction; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import gpsUtil.location.Attraction; import gpsUtil.location.VisitedLocation; import com.openclassrooms.tourguide.service.TourGuideService; -import com.openclassrooms.tourguide.user.User; -import com.openclassrooms.tourguide.user.UserReward; +import com.openclassrooms.tourguide.model.User; +import com.openclassrooms.tourguide.model.UserReward; import tripPricer.Provider; @@ -31,20 +31,11 @@ public String index() { public VisitedLocation getLocation(@RequestParam String userName) { return tourGuideService.getUserLocation(getUser(userName)); } - - // TODO: Change this method to no longer return a List of Attractions. - // Instead: Get the closest five tourist attractions to the user - no matter how far away they are. - // Return a new JSON object that contains: - // Name of Tourist attraction, - // Tourist attractions lat/long, - // The user's location lat/long, - // The distance in miles between the user's location and each of the attractions. - // The reward points for visiting each Attraction. - // Note: Attraction reward points can be gathered from RewardsCentral + @RequestMapping("/getNearbyAttractions") - public List getNearbyAttractions(@RequestParam String userName) { + public List getNearbyAttractions(@RequestParam String userName) { VisitedLocation visitedLocation = tourGuideService.getUserLocation(getUser(userName)); - return tourGuideService.getNearByAttractions(visitedLocation); + return tourGuideService.getFiveNearestAttractions(visitedLocation, getUser(userName)); } @RequestMapping("/getRewards") diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/helper/InternalTestHelper.java b/src/main/java/com/openclassrooms/tourguide/helper/InternalTestHelper.java similarity index 100% rename from TourGuide/src/main/java/com/openclassrooms/tourguide/helper/InternalTestHelper.java rename to src/main/java/com/openclassrooms/tourguide/helper/InternalTestHelper.java diff --git a/src/main/java/com/openclassrooms/tourguide/model/NearbyAttraction.java b/src/main/java/com/openclassrooms/tourguide/model/NearbyAttraction.java new file mode 100644 index 0000000000..1ce57e8eab --- /dev/null +++ b/src/main/java/com/openclassrooms/tourguide/model/NearbyAttraction.java @@ -0,0 +1,91 @@ +package com.openclassrooms.tourguide.model; + + + +public class NearbyAttraction { + // Name of Tourist attraction, + private String name; + // Tourist attractions lat/long, + private double attractionLatitude; + private double attractionLongitude; + + // The user's location lat/long, + private double userLatitude; + private double userLongitude; + // The distance in miles between the user's location and each of the attractions. + private double distance; + // The reward points for visiting each Attraction. + private int rewards; + + public NearbyAttraction(String name, + double attractionLatitude, + double attractionLongitude, + double userLatitude, + double userLongitude, + double distance, + int rewards) { + this.name = name; + this.attractionLatitude = attractionLatitude; + this.attractionLongitude = attractionLongitude; + this.userLatitude = userLatitude; + this.userLongitude = userLongitude; + this.distance = distance; + this.rewards = rewards; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public double getAttractionLatitude() { + return attractionLatitude; + } + + public void setAttractionLatitude(double attractionLatitude) { + this.attractionLatitude = attractionLatitude; + } + + public double getAttractionLongitude() { + return attractionLongitude; + } + + public void setAttractionLongitude(double attractionLongitude) { + this.attractionLongitude = attractionLongitude; + } + + public double getUserLatitude() { + return userLatitude; + } + + public void setUserLatitude(double userLatitude) { + this.userLatitude = userLatitude; + } + + public double getUserLongitude() { + return userLongitude; + } + + public void setUserLongitude(double userLongitude) { + this.userLongitude = userLongitude; + } + + public double getDistance() { + return distance; + } + + public void setDistance(double distance) { + this.distance = distance; + } + + public int getRewards() { + return rewards; + } + + public void setRewards(int rewards) { + this.rewards = rewards; + } +} diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/user/User.java b/src/main/java/com/openclassrooms/tourguide/model/User.java similarity index 93% rename from TourGuide/src/main/java/com/openclassrooms/tourguide/user/User.java rename to src/main/java/com/openclassrooms/tourguide/model/User.java index 32ed3b14ea..b0a9422fc9 100644 --- a/TourGuide/src/main/java/com/openclassrooms/tourguide/user/User.java +++ b/src/main/java/com/openclassrooms/tourguide/model/User.java @@ -1,4 +1,4 @@ -package com.openclassrooms.tourguide.user; +package com.openclassrooms.tourguide.model; import java.util.ArrayList; import java.util.Date; @@ -70,7 +70,7 @@ public void clearVisitedLocations() { } public void addUserReward(UserReward userReward) { - if(userRewards.stream().filter(r -> !r.attraction.attractionName.equals(userReward.attraction)).count() == 0) { + if(userRewards.stream().noneMatch(r -> r.getAttractionName().equals(userReward.getAttractionName()))) { userRewards.add(userReward); } } diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/user/UserPreferences.java b/src/main/java/com/openclassrooms/tourguide/model/UserPreferences.java similarity index 96% rename from TourGuide/src/main/java/com/openclassrooms/tourguide/user/UserPreferences.java rename to src/main/java/com/openclassrooms/tourguide/model/UserPreferences.java index 98e712ffae..1362a087c4 100644 --- a/TourGuide/src/main/java/com/openclassrooms/tourguide/user/UserPreferences.java +++ b/src/main/java/com/openclassrooms/tourguide/model/UserPreferences.java @@ -1,4 +1,4 @@ -package com.openclassrooms.tourguide.user; +package com.openclassrooms.tourguide.model; public class UserPreferences { diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/user/UserReward.java b/src/main/java/com/openclassrooms/tourguide/model/UserReward.java similarity index 85% rename from TourGuide/src/main/java/com/openclassrooms/tourguide/user/UserReward.java rename to src/main/java/com/openclassrooms/tourguide/model/UserReward.java index 263e392045..d5d5ac522e 100644 --- a/TourGuide/src/main/java/com/openclassrooms/tourguide/user/UserReward.java +++ b/src/main/java/com/openclassrooms/tourguide/model/UserReward.java @@ -1,4 +1,4 @@ -package com.openclassrooms.tourguide.user; +package com.openclassrooms.tourguide.model; import gpsUtil.location.Attraction; import gpsUtil.location.VisitedLocation; @@ -26,5 +26,9 @@ public void setRewardPoints(int rewardPoints) { public int getRewardPoints() { return rewardPoints; } + + public String getAttractionName(){ + return attraction.attractionName; + } } diff --git a/src/main/java/com/openclassrooms/tourguide/service/RewardsService.java b/src/main/java/com/openclassrooms/tourguide/service/RewardsService.java new file mode 100644 index 0000000000..ef10c7acbf --- /dev/null +++ b/src/main/java/com/openclassrooms/tourguide/service/RewardsService.java @@ -0,0 +1,116 @@ +package com.openclassrooms.tourguide.service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.concurrent.*; +import java.util.stream.Collectors; + +import gpsUtil.location.Attraction; +import jakarta.annotation.PreDestroy; +import org.apache.commons.lang3.time.StopWatch; +import org.springframework.stereotype.Service; +import gpsUtil.GpsUtil; +import gpsUtil.location.Location; +import gpsUtil.location.VisitedLocation; +import rewardCentral.RewardCentral; +import com.openclassrooms.tourguide.model.User; +import com.openclassrooms.tourguide.model.UserReward; + +@Service +public class RewardsService { + private static final double STATUTE_MILES_PER_NAUTICAL_MILE = 1.15077945; + + // proximity in miles + private int defaultProximityBuffer = 10; + private int proximityBuffer = defaultProximityBuffer; + private int attractionProximityRange = 200; + + private final GpsUtil gpsUtil; + + private final RewardCentral rewardsCentral; + private ExecutorService executorService = Executors.newFixedThreadPool(50); + + public RewardsService(GpsUtil gpsUtil, RewardCentral rewardCentral) { + this.gpsUtil = gpsUtil; + this.rewardsCentral = rewardCentral; + } + @PreDestroy + public void shutdownExecutorService() { + executorService.shutdown(); + } + public void setProximityBuffer(int proximityBuffer) { + this.proximityBuffer = proximityBuffer; + } + + public void setDefaultProximityBuffer() { + proximityBuffer = defaultProximityBuffer; + } + + public void calculateRewards(User user) { + List userLocations = new ArrayList<>(user.getVisitedLocations()); + Set userRewardAttractions = user.getUserRewards().stream() + .map(UserReward::getAttractionName) + .collect(Collectors.toSet()); + + userLocations.parallelStream().forEach( userLocation -> + //loop through all attractions + gpsUtil.getAttractions().stream().forEach(attraction -> { + //loop through all the user's rewards and check which are the ones he never got a reward for + if (!userRewardAttractions.contains(attraction.attractionName)) { + if (nearAttraction(userLocation, attraction)) { + user.addUserReward(new UserReward(userLocation, attraction, getRewardPoints(attraction, user))); + } + } + }) + ); + } + + public CompletableFuture calculateRewardsAsyncList(List allUsers){ + List leftList = allUsers.subList(0, allUsers.size()/2); + List rightList = allUsers.subList(allUsers.size()/2, allUsers.size()); + + List> leftRewardsCalculation = leftList + .stream() + .map(u -> CompletableFuture.runAsync(() -> calculateRewards(u), executorService)) + .collect(Collectors.toList()); + List> rightRewardsCalculation = rightList + .stream() + .map(u -> CompletableFuture.runAsync(() -> calculateRewards(u), executorService)) + .collect(Collectors.toList()); + + List> allRewardsCalculations = new ArrayList<>(leftRewardsCalculation); + allRewardsCalculations.addAll(rightRewardsCalculation); + + return CompletableFuture.allOf( + allRewardsCalculations.toArray(new CompletableFuture[0]) + ); + } + + public boolean isWithinAttractionProximity(Attraction attraction, Location location) { + return getDistance(attraction, location) > attractionProximityRange ? false : true; + } + + private boolean nearAttraction(VisitedLocation visitedLocation, Attraction attraction) { + return getDistance(attraction, visitedLocation.location) > proximityBuffer ? false : true; + } + + public int getRewardPoints(Attraction attraction, User user) { + return rewardsCentral.getAttractionRewardPoints(attraction.attractionId, user.getUserId()); + } + + public double getDistance(Location loc1, Location loc2) { + double lat1 = Math.toRadians(loc1.latitude); + double lon1 = Math.toRadians(loc1.longitude); + double lat2 = Math.toRadians(loc2.latitude); + double lon2 = Math.toRadians(loc2.longitude); + + double angle = Math.acos(Math.sin(lat1) * Math.sin(lat2) + + Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon1 - lon2)); + + double nauticalMiles = 60 * Math.toDegrees(angle); + return STATUTE_MILES_PER_NAUTICAL_MILE * nauticalMiles; + } + + +} diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/service/TourGuideService.java b/src/main/java/com/openclassrooms/tourguide/service/TourGuideService.java similarity index 76% rename from TourGuide/src/main/java/com/openclassrooms/tourguide/service/TourGuideService.java rename to src/main/java/com/openclassrooms/tourguide/service/TourGuideService.java index 1aa6472dc9..2127a587bf 100644 --- a/TourGuide/src/main/java/com/openclassrooms/tourguide/service/TourGuideService.java +++ b/src/main/java/com/openclassrooms/tourguide/service/TourGuideService.java @@ -2,22 +2,20 @@ import com.openclassrooms.tourguide.helper.InternalTestHelper; import com.openclassrooms.tourguide.tracker.Tracker; -import com.openclassrooms.tourguide.user.User; -import com.openclassrooms.tourguide.user.UserReward; +import com.openclassrooms.tourguide.model.NearbyAttraction; +import com.openclassrooms.tourguide.model.User; +import com.openclassrooms.tourguide.model.UserReward; import java.time.LocalDateTime; import java.time.ZoneOffset; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Random; -import java.util.UUID; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.stream.Collectors; import java.util.stream.IntStream; +import jakarta.annotation.PreDestroy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -38,7 +36,12 @@ public class TourGuideService { private final TripPricer tripPricer = new TripPricer(); public final Tracker tracker; boolean testMode = true; + private ExecutorService executorService = Executors.newFixedThreadPool(20); + @PreDestroy + public void shutdownExecutorService() { + executorService.shutdown(); + } public TourGuideService(GpsUtil gpsUtil, RewardsService rewardsService) { this.gpsUtil = gpsUtil; this.rewardsService = rewardsService; @@ -88,6 +91,10 @@ public List getTripDeals(User user) { return providers; } + public CompletableFuture trackUserLocationAsync(User user) { + return CompletableFuture.runAsync(() -> trackUserLocation(user), executorService); + } + public VisitedLocation trackUserLocation(User user) { VisitedLocation visitedLocation = gpsUtil.getUserLocation(user.getUserId()); user.addToVisitedLocations(visitedLocation); @@ -106,6 +113,28 @@ public List getNearByAttractions(VisitedLocation visitedLocation) { return nearbyAttractions; } + public List getFiveNearestAttractions(VisitedLocation visitedLocation, User user){ + List allAttractions = gpsUtil.getAttractions(); + return allAttractions + .stream() + //sort the tourist attractions the nearest to the furthest + .sorted(Comparator.comparingDouble( attraction -> rewardsService.getDistance(visitedLocation.location, attraction)) + ) + .map(attraction -> new NearbyAttraction( + attraction.attractionName, + attraction.latitude, + attraction.longitude, + visitedLocation.location.latitude, + visitedLocation.location.longitude, + rewardsService.getDistance(attraction, visitedLocation.location), + rewardsService.getRewardPoints(attraction, user) + )) + //take the first 5 + .limit(5) + //stream back to list + .collect(Collectors.toList()); + } + private void addShutDownHook() { Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/tracker/Tracker.java b/src/main/java/com/openclassrooms/tourguide/tracker/Tracker.java similarity index 97% rename from TourGuide/src/main/java/com/openclassrooms/tourguide/tracker/Tracker.java rename to src/main/java/com/openclassrooms/tourguide/tracker/Tracker.java index 179d3d7753..56dc064d73 100644 --- a/TourGuide/src/main/java/com/openclassrooms/tourguide/tracker/Tracker.java +++ b/src/main/java/com/openclassrooms/tourguide/tracker/Tracker.java @@ -10,7 +10,7 @@ import org.slf4j.LoggerFactory; import com.openclassrooms.tourguide.service.TourGuideService; -import com.openclassrooms.tourguide.user.User; +import com.openclassrooms.tourguide.model.User; public class Tracker extends Thread { private Logger logger = LoggerFactory.getLogger(Tracker.class); diff --git a/TourGuide/src/main/resources/application.properties b/src/main/resources/application.properties similarity index 100% rename from TourGuide/src/main/resources/application.properties rename to src/main/resources/application.properties diff --git a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestPerformance.java b/src/test/java/com/openclassrooms/tourguide/TestPerformance.java similarity index 74% rename from TourGuide/src/test/java/com/openclassrooms/tourguide/TestPerformance.java rename to src/test/java/com/openclassrooms/tourguide/TestPerformance.java index aed028f861..836ddd3447 100644 --- a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestPerformance.java +++ b/src/test/java/com/openclassrooms/tourguide/TestPerformance.java @@ -5,10 +5,12 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import org.apache.commons.lang3.time.StopWatch; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import gpsUtil.GpsUtil; @@ -18,7 +20,7 @@ import com.openclassrooms.tourguide.helper.InternalTestHelper; import com.openclassrooms.tourguide.service.RewardsService; import com.openclassrooms.tourguide.service.TourGuideService; -import com.openclassrooms.tourguide.user.User; +import com.openclassrooms.tourguide.model.User; public class TestPerformance { @@ -45,24 +47,27 @@ public class TestPerformance { * TimeUnit.MILLISECONDS.toSeconds(stopWatch.getTime())); */ - @Disabled @Test - public void highVolumeTrackLocation() { + public void highVolumeTrackLocation() throws ExecutionException, InterruptedException { GpsUtil gpsUtil = new GpsUtil(); RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); - // Users should be incremented up to 100,000, and test finishes within 15 - // minutes - InternalTestHelper.setInternalUserNumber(100); + // Users should be incremented up to 100,000, and test finishes within 15minutes + InternalTestHelper.setInternalUserNumber(100000); TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); - List allUsers = new ArrayList<>(); - allUsers = tourGuideService.getAllUsers(); + List allUsers = tourGuideService.getAllUsers(); StopWatch stopWatch = new StopWatch(); stopWatch.start(); - for (User user : allUsers) { - tourGuideService.trackUserLocation(user); - } + List> futures = allUsers + .stream() + .map(tourGuideService::trackUserLocationAsync) + .collect(Collectors.toList()); + + CompletableFuture allOf = CompletableFuture.allOf( + futures.toArray(new CompletableFuture[0]) + ); + allOf.get(); stopWatch.stop(); tourGuideService.tracker.stopTracking(); @@ -71,25 +76,24 @@ public void highVolumeTrackLocation() { assertTrue(TimeUnit.MINUTES.toSeconds(15) >= TimeUnit.MILLISECONDS.toSeconds(stopWatch.getTime())); } - @Disabled @Test public void highVolumeGetRewards() { GpsUtil gpsUtil = new GpsUtil(); RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); - // Users should be incremented up to 100,000, and test finishes within 20 - // minutes - InternalTestHelper.setInternalUserNumber(100); - StopWatch stopWatch = new StopWatch(); - stopWatch.start(); + // Users should be incremented up to 100,000, and test finishes within 20minutes + InternalTestHelper.setInternalUserNumber(100000); TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); Attraction attraction = gpsUtil.getAttractions().get(0); - List allUsers = new ArrayList<>(); - allUsers = tourGuideService.getAllUsers(); - allUsers.forEach(u -> u.addToVisitedLocations(new VisitedLocation(u.getUserId(), attraction, new Date()))); + List allUsers = tourGuideService.getAllUsers(); + allUsers.stream().forEach(u -> u.addToVisitedLocations(new VisitedLocation(u.getUserId(), attraction, new Date()))); + + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); - allUsers.forEach(u -> rewardsService.calculateRewards(u)); + CompletableFuture allOf = rewardsService.calculateRewardsAsyncList(allUsers); + allOf.join(); for (User user : allUsers) { assertTrue(user.getUserRewards().size() > 0); diff --git a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestRewardsService.java b/src/test/java/com/openclassrooms/tourguide/TestRewardsService.java similarity index 88% rename from TourGuide/src/test/java/com/openclassrooms/tourguide/TestRewardsService.java rename to src/test/java/com/openclassrooms/tourguide/TestRewardsService.java index 2bcc2fb13e..b311bf1815 100644 --- a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestRewardsService.java +++ b/src/test/java/com/openclassrooms/tourguide/TestRewardsService.java @@ -7,7 +7,6 @@ import java.util.List; import java.util.UUID; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import gpsUtil.GpsUtil; @@ -17,8 +16,8 @@ import com.openclassrooms.tourguide.helper.InternalTestHelper; import com.openclassrooms.tourguide.service.RewardsService; import com.openclassrooms.tourguide.service.TourGuideService; -import com.openclassrooms.tourguide.user.User; -import com.openclassrooms.tourguide.user.UserReward; +import com.openclassrooms.tourguide.model.User; +import com.openclassrooms.tourguide.model.UserReward; public class TestRewardsService { @@ -46,8 +45,6 @@ public void isWithinAttractionProximity() { Attraction attraction = gpsUtil.getAttractions().get(0); assertTrue(rewardsService.isWithinAttractionProximity(attraction, attraction)); } - - @Disabled // Needs fixed - can throw ConcurrentModificationException @Test public void nearAllAttractions() { GpsUtil gpsUtil = new GpsUtil(); @@ -56,8 +53,8 @@ public void nearAllAttractions() { InternalTestHelper.setInternalUserNumber(1); TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); - - rewardsService.calculateRewards(tourGuideService.getAllUsers().get(0)); + User user = tourGuideService.getAllUsers().get(0); + rewardsService.calculateRewards(user); List userRewards = tourGuideService.getUserRewards(tourGuideService.getAllUsers().get(0)); tourGuideService.tracker.stopTracking(); diff --git a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestTourGuideService.java b/src/test/java/com/openclassrooms/tourguide/TestTourGuideService.java similarity index 93% rename from TourGuide/src/test/java/com/openclassrooms/tourguide/TestTourGuideService.java rename to src/test/java/com/openclassrooms/tourguide/TestTourGuideService.java index 2b053739e2..3562e81ded 100644 --- a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestTourGuideService.java +++ b/src/test/java/com/openclassrooms/tourguide/TestTourGuideService.java @@ -6,17 +6,16 @@ import java.util.List; import java.util.UUID; -import org.junit.jupiter.api.Disabled; +import com.openclassrooms.tourguide.model.NearbyAttraction; import org.junit.jupiter.api.Test; import gpsUtil.GpsUtil; -import gpsUtil.location.Attraction; import gpsUtil.location.VisitedLocation; import rewardCentral.RewardCentral; import com.openclassrooms.tourguide.helper.InternalTestHelper; import com.openclassrooms.tourguide.service.RewardsService; import com.openclassrooms.tourguide.service.TourGuideService; -import com.openclassrooms.tourguide.user.User; +import com.openclassrooms.tourguide.model.User; import tripPricer.Provider; public class TestTourGuideService { @@ -92,7 +91,6 @@ public void trackUser() { assertEquals(user.getUserId(), visitedLocation.userId); } - @Disabled // Not yet implemented @Test public void getNearbyAttractions() { GpsUtil gpsUtil = new GpsUtil(); @@ -103,13 +101,14 @@ public void getNearbyAttractions() { User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com"); VisitedLocation visitedLocation = tourGuideService.trackUserLocation(user); - List attractions = tourGuideService.getNearByAttractions(visitedLocation); + List attractions = tourGuideService.getFiveNearestAttractions(visitedLocation, user); tourGuideService.tracker.stopTracking(); assertEquals(5, attractions.size()); } + @Test public void getTripDeals() { GpsUtil gpsUtil = new GpsUtil(); RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); @@ -122,7 +121,7 @@ public void getTripDeals() { tourGuideService.tracker.stopTracking(); - assertEquals(10, providers.size()); + assertEquals(5, providers.size()); } } diff --git a/TourGuide/src/test/java/com/openclassrooms/tourguide/TourguideApplicationTests.java b/src/test/java/com/openclassrooms/tourguide/TourguideApplicationTests.java similarity index 100% rename from TourGuide/src/test/java/com/openclassrooms/tourguide/TourguideApplicationTests.java rename to src/test/java/com/openclassrooms/tourguide/TourguideApplicationTests.java