diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
new file mode 100644
index 0000000000..ab3ebbcd51
--- /dev/null
+++ b/.github/workflows/maven.yml
@@ -0,0 +1,77 @@
+# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
+# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven
+
+# This workflow uses actions that are not certified by GitHub.
+# They are provided by a third-party and are governed by
+# separate terms of service, privacy policy, and support
+# documentation.
+
+name: Java CI with Maven
+
+on:
+ push:
+ branches: [ "master" ]
+ pull_request:
+ branches: [ "master" ]
+
+env:
+ CHANGE_DIR: cd ./TourGuide
+ INSTALL_DEPENDENCIES: |
+ 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
+
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+ - name: Set up JDK 17
+ uses: actions/setup-java@v4
+ with:
+ java-version: '17'
+ distribution: 'temurin'
+ cache: maven
+ - name: Build with Maven
+ run: |
+ ${{env.CHANGE_DIR}}
+ ${{env.INSTALL_DEPENDENCIES}}
+ mvn -B clean compile
+ test:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+ - name: Set up JDK 17
+ uses: actions/setup-java@v4
+ with:
+ java-version: '17'
+ distribution: 'temurin'
+ cache: maven
+ - name: Build with Maven
+ run: |
+ ${{env.CHANGE_DIR}}
+ ${{env.INSTALL_DEPENDENCIES}}
+ mvn -B clean test
+ package:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+ - name: Set up JDK 17
+ uses: actions/setup-java@v4
+ with:
+ java-version: '17'
+ distribution: 'temurin'
+ cache: maven
+ - name: Build with Maven
+ run: |
+ ${{env.CHANGE_DIR}}
+ ${{env.INSTALL_DEPENDENCIES}}
+ mvn -B clean package
+ - name: upload jar
+ uses: actions/upload-artifact@v4
+ with:
+ path: ./TourGuide/target/*.jar
\ No newline at end of file
diff --git a/TourGuide/pom.xml b/TourGuide/pom.xml
index d3aaeeb349..9ecb0a973b 100644
--- a/TourGuide/pom.xml
+++ b/TourGuide/pom.xml
@@ -64,6 +64,11 @@
rewardCentral
1.0.0
+
+ org.modelmapper
+ modelmapper
+ 2.3.5
+
diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/TourGuideController.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/TourGuideController.java
index a884e6590b..77d20e2bca 100644
--- a/TourGuide/src/main/java/com/openclassrooms/tourguide/TourGuideController.java
+++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/TourGuideController.java
@@ -1,13 +1,14 @@
package com.openclassrooms.tourguide;
import java.util.List;
+import java.util.concurrent.ExecutionException;
+import com.openclassrooms.tourguide.dto.AttractionDto;
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;
@@ -28,26 +29,16 @@ public String index() {
}
@RequestMapping("/getLocation")
- public VisitedLocation getLocation(@RequestParam String userName) {
+ public VisitedLocation getLocation(@RequestParam String userName) throws ExecutionException, InterruptedException {
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) throws ExecutionException, InterruptedException {
VisitedLocation visitedLocation = tourGuideService.getUserLocation(getUser(userName));
return tourGuideService.getNearByAttractions(visitedLocation);
}
-
- @RequestMapping("/getRewards")
+
+ @RequestMapping("/getRewards")
public List getRewards(@RequestParam String userName) {
return tourGuideService.getUserRewards(getUser(userName));
}
@@ -60,6 +51,5 @@ public List getTripDeals(@RequestParam String userName) {
private User getUser(String userName) {
return tourGuideService.getUser(userName);
}
-
}
\ No newline at end of file
diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/dto/AttractionDto.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/dto/AttractionDto.java
new file mode 100644
index 0000000000..2ba2c089cb
--- /dev/null
+++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/dto/AttractionDto.java
@@ -0,0 +1,80 @@
+package com.openclassrooms.tourguide.dto;
+
+public class AttractionDto {
+ private String attractionName;
+ private double latitude;
+ private double longitude;
+ private double latitudeUser;
+ private double longitudeUser;
+ private double distance;
+
+ public double getLatitudeUser() {
+ return latitudeUser;
+ }
+
+ public void setLatitudeUser(double latitudeUser) {
+ this.latitudeUser = latitudeUser;
+ }
+
+ public double getLongitudeUser() {
+ return longitudeUser;
+ }
+
+ public void setLongitudeUser(double longitudeUser) {
+ this.longitudeUser = longitudeUser;
+ }
+ private double rewardPoints;
+
+ public double getRewardPoints() {
+ return rewardPoints;
+ }
+
+ public void setRewardPoints(double rewardPoints) {
+ this.rewardPoints = rewardPoints;
+ }
+ public String getAttractionName() {
+ return attractionName;
+ }
+
+ public void setAttractionName(String attractionName) {
+ this.attractionName = attractionName;
+ }
+
+ public double getLatitude() {
+ return latitude;
+ }
+
+ public void setLatitude(double latitude) {
+ this.latitude = latitude;
+ }
+
+ public double getLongitude() {
+ return longitude;
+ }
+
+ public void setLongitude(double longitude) {
+ this.longitude = longitude;
+ }
+
+ public double getDistance() {
+ return distance;
+ }
+
+ public void setDistance(double distance) {
+ this.distance = distance;
+ }
+
+ public AttractionDto(String attractionName, double latitude, double longitude, double latitudeUser, double longitudeUser, double distance, double rewardPoints) {
+ this.attractionName = attractionName;
+ this.latitude = latitude;
+ this.longitude = longitude;
+ this.latitudeUser = latitudeUser;
+ this.longitudeUser = longitudeUser;
+ this.distance = distance;
+ this.rewardPoints = rewardPoints;
+ }
+
+ public AttractionDto() {
+
+ }
+}
diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/service/RewardsService.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/service/RewardsService.java
index ad440eb484..0ef720db9e 100644
--- a/TourGuide/src/main/java/com/openclassrooms/tourguide/service/RewardsService.java
+++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/service/RewardsService.java
@@ -1,6 +1,8 @@
package com.openclassrooms.tourguide.service;
+import java.util.Arrays;
import java.util.List;
+import java.util.concurrent.*;
import org.springframework.stereotype.Service;
@@ -12,6 +14,7 @@
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;
@@ -35,27 +38,48 @@ public void setProximityBuffer(int proximityBuffer) {
public void setDefaultProximityBuffer() {
proximityBuffer = defaultProximityBuffer;
}
-
- public void calculateRewards(User user) {
+
+ public void parallelSum100(User user) throws InterruptedException {
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)));
+ ExecutorService executorService = Executors.newFixedThreadPool(4);
+ for (VisitedLocation visitedLocation : userLocations) {
+ for (Attraction attraction : attractions) {
+ executorService.execute(() -> {
+ if (Arrays.stream(user.getUserRewards().stream().filter(r -> r.attraction.attractionName.equals(attraction.attractionName)).toArray()).count() == 0) {
+ if (nearAttraction(visitedLocation, attraction)) {
+ user.addUserReward(new UserReward(visitedLocation, attraction, getRewardPoints(attraction, user)));
+ }
}
- }
+
+ });
}
+ executorService.shutdown();
+ executorService.awaitTermination(5, TimeUnit.SECONDS);
}
}
-
+
+ public CompletableFuture calculateRewards(User user){
+ return CompletableFuture.runAsync(() ->{
+ List attractions = gpsUtil.getAttractions();
+ List userLocations = new CopyOnWriteArrayList<>(user.getVisitedLocations());
+ for(VisitedLocation visitedLocation : userLocations){
+ List nearAttractionFirstTime = attractions.stream()
+ .filter(a ->
+ (nearAttraction(visitedLocation,a))
+ && (user.getUserRewards().stream()
+ .anyMatch(r -> r.attraction.attractionName.equals(a.attractionName))))
+ .toList();
+ nearAttractionFirstTime.forEach(a -> user.addUserReward(new UserReward(visitedLocation, a, getRewardPoints(a,user))));
+ }
+ }, Executors.newSingleThreadExecutor());
+ }
+
public boolean isWithinAttractionProximity(Attraction attraction, Location location) {
return getDistance(attraction, location) > attractionProximityRange ? false : true;
}
- private boolean nearAttraction(VisitedLocation visitedLocation, Attraction attraction) {
+ public boolean nearAttraction(VisitedLocation visitedLocation, Attraction attraction) {
return getDistance(attraction, visitedLocation.location) > proximityBuffer ? false : true;
}
diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/service/TourGuideService.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/service/TourGuideService.java
index 1aa6472dc9..d60c4a543c 100644
--- a/TourGuide/src/main/java/com/openclassrooms/tourguide/service/TourGuideService.java
+++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/service/TourGuideService.java
@@ -1,5 +1,6 @@
package com.openclassrooms.tourguide.service;
+import com.openclassrooms.tourguide.dto.AttractionDto;
import com.openclassrooms.tourguide.helper.InternalTestHelper;
import com.openclassrooms.tourguide.tracker.Tracker;
import com.openclassrooms.tourguide.user.User;
@@ -7,14 +8,8 @@
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.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@@ -27,6 +22,7 @@
import gpsUtil.location.Location;
import gpsUtil.location.VisitedLocation;
+import rewardCentral.RewardCentral;
import tripPricer.Provider;
import tripPricer.TripPricer;
@@ -38,11 +34,13 @@ public class TourGuideService {
private final TripPricer tripPricer = new TripPricer();
public final Tracker tracker;
boolean testMode = true;
+ private final RewardCentral rewardsCentral;
- public TourGuideService(GpsUtil gpsUtil, RewardsService rewardsService) {
+
+ public TourGuideService(GpsUtil gpsUtil, RewardsService rewardsService, RewardCentral rewardCentral) {
this.gpsUtil = gpsUtil;
this.rewardsService = rewardsService;
-
+ this.rewardsCentral = rewardCentral;
Locale.setDefault(Locale.US);
if (testMode) {
@@ -55,110 +53,126 @@ public TourGuideService(GpsUtil gpsUtil, RewardsService rewardsService) {
addShutDownHook();
}
- public List getUserRewards(User user) {
- return user.getUserRewards();
- }
-
- public VisitedLocation getUserLocation(User user) {
- VisitedLocation visitedLocation = (user.getVisitedLocations().size() > 0) ? user.getLastVisitedLocation()
- : trackUserLocation(user);
- return visitedLocation;
- }
-
- public User getUser(String userName) {
- return internalUserMap.get(userName);
- }
-
- public List getAllUsers() {
- return internalUserMap.values().stream().collect(Collectors.toList());
- }
-
- public void addUser(User user) {
- if (!internalUserMap.containsKey(user.getUserName())) {
- internalUserMap.put(user.getUserName(), user);
+ public List getUserRewards(User user) {
+ return user.getUserRewards();
}
- }
- public List getTripDeals(User user) {
- int cumulatativeRewardPoints = user.getUserRewards().stream().mapToInt(i -> i.getRewardPoints()).sum();
- List providers = tripPricer.getPrice(tripPricerApiKey, user.getUserId(),
- user.getUserPreferences().getNumberOfAdults(), user.getUserPreferences().getNumberOfChildren(),
- user.getUserPreferences().getTripDuration(), cumulatativeRewardPoints);
- user.setTripDeals(providers);
- return providers;
- }
+ public VisitedLocation getUserLocation(User user) throws ExecutionException, InterruptedException {
+ VisitedLocation visitedLocation = (user.getVisitedLocations().size() > 0) ? user.getLastVisitedLocation()
+ : trackUserLocation(user).get();
+ return visitedLocation;
+ }
+
+ public User getUser(String userName) {
+ return internalUserMap.get(userName);
+ }
+
+ public List getAllUsers() {
+ return internalUserMap.values().stream().collect(Collectors.toList());
+ }
+
+ public void addUser(User user) {
+ if (!internalUserMap.containsKey(user.getUserName())) {
+ internalUserMap.put(user.getUserName(), user);
+ }
+ }
+
+ public List getTripDeals(User user) {
+ int cumulatativeRewardPoints = user.getUserRewards().stream().mapToInt(i -> i.getRewardPoints()).sum();
+ List providers = tripPricer.getPrice(tripPricerApiKey, user.getUserId(),
+ user.getUserPreferences().getNumberOfAdults(), user.getUserPreferences().getNumberOfChildren(),
+ user.getUserPreferences().getTripDuration(), cumulatativeRewardPoints);
+ user.setTripDeals(providers);
+ return providers;
+ }
+
+ public CompletableFuture trackUserLocation(User user) {
+ return CompletableFuture.supplyAsync(()->{
+ VisitedLocation visitedLocation = gpsUtil.getUserLocation(user.getUserId());
+ user.addToVisitedLocations(visitedLocation);
+ rewardsService.calculateRewards(user);
+ return visitedLocation;
+ }, Executors.newSingleThreadExecutor());
+ }
+
+ public List getNearByAttractions(VisitedLocation visitedLocation) {
+
+ List attractions = gpsUtil.getAttractions();
+ Map attractionMap = new HashMap<>();
+
+ for (Attraction attraction : attractions) {
+ double distanceAttraction = rewardsService.getDistance(visitedLocation.location, attraction);
+ attractionMap.put(attraction, distanceAttraction);
+ }
+
+ List attractionList1 = attractionMap.entrySet().stream().sorted(Map.Entry.comparingByValue()).map(Map.Entry::getKey).toList().subList(0, 5);
+ return attractionList1.stream().map(attraction ->
+ new AttractionDto(
+ attraction.attractionName,
+ attraction.latitude,
+ attraction.longitude,
+ visitedLocation.location.latitude,
+ visitedLocation.location.longitude,
+ attractionMap.get(attraction),
+ rewardsCentral.getAttractionRewardPoints(attraction.attractionId, visitedLocation.userId)
+ )
+
+ ).toList();
- public VisitedLocation trackUserLocation(User user) {
- VisitedLocation visitedLocation = gpsUtil.getUserLocation(user.getUserId());
- user.addToVisitedLocations(visitedLocation);
- rewardsService.calculateRewards(user);
- return visitedLocation;
- }
-
- public List getNearByAttractions(VisitedLocation visitedLocation) {
- List nearbyAttractions = new ArrayList<>();
- for (Attraction attraction : gpsUtil.getAttractions()) {
- if (rewardsService.isWithinAttractionProximity(attraction, visitedLocation.location)) {
- nearbyAttractions.add(attraction);
- }
}
- return nearbyAttractions;
- }
-
- private void addShutDownHook() {
- Runtime.getRuntime().addShutdownHook(new Thread() {
- public void run() {
- tracker.stopTracking();
- }
- });
- }
-
- /**********************************************************************************
- *
- * Methods Below: For Internal Testing
- *
- **********************************************************************************/
- private static final String tripPricerApiKey = "test-server-api-key";
- // Database connection will be used for external users, but for testing purposes
- // internal users are provided and stored in memory
- private final Map internalUserMap = new HashMap<>();
-
- private void initializeInternalUsers() {
- IntStream.range(0, InternalTestHelper.getInternalUserNumber()).forEach(i -> {
- String userName = "internalUser" + i;
- String phone = "000";
- String email = userName + "@tourGuide.com";
- User user = new User(UUID.randomUUID(), userName, phone, email);
- generateUserLocationHistory(user);
-
- internalUserMap.put(userName, user);
- });
- logger.debug("Created " + InternalTestHelper.getInternalUserNumber() + " internal test users.");
- }
-
- private void generateUserLocationHistory(User user) {
- IntStream.range(0, 3).forEach(i -> {
- user.addToVisitedLocations(new VisitedLocation(user.getUserId(),
- new Location(generateRandomLatitude(), generateRandomLongitude()), getRandomTime()));
- });
- }
+ private void addShutDownHook() {
+ Runtime.getRuntime().addShutdownHook(new Thread() {
+ public void run() {
+ tracker.stopTracking();
+ }
+ });
+ }
+
+ /**********************************************************************************
+ *
+ * Methods Below: For Internal Testing
+ *
+ **********************************************************************************/
+ private static final String tripPricerApiKey = "test-server-api-key";
+ // Database connection will be used for external users, but for testing purposes
+ // internal users are provided and stored in memory
+ private final Map internalUserMap = new HashMap<>();
+
+ private void initializeInternalUsers() {
+ IntStream.range(0, InternalTestHelper.getInternalUserNumber()).forEach(i -> {
+ String userName = "internalUser" + i;
+ String phone = "000";
+ String email = userName + "@tourGuide.com";
+ User user = new User(UUID.randomUUID(), userName, phone, email);
+ generateUserLocationHistory(user);
+
+ internalUserMap.put(userName, user);
+ });
+ logger.debug("Created " + InternalTestHelper.getInternalUserNumber() + " internal test users.");
+ }
- private double generateRandomLongitude() {
- double leftLimit = -180;
- double rightLimit = 180;
- return leftLimit + new Random().nextDouble() * (rightLimit - leftLimit);
- }
+ private void generateUserLocationHistory(User user) {
+ IntStream.range(0, 3).forEach(i -> {
+ user.addToVisitedLocations(new VisitedLocation(user.getUserId(),
+ new Location(generateRandomLatitude(), generateRandomLongitude()), getRandomTime()));
+ });
+ }
- private double generateRandomLatitude() {
- double leftLimit = -85.05112878;
- double rightLimit = 85.05112878;
- return leftLimit + new Random().nextDouble() * (rightLimit - leftLimit);
- }
+ private double generateRandomLongitude() {
+ double leftLimit = -180;
+ double rightLimit = 180;
+ return leftLimit + new Random().nextDouble() * (rightLimit - leftLimit);
+ }
- private Date getRandomTime() {
- LocalDateTime localDateTime = LocalDateTime.now().minusDays(new Random().nextInt(30));
- return Date.from(localDateTime.toInstant(ZoneOffset.UTC));
- }
+ private double generateRandomLatitude() {
+ double leftLimit = -85.05112878;
+ double rightLimit = 85.05112878;
+ return leftLimit + new Random().nextDouble() * (rightLimit - leftLimit);
+ }
+ private Date getRandomTime() {
+ LocalDateTime localDateTime = LocalDateTime.now().minusDays(new Random().nextInt(30));
+ return Date.from(localDateTime.toInstant(ZoneOffset.UTC));
+ }
}
diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/user/User.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/user/User.java
index 32ed3b14ea..ab8ea0781a 100644
--- a/TourGuide/src/main/java/com/openclassrooms/tourguide/user/User.java
+++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/user/User.java
@@ -18,6 +18,7 @@ public class User {
private List userRewards = new ArrayList<>();
private UserPreferences userPreferences = new UserPreferences();
private List tripDeals = new ArrayList<>();
+
public User(UUID userId, String userName, String phoneNumber, String emailAddress) {
this.userId = userId;
this.userName = userName;
@@ -70,11 +71,12 @@ public void clearVisitedLocations() {
}
public void addUserReward(UserReward userReward) {
- if(userRewards.stream().filter(r -> !r.attraction.attractionName.equals(userReward.attraction)).count() == 0) {
+
+ if(userRewards.stream().anyMatch(r -> r.attraction.attractionName.equals(userReward.attraction.attractionName))) {
userRewards.add(userReward);
}
}
-
+
public List getUserRewards() {
return userRewards;
}
@@ -98,5 +100,4 @@ public void setTripDeals(List tripDeals) {
public List getTripDeals() {
return tripDeals;
}
-
}
diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/user/UserReward.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/user/UserReward.java
index 263e392045..56b49d0aba 100644
--- a/TourGuide/src/main/java/com/openclassrooms/tourguide/user/UserReward.java
+++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/user/UserReward.java
@@ -5,20 +5,29 @@
public class UserReward {
- public final VisitedLocation visitedLocation;
- public final Attraction attraction;
+ public VisitedLocation visitedLocation;
+ public Attraction attraction;
private int rewardPoints;
+
+ public void setVisitedLocation(VisitedLocation visitedLocation) {
+ this.visitedLocation = visitedLocation;
+ }
+
+ public void setAttraction(Attraction attraction) {
+ this.attraction = attraction;
+ }
+
public UserReward(VisitedLocation visitedLocation, Attraction attraction, int rewardPoints) {
this.visitedLocation = visitedLocation;
this.attraction = attraction;
this.rewardPoints = rewardPoints;
}
-
public UserReward(VisitedLocation visitedLocation, Attraction attraction) {
this.visitedLocation = visitedLocation;
this.attraction = attraction;
}
+
public void setRewardPoints(int rewardPoints) {
this.rewardPoints = rewardPoints;
}
@@ -26,5 +35,12 @@ public void setRewardPoints(int rewardPoints) {
public int getRewardPoints() {
return rewardPoints;
}
-
+
+ public VisitedLocation getVisitedLocation() {
+ return visitedLocation;
+ }
+
+ public Attraction getAttraction() {
+ return attraction;
+ }
}
diff --git a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestPerformance.java b/TourGuide/src/test/java/com/openclassrooms/tourguide/TestPerformance.java
index aed028f861..35891f03a4 100644
--- a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestPerformance.java
+++ b/TourGuide/src/test/java/com/openclassrooms/tourguide/TestPerformance.java
@@ -5,10 +5,10 @@
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
+import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang3.time.StopWatch;
-import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import gpsUtil.GpsUtil;
@@ -45,24 +45,32 @@ public class TestPerformance {
* TimeUnit.MILLISECONDS.toSeconds(stopWatch.getTime()));
*/
- @Disabled
@Test
public void highVolumeTrackLocation() {
GpsUtil gpsUtil = new GpsUtil();
+ RewardCentral rewardCentral = new RewardCentral();
+
RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral());
- // Users should be incremented up to 100,000, and test finishes within 15
- // minutes
- InternalTestHelper.setInternalUserNumber(100);
- TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService);
+
+ // Users should be incremented up to 100,000, and test finishes within 15 minutes
+
+ InternalTestHelper.setInternalUserNumber(1000);
+ TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService,rewardCentral);
List allUsers = new ArrayList<>();
allUsers = tourGuideService.getAllUsers();
StopWatch stopWatch = new StopWatch();
stopWatch.start();
- for (User user : allUsers) {
- tourGuideService.trackUserLocation(user);
- }
+
+ List> visitedLocations = new ArrayList<>();
+
+ allUsers.forEach(user1
+ -> CompletableFuture.supplyAsync(()
+ ->tourGuideService.trackUserLocation(user1)).join());
+
+ CompletableFuture.allOf(visitedLocations.toArray(new CompletableFuture[0]));
+
stopWatch.stop();
tourGuideService.tracker.stopTracking();
@@ -71,29 +79,33 @@ public void highVolumeTrackLocation() {
assertTrue(TimeUnit.MINUTES.toSeconds(15) >= TimeUnit.MILLISECONDS.toSeconds(stopWatch.getTime()));
}
- @Disabled
@Test
public void highVolumeGetRewards() {
GpsUtil gpsUtil = new GpsUtil();
+ RewardCentral rewardCentral = new RewardCentral();
RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral());
- // Users should be incremented up to 100,000, and test finishes within 20
- // minutes
- InternalTestHelper.setInternalUserNumber(100);
+ // Users should be incremented up to 100,000, and test finishes within 20 minutes
+
+ InternalTestHelper.setInternalUserNumber(100000);
StopWatch stopWatch = new StopWatch();
stopWatch.start();
- TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService);
+ TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService, rewardCentral);
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())));
allUsers.forEach(u -> rewardsService.calculateRewards(u));
- for (User user : allUsers) {
- assertTrue(user.getUserRewards().size() > 0);
- }
+
+ allUsers.forEach(user1
+ -> CompletableFuture.supplyAsync(()
+ -> user1.getUserRewards().isEmpty()).join()
+ );
+
stopWatch.stop();
tourGuideService.tracker.stopTracking();
diff --git a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestRewardsService.java b/TourGuide/src/test/java/com/openclassrooms/tourguide/TestRewardsService.java
index 2bcc2fb13e..36f000cf2d 100644
--- a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestRewardsService.java
+++ b/TourGuide/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;
@@ -25,43 +24,50 @@ public class TestRewardsService {
@Test
public void userGetRewards() {
GpsUtil gpsUtil = new GpsUtil();
+ RewardCentral rewardCentral = new RewardCentral();
+
RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral());
InternalTestHelper.setInternalUserNumber(0);
- TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService);
+ TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService,rewardCentral);
User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com");
Attraction attraction = gpsUtil.getAttractions().get(0);
user.addToVisitedLocations(new VisitedLocation(user.getUserId(), attraction, new Date()));
- tourGuideService.trackUserLocation(user);
- List userRewards = user.getUserRewards();
- tourGuideService.tracker.stopTracking();
- assertTrue(userRewards.size() == 1);
+ tourGuideService.trackUserLocation(user).whenComplete((visitedLocation, throwable) -> {
+ List userRewards = user.getUserRewards();
+ tourGuideService.tracker.stopTracking();
+ assertTrue(userRewards.size() == 1);
+ });
+
}
@Test
public void isWithinAttractionProximity() {
GpsUtil gpsUtil = new GpsUtil();
- RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral());
+ RewardCentral rewardCentral = new RewardCentral();
+
+ RewardsService rewardsService = new RewardsService(gpsUtil, rewardCentral);
Attraction attraction = gpsUtil.getAttractions().get(0);
assertTrue(rewardsService.isWithinAttractionProximity(attraction, attraction));
}
-
- @Disabled // Needs fixed - can throw ConcurrentModificationException
+// @Test(expected = ConcurrentModificationException.class)
@Test
public void nearAllAttractions() {
GpsUtil gpsUtil = new GpsUtil();
+ RewardCentral rewardCentral = new RewardCentral();
+
RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral());
rewardsService.setProximityBuffer(Integer.MAX_VALUE);
InternalTestHelper.setInternalUserNumber(1);
- TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService);
+ TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService,rewardCentral);
rewardsService.calculateRewards(tourGuideService.getAllUsers().get(0));
List userRewards = tourGuideService.getUserRewards(tourGuideService.getAllUsers().get(0));
tourGuideService.tracker.stopTracking();
- assertEquals(gpsUtil.getAttractions().size(), userRewards.size());
+ assertEquals(gpsUtil.getAttractions().size(), userRewards.size());
}
}
diff --git a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestTourGuideService.java b/TourGuide/src/test/java/com/openclassrooms/tourguide/TestTourGuideService.java
index 2b053739e2..7ff2be0ec6 100644
--- a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestTourGuideService.java
+++ b/TourGuide/src/test/java/com/openclassrooms/tourguide/TestTourGuideService.java
@@ -5,12 +5,13 @@
import java.util.List;
import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
-import org.junit.jupiter.api.Disabled;
+import com.openclassrooms.tourguide.dto.AttractionDto;
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;
@@ -22,24 +23,27 @@
public class TestTourGuideService {
@Test
- public void getUserLocation() {
+ public void getUserLocation() throws ExecutionException, InterruptedException {
GpsUtil gpsUtil = new GpsUtil();
+ RewardCentral rewardCentral = new RewardCentral();
+
RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral());
InternalTestHelper.setInternalUserNumber(0);
- TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService);
+ TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService,rewardCentral);
User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com");
- VisitedLocation visitedLocation = tourGuideService.trackUserLocation(user);
+ CompletableFuture visitedLocation = tourGuideService.trackUserLocation(user);
tourGuideService.tracker.stopTracking();
- assertTrue(visitedLocation.userId.equals(user.getUserId()));
+ assertTrue(visitedLocation.get().userId.equals(user.getUserId()));
}
@Test
public void addUser() {
GpsUtil gpsUtil = new GpsUtil();
+ RewardCentral rewardCentral = new RewardCentral();
RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral());
InternalTestHelper.setInternalUserNumber(0);
- TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService);
+ TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService,rewardCentral);
User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com");
User user2 = new User(UUID.randomUUID(), "jon2", "000", "jon2@tourGuide.com");
@@ -59,9 +63,11 @@ public void addUser() {
@Test
public void getAllUsers() {
GpsUtil gpsUtil = new GpsUtil();
+ RewardCentral rewardCentral = new RewardCentral();
+
RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral());
InternalTestHelper.setInternalUserNumber(0);
- TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService);
+ TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService,rewardCentral);
User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com");
User user2 = new User(UUID.randomUUID(), "jon2", "000", "jon2@tourGuide.com");
@@ -78,32 +84,35 @@ public void getAllUsers() {
}
@Test
- public void trackUser() {
+ public void trackUser() throws ExecutionException, InterruptedException {
GpsUtil gpsUtil = new GpsUtil();
+ RewardCentral rewardCentral = new RewardCentral();
+
RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral());
InternalTestHelper.setInternalUserNumber(0);
- TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService);
+ TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService,rewardCentral);
User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com");
- VisitedLocation visitedLocation = tourGuideService.trackUserLocation(user);
+ CompletableFuture visitedLocation = tourGuideService.trackUserLocation(user);
tourGuideService.tracker.stopTracking();
- assertEquals(user.getUserId(), visitedLocation.userId);
+ assertEquals(user.getUserId(), visitedLocation.get().userId);
}
- @Disabled // Not yet implemented
@Test
- public void getNearbyAttractions() {
+ public void getNearbyAttractions() throws ExecutionException, InterruptedException {
GpsUtil gpsUtil = new GpsUtil();
+ RewardCentral rewardCentral = new RewardCentral();
+
RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral());
InternalTestHelper.setInternalUserNumber(0);
- TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService);
+ TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService,rewardCentral);
User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com");
- VisitedLocation visitedLocation = tourGuideService.trackUserLocation(user);
+ CompletableFuture visitedLocation = tourGuideService.trackUserLocation(user);
- List attractions = tourGuideService.getNearByAttractions(visitedLocation);
+ List attractions = tourGuideService.getNearByAttractions(visitedLocation.get());
tourGuideService.tracker.stopTracking();
@@ -112,9 +121,11 @@ public void getNearbyAttractions() {
public void getTripDeals() {
GpsUtil gpsUtil = new GpsUtil();
+ RewardCentral rewardCentral = new RewardCentral();
+
RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral());
InternalTestHelper.setInternalUserNumber(0);
- TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService);
+ TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService,rewardCentral);
User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com");