diff --git a/product-service/src/main/java/com/siriusxi/ms/store/ps/ProductServiceApplication.java b/product-service/src/main/java/com/siriusxi/ms/store/ps/ProductServiceApplication.java index b3aedb72..789980e3 100644 --- a/product-service/src/main/java/com/siriusxi/ms/store/ps/ProductServiceApplication.java +++ b/product-service/src/main/java/com/siriusxi/ms/store/ps/ProductServiceApplication.java @@ -15,8 +15,8 @@ public static void main(String[] args) { ConfigurableApplicationContext ctx = SpringApplication.run(ProductServiceApplication.class, args); - String mongodDbHost = ctx.getEnvironment().getProperty("spring.data.mongodb.host"); - String mongodDbPort = ctx.getEnvironment().getProperty("spring.data.mongodb.port"); - log.info("Connected to MongoDb: " + mongodDbHost + ":" + mongodDbPort); + var mongoDbHost = ctx.getEnvironment().getProperty("spring.data.mongodb.host"); + var mongoDbPort = ctx.getEnvironment().getProperty("spring.data.mongodb.port"); + log.info("Connected to MongoDb: " + mongoDbHost + ":" + mongoDbPort); } } diff --git a/product-service/src/test/java/com/siriusxi/ms/store/ps/PersistenceTests.java b/product-service/src/test/java/com/siriusxi/ms/store/ps/PersistenceTests.java index 6996252e..650b9148 100644 --- a/product-service/src/test/java/com/siriusxi/ms/store/ps/PersistenceTests.java +++ b/product-service/src/test/java/com/siriusxi/ms/store/ps/PersistenceTests.java @@ -21,7 +21,6 @@ import static org.junit.jupiter.api.Assertions.*; import static org.springframework.data.domain.Sort.Direction.ASC; -// FIXME to fix all optional class check with isPresent() @DataMongoTest public class PersistenceTests { @@ -42,10 +41,10 @@ public void setupDb() { @Test public void create() { - ProductEntity newEntity = new ProductEntity(2, "n", 2); + var newEntity = new ProductEntity(2, "n", 2); repository.save(newEntity); - ProductEntity foundEntity = repository.findById(newEntity.getId()).get(); + var foundEntity = repository.findById(newEntity.getId()).orElse(new ProductEntity()); assertEqualsProduct(newEntity, foundEntity); assertEquals(2, repository.count()); @@ -56,7 +55,7 @@ public void update() { savedEntity.setName("n2"); repository.save(savedEntity); - ProductEntity foundEntity = repository.findById(savedEntity.getId()).get(); + var foundEntity = repository.findById(savedEntity.getId()).orElse(new ProductEntity()); assertEquals(1, (long) foundEntity.getVersion()); assertEquals("n2", foundEntity.getName()); } @@ -90,26 +89,27 @@ public void duplicateError() { public void optimisticLockError() { // Store the saved entity in two separate entity objects - ProductEntity entity1 = repository.findById(savedEntity.getId()).get(); - ProductEntity entity2 = repository.findById(savedEntity.getId()).get(); + ProductEntity entity1 = repository.findById(savedEntity.getId()).orElse(new ProductEntity()), + entity2 = repository.findById(savedEntity.getId()).orElse(new ProductEntity()); // Update the entity using the first entity object entity1.setName("n1"); repository.save(entity1); - // Update the entity using the second entity object. - // This should fail since the second entity now holds a old version number, i.e. a Optimistic - // Lock Error + /* + Update the entity using the second entity object. + This should fail since the second entity now holds a old version number, + i.e. a Optimistic Lock Error. + */ try { entity2.setName("n2"); repository.save(entity2); fail("Expected an OptimisticLockingFailureException"); - } catch (OptimisticLockingFailureException ignored) { - } + } catch (OptimisticLockingFailureException ignored) { } // Get the updated entity from the database and verify its new sate - ProductEntity updatedEntity = repository.findById(savedEntity.getId()).get(); + var updatedEntity = repository.findById(savedEntity.getId()).orElse(new ProductEntity()); assertEquals(1, (int) updatedEntity.getVersion()); assertEquals("n1", updatedEntity.getName()); } diff --git a/recommendation-service/src/main/java/com/siriusxi/ms/store/rs/RecommendationServiceApplication.java b/recommendation-service/src/main/java/com/siriusxi/ms/store/rs/RecommendationServiceApplication.java index 91d4e8c1..918c8ca6 100644 --- a/recommendation-service/src/main/java/com/siriusxi/ms/store/rs/RecommendationServiceApplication.java +++ b/recommendation-service/src/main/java/com/siriusxi/ms/store/rs/RecommendationServiceApplication.java @@ -15,8 +15,8 @@ public static void main(String[] args) { ConfigurableApplicationContext ctx = SpringApplication.run(RecommendationServiceApplication.class, args); - String mongodDbHost = ctx.getEnvironment().getProperty("spring.data.mongodb.host"); - String mongodDbPort = ctx.getEnvironment().getProperty("spring.data.mongodb.port"); - log.info("Connected to MongoDb: " + mongodDbHost + ":" + mongodDbPort); + String mongoDbHost = ctx.getEnvironment().getProperty("spring.data.mongodb.host"); + String mongoDbPort = ctx.getEnvironment().getProperty("spring.data.mongodb.port"); + log.info("Connected to MongoDb: " + mongoDbHost + ":" + mongoDbPort); } } diff --git a/recommendation-service/src/test/java/com/siriusxi/ms/store/rs/PersistenceTests.java b/recommendation-service/src/test/java/com/siriusxi/ms/store/rs/PersistenceTests.java index ac519457..f42eb5e8 100644 --- a/recommendation-service/src/test/java/com/siriusxi/ms/store/rs/PersistenceTests.java +++ b/recommendation-service/src/test/java/com/siriusxi/ms/store/rs/PersistenceTests.java @@ -16,7 +16,6 @@ import static org.hamcrest.Matchers.hasSize; import static org.junit.jupiter.api.Assertions.*; -// FIXME to fix all optional class check with isPresent() @DataMongoTest public class PersistenceTests { @@ -37,10 +36,10 @@ public void setupDb() { @Test public void create() { - RecommendationEntity newEntity = new RecommendationEntity(1, 3, "a", 3, "c"); + var newEntity = new RecommendationEntity(1, 3, "a", 3, "c"); repository.save(newEntity); - RecommendationEntity foundEntity = repository.findById(newEntity.getId()).get(); + var foundEntity = repository.findById(newEntity.getId()).orElse(new RecommendationEntity()); assertEqualsRecommendation(newEntity, foundEntity); assertEquals(2, repository.count()); @@ -75,26 +74,26 @@ public void duplicateError() { Assertions.assertThrows( DuplicateKeyException.class, - () -> { - RecommendationEntity entity = new RecommendationEntity(1, 2, "a", 3, "c"); - repository.save(entity); - }); + () -> repository.save(new RecommendationEntity(1, 2, "a", 3, "c"))); } @Test public void optimisticLockError() { // Store the saved entity in two separate entity objects - RecommendationEntity entity1 = repository.findById(savedEntity.getId()).get(); - RecommendationEntity entity2 = repository.findById(savedEntity.getId()).get(); + RecommendationEntity + entity1 = repository.findById(savedEntity.getId()).orElse(new RecommendationEntity()), + entity2 = repository.findById(savedEntity.getId()).orElse(new RecommendationEntity()); // Update the entity using the first entity object entity1.setAuthor("a1"); repository.save(entity1); - // Update the entity using the second entity object. - // This should fail since the second entity now holds a old version number, i.e. a Optimistic - // Lock Error + /* + Update the entity using the second entity object. + This should fail since the second entity now holds a old version number, + i.e. a Optimistic Lock Error. + */ try { entity2.setAuthor("a2"); repository.save(entity2); @@ -104,7 +103,8 @@ public void optimisticLockError() { } // Get the updated entity from the database and verify its new sate - RecommendationEntity updatedEntity = repository.findById(savedEntity.getId()).get(); + var updatedEntity = repository.findById(savedEntity.getId()).orElse(new RecommendationEntity()); + assertEquals(1, (int) updatedEntity.getVersion()); assertEquals("a1", updatedEntity.getAuthor()); } diff --git a/review-service/src/test/java/com/siriusxi/ms/store/revs/PersistenceTests.java b/review-service/src/test/java/com/siriusxi/ms/store/revs/PersistenceTests.java index e63d003c..eeca74c7 100644 --- a/review-service/src/test/java/com/siriusxi/ms/store/revs/PersistenceTests.java +++ b/review-service/src/test/java/com/siriusxi/ms/store/revs/PersistenceTests.java @@ -34,7 +34,7 @@ public class PersistenceTests { public void setupDb() { repository.deleteAll(); - ReviewEntity entity = new ReviewEntity(1, 2, "amazon", "s", "c"); + var entity = new ReviewEntity(1, 2, "amazon", "s", "c"); savedEntity = repository.save(entity); assertEquals(entity, savedEntity); @@ -43,26 +43,23 @@ public void setupDb() { @Test public void create() { - ReviewEntity newEntity = new ReviewEntity(1, 3, "amazon 1", "s", "c"); + var newEntity = new ReviewEntity(1, 3, "amazon 1", "s", "c"); repository.save(newEntity); Optional entity = repository.findById(newEntity.getId()); - ReviewEntity foundEntity = new ReviewEntity(); - if(entity.isPresent()) foundEntity = entity.get(); - assertEquals(newEntity, foundEntity); + assertEquals(newEntity, entity.orElse(new ReviewEntity())); assertEquals(2, repository.count()); } @Test public void update() { + savedEntity.setAuthor("amazon 2"); repository.save(savedEntity); - Optional entity = repository.findById(savedEntity.getId()); - ReviewEntity foundEntity = new ReviewEntity(); - if(entity.isPresent()) foundEntity = entity.get(); + var foundEntity = repository.findById(savedEntity.getId()).orElse(new ReviewEntity()); assertEquals(1, (long) foundEntity.getVersion()); assertEquals("amazon 2", foundEntity.getAuthor()); @@ -71,6 +68,7 @@ public void update() { @Test public void delete() { repository.delete(savedEntity); + assertFalse(repository.existsById(savedEntity.getId())); } @@ -86,34 +84,28 @@ public void getByProductId() { public void duplicateError() { Assertions.assertThrows( - DataIntegrityViolationException.class, - () -> { - ReviewEntity entity = new ReviewEntity(1, 2, "amazon 1", "s", "c"); - repository.save(entity); - }); + DataIntegrityViolationException.class, + () -> repository.save(new ReviewEntity( + 1, 2, "amazon 1", + "s", "c"))); } @Test public void optimisticLockError() { - ReviewEntity entity1 = new ReviewEntity(), - entity2 = new ReviewEntity(); - // Store the saved entity in two separate entity objects - Optional result = repository.findById(savedEntity.getId()); - if (result.isPresent()) entity1 = result.get(); - - Optional result2 = repository.findById(savedEntity.getId()); - if (result2.isPresent()) entity2 = result2.get(); - + ReviewEntity entity1 = repository.findById(savedEntity.getId()).orElse(new ReviewEntity()), + entity2 = repository.findById(savedEntity.getId()).orElse(new ReviewEntity()); // Update the entity using the first entity object entity1.setAuthor("amazon 1"); repository.save(entity1); - // Update the entity using the second entity object. - // This should fail since the second entity now holds a old version number, i.e. a Optimistic - // Lock Error + /* + Update the entity using the second entity object. + This should fail since the second entity now holds a old version number, + i.e. a Optimistic Lock Error + */ try { entity2.setAuthor("amazon 2"); repository.save(entity2); @@ -123,9 +115,7 @@ public void optimisticLockError() { } // Get the updated entity from the database and verify its new sate - Optional foundEntity = repository.findById(savedEntity.getId()); - ReviewEntity updatedEntity = new ReviewEntity(); - if(foundEntity.isPresent()) updatedEntity = foundEntity.get(); + var updatedEntity = repository.findById(savedEntity.getId()).orElse(new ReviewEntity()); assertEquals(1, updatedEntity.getVersion()); assertEquals("amazon 1", updatedEntity.getAuthor()); diff --git a/store-service/src/main/java/com/siriusxi/ms/store/pcs/api/StoreController.java b/store-service/src/main/java/com/siriusxi/ms/store/pcs/api/StoreController.java index 825f9a0f..360eb8ff 100644 --- a/store-service/src/main/java/com/siriusxi/ms/store/pcs/api/StoreController.java +++ b/store-service/src/main/java/com/siriusxi/ms/store/pcs/api/StoreController.java @@ -11,7 +11,10 @@ @RestController @Log4j2 public class StoreController implements StoreEndpoint { - /** Store service business logic interface. */ + + /** + * Store service business logic interface. + */ private final StoreService storeService; @Autowired diff --git a/store-service/src/main/java/com/siriusxi/ms/store/pcs/integration/StoreIntegration.java b/store-service/src/main/java/com/siriusxi/ms/store/pcs/integration/StoreIntegration.java index 919db831..58204b82 100644 --- a/store-service/src/main/java/com/siriusxi/ms/store/pcs/integration/StoreIntegration.java +++ b/store-service/src/main/java/com/siriusxi/ms/store/pcs/integration/StoreIntegration.java @@ -29,6 +29,8 @@ @Log4j2 public class StoreIntegration implements ProductService, RecommendationEndpoint, ReviewService { + public static final String PRODUCT_ID_QUERY_PARAM = "?productId="; + private final RestTemplate restTemplate; private final ObjectMapper mapper; @@ -77,7 +79,7 @@ public Product createProduct(Product body) { log.debug("Will post a new product to URL: {}", url); Product product = restTemplate.postForObject(url, body, Product.class); - log.debug("Created a product with id: {}", product.getProductId()); + log.debug("Created a product with id: {}", product != null ? product.getProductId() : -1); return product; @@ -94,7 +96,7 @@ public Product getProduct(int productId) { log.debug("Will call the getProduct API on URL: {}", url); Product product = restTemplate.getForObject(url, Product.class); - log.debug("Found a product with id: {}", product.getProductId()); + log.debug("Found a product with id: {}", product != null ? product.getProductId() : -1); return product; @@ -124,7 +126,8 @@ public Recommendation createRecommendation(Recommendation body) { log.debug("Will post a new recommendation to URL: {}", url); Recommendation recommendation = restTemplate.postForObject(url, body, Recommendation.class); - log.debug("Created a recommendation with id: {}", recommendation.getProductId()); + log.debug("Created a recommendation with id: {}", + recommendation != null ? recommendation.getRecommendationId() : -1); return recommendation; @@ -137,7 +140,7 @@ public Recommendation createRecommendation(Recommendation body) { public List getRecommendations(int productId) { try { - String url = recommendationServiceUrl + "?productId=" + productId; + String url = recommendationServiceUrl.concat(PRODUCT_ID_QUERY_PARAM).concat(valueOf(productId)); log.debug("Will call the getRecommendations API on URL: {}", url); List recommendations = @@ -146,7 +149,7 @@ public List getRecommendations(int productId) { .getBody(); log.debug( - "Found {} recommendations for a product with id: {}", recommendations.size(), productId); + "Found {} recommendations for a product with id: {}", recommendations != null ? recommendations.size() : 0, productId); return recommendations; } catch (Exception ex) { @@ -160,7 +163,9 @@ public List getRecommendations(int productId) { @Override public void deleteRecommendations(int productId) { try { - String url = recommendationServiceUrl + "?productId=" + productId; + String url = recommendationServiceUrl + .concat(PRODUCT_ID_QUERY_PARAM) + .concat(valueOf(productId)); log.debug("Will call the deleteRecommendations API on URL: {}", url); restTemplate.delete(url); @@ -177,8 +182,8 @@ public Review createReview(Review body) { String url = reviewServiceUrl; log.debug("Will post a new review to URL: {}", url); - Review review = restTemplate.postForObject(url, body, Review.class); - log.debug("Created a review with id: {}", review.getProductId()); + var review = restTemplate.postForObject(url, body, Review.class); + log.debug("Created a review with id: {}", review != null ? review.getProductId() : 0); return review; @@ -191,7 +196,9 @@ public Review createReview(Review body) { public List getReviews(int productId) { try { - String url = reviewServiceUrl + "?productId=" + productId; + String url = reviewServiceUrl + .concat(PRODUCT_ID_QUERY_PARAM) + .concat(valueOf(productId)); log.debug("Will call the getReviews API on URL: {}", url); List reviews = @@ -199,7 +206,7 @@ public List getReviews(int productId) { .exchange(url, GET, null, new ParameterizedTypeReference>() {}) .getBody(); - log.debug("Found {} reviews for a product with id: {}", reviews.size(), productId); + log.debug("Found {} reviews for a product with id: {}", reviews != null ? reviews.size() : 0, productId); return reviews; } catch (Exception ex) { @@ -212,7 +219,9 @@ public List getReviews(int productId) { @Override public void deleteReviews(int productId) { try { - String url = reviewServiceUrl + "?productId=" + productId; + String url = reviewServiceUrl + .concat(PRODUCT_ID_QUERY_PARAM) + .concat(valueOf(productId)); log.debug("Will call the deleteReviews API on URL: {}", url); restTemplate.delete(url); @@ -223,16 +232,14 @@ public void deleteReviews(int productId) { } private RuntimeException handleHttpClientException(HttpClientErrorException ex) { - switch (ex.getStatusCode()) { - case NOT_FOUND: - return new NotFoundException(getErrorMessage(ex)); - case UNPROCESSABLE_ENTITY: - return new InvalidInputException(getErrorMessage(ex)); - default: + return switch (ex.getStatusCode()) { + case NOT_FOUND -> new NotFoundException(getErrorMessage(ex)); + case UNPROCESSABLE_ENTITY -> new InvalidInputException(getErrorMessage(ex)); + default -> { log.warn("Got a unexpected HTTP error: {}, will rethrow it", ex.getStatusCode()); log.warn("Error body: {}", ex.getResponseBodyAsString()); - return ex; - } + throw ex;} + }; } private String getErrorMessage(HttpClientErrorException ex) { diff --git a/store-service/src/main/java/com/siriusxi/ms/store/pcs/service/StoreServiceImpl.java b/store-service/src/main/java/com/siriusxi/ms/store/pcs/service/StoreServiceImpl.java index 0882c066..1a2a5f64 100644 --- a/store-service/src/main/java/com/siriusxi/ms/store/pcs/service/StoreServiceImpl.java +++ b/store-service/src/main/java/com/siriusxi/ms/store/pcs/service/StoreServiceImpl.java @@ -18,7 +18,6 @@ import java.util.List; import java.util.stream.Collectors; -// FIXME to add all the checks for empty collections @Service("StoreServiceImpl") @Log4j2 public class StoreServiceImpl implements StoreService { @@ -151,9 +150,9 @@ private ProductAggregate createProductAggregate( // 4. Create info regarding the involved microservices addresses String productAddress = product.getServiceAddress(); String reviewAddress = - (reviews != null && reviews.size() > 0) ? reviews.get(0).getServiceAddress() : ""; + (reviews != null && !reviews.isEmpty()) ? reviews.get(0).getServiceAddress() : ""; String recommendationAddress = - (recommendations != null && recommendations.size() > 0) + (recommendations != null && !recommendations.isEmpty()) ? recommendations.get(0).getServiceAddress() : ""; ServiceAddresses serviceAddresses = diff --git a/store-service/src/test/java/com/siriusxi/ms/store/pcs/StoreServiceApplicationTests.java b/store-service/src/test/java/com/siriusxi/ms/store/pcs/StoreServiceApplicationTests.java index a892262d..4eec94b6 100644 --- a/store-service/src/test/java/com/siriusxi/ms/store/pcs/StoreServiceApplicationTests.java +++ b/store-service/src/test/java/com/siriusxi/ms/store/pcs/StoreServiceApplicationTests.java @@ -32,9 +32,12 @@ class StoreServiceApplicationTests { private static final int PRODUCT_ID_OK = 1; private static final int PRODUCT_ID_NOT_FOUND = 2; private static final int PRODUCT_ID_INVALID = 3; - @Autowired private WebTestClient client; - @MockBean private StoreIntegration storeIntegration; + @Autowired + private WebTestClient client; + + @MockBean + private StoreIntegration storeIntegration; @BeforeEach void setUp() { @@ -62,14 +65,14 @@ void setUp() { @Test public void createCompositeProduct1() { - ProductAggregate compositeProduct = new ProductAggregate(1, "name", 1, null, null, null); + var compositeProduct = new ProductAggregate(1, "name", 1, null, null, null); postAndVerifyProductIsCreated(compositeProduct); } @Test public void createCompositeProduct2() { - ProductAggregate compositeProduct = + var compositeProduct = new ProductAggregate( 1, "name", @@ -83,7 +86,7 @@ public void createCompositeProduct2() { @Test public void deleteCompositeProduct() { - ProductAggregate compositeProduct = + var compositeProduct = new ProductAggregate( 1, "name", diff --git a/store-utils/src/main/java/com/siriusxi/ms/store/util/exceptions/NotFoundException.java b/store-utils/src/main/java/com/siriusxi/ms/store/util/exceptions/NotFoundException.java index 3431f711..0c7204b9 100644 --- a/store-utils/src/main/java/com/siriusxi/ms/store/util/exceptions/NotFoundException.java +++ b/store-utils/src/main/java/com/siriusxi/ms/store/util/exceptions/NotFoundException.java @@ -1,6 +1,7 @@ package com.siriusxi.ms.store.util.exceptions; public class NotFoundException extends RuntimeException { + public NotFoundException() {} public NotFoundException(String message) { diff --git a/store-utils/src/main/java/com/siriusxi/ms/store/util/http/GlobalControllerExceptionHandler.java b/store-utils/src/main/java/com/siriusxi/ms/store/util/http/GlobalControllerExceptionHandler.java index b66f5930..689ea9dc 100644 --- a/store-utils/src/main/java/com/siriusxi/ms/store/util/http/GlobalControllerExceptionHandler.java +++ b/store-utils/src/main/java/com/siriusxi/ms/store/util/http/GlobalControllerExceptionHandler.java @@ -63,8 +63,8 @@ class GlobalControllerExceptionHandler { private HttpErrorInfo createHttpErrorInfo( HttpStatus httpStatus, ServerHttpRequest request, Exception ex) { - final String path = request.getPath().pathWithinApplication().value(); - final String message = ex.getMessage(); + final var path = request.getPath().pathWithinApplication().value(); + final var message = ex.getMessage(); log.debug("Returning HTTP status: {} for path: {}, message: {}", httpStatus, path, message); return new HttpErrorInfo(httpStatus, path, message);