diff --git a/apache-httpclient-2/README.md b/apache-httpclient-2/README.md index 05bebfaacb..a19112476b 100644 --- a/apache-httpclient-2/README.md +++ b/apache-httpclient-2/README.md @@ -13,4 +13,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [How To Get Cookies From the Apache HttpClient Response](https://www.baeldung.com/java-apache-httpclient-cookies) - [Enabling Logging for Apache HttpClient](https://www.baeldung.com/apache-httpclient-enable-logging) - [Apache HttpClient vs. CloseableHttpClient](https://www.baeldung.com/apache-httpclient-vs-closeablehttpclient) +- [Expand Shortened URLs with Apache HttpClient](https://www.baeldung.com/apache-httpclient-expand-url) - More articles: [[<-- prev]](../apache-httpclient) diff --git a/apache-httpclient-2/src/test/java/com/baeldung/httpclient/expandUrl/HttpClientExpandUrlLiveTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/expandUrl/HttpClientExpandUrlLiveTest.java new file mode 100644 index 0000000000..c1bb5bdddb --- /dev/null +++ b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/expandUrl/HttpClientExpandUrlLiveTest.java @@ -0,0 +1,126 @@ +package com.baeldung.httpclient.expandUrl; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + +import java.io.IOException; +import java.util.List; + +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; + +import org.apache.hc.client5.http.classic.methods.HttpHead; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; + +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.HttpHeaders; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +class HttpClientExpandUrlLiveTest { + + private static CloseableHttpClient httpClient; + + @BeforeAll + static void setup() { + httpClient = HttpClientBuilder.create() + .disableRedirectHandling() + .build(); + } + + @AfterAll + static void tearDown() throws IOException { + if (httpClient != null) { + httpClient.close(); + } + } + + @Test + void givenShortenedOnce_whenUrlIsExpanded_thenCorrectResult() throws IOException { + final String expectedResult = "https://www.baeldung.com/rest-versioning"; + final String actualResult = expandSingleLevel("http://bit.ly/3LScTri"); + assertThat(actualResult, equalTo(expectedResult)); + } + + @Test + void givenShortenedMultiple_whenUrlIsExpanded_thenCorrectResult() throws IOException { + final String expectedResult = "https://www.baeldung.com/rest-versioning"; + final String actualResult = expand("http://t.co/e4rDDbnzmk"); + assertThat(actualResult, equalTo(expectedResult)); + } + + private String expand(final String urlArg) throws IOException { + String originalUrl = urlArg; + String newUrl = expandSingleLevel(originalUrl); + while (!originalUrl.equals(newUrl)) { + originalUrl = newUrl; + newUrl = expandSingleLevel(originalUrl); + } + + return newUrl; + } + + final String expandSafe(final String urlArg) throws IOException { + String originalUrl = urlArg; + String newUrl = expandSingleLevelSafe(originalUrl).getRight(); + final List alreadyVisited = Lists.newArrayList(originalUrl, newUrl); + while (!originalUrl.equals(newUrl)) { + originalUrl = newUrl; + final Pair statusAndUrl = expandSingleLevelSafe(originalUrl); + newUrl = statusAndUrl.getRight(); + final boolean isRedirect = statusAndUrl.getLeft() == 301 || statusAndUrl.getLeft() == 302; + if (isRedirect && alreadyVisited.contains(newUrl)) { + throw new IllegalStateException("Likely a redirect loop"); + } + alreadyVisited.add(newUrl); + } + + return newUrl; + } + + private Pair expandSingleLevelSafe(final String url) throws IOException { + try { + HttpHead request = new HttpHead(url); + Pair resp = httpClient.execute(request, response -> { + final int statusCode = response.getCode(); + if (statusCode != 301 && statusCode != 302) { + return new ImmutablePair<>(statusCode, url); + } + final Header[] headers = response.getHeaders(HttpHeaders.LOCATION); + Preconditions.checkState(headers.length == 1); + final String newUrl = headers[0].getValue(); + + return new ImmutablePair<>(statusCode, newUrl); + }); + return resp; + } catch (final IllegalArgumentException uriEx) { + return new ImmutablePair<>(500, url); + } + } + + private String expandSingleLevel(final String url) throws IOException { + try { + HttpHead request = new HttpHead(url); + String expandedUrl = httpClient.execute(request, response -> { + final int statusCode = response.getCode(); + if (statusCode != 301 && statusCode != 302) { + return url; + } + final Header[] headers = response.getHeaders(HttpHeaders.LOCATION); + Preconditions.checkState(headers.length == 1); + + return headers[0].getValue(); + }); + return expandedUrl; + } catch (final IllegalArgumentException uriEx) { + return url; + } + } + +} diff --git a/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientCancelRequestLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientCancelRequestLiveTest.java new file mode 100644 index 0000000000..d19e0e1d86 --- /dev/null +++ b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientCancelRequestLiveTest.java @@ -0,0 +1,40 @@ +package com.baeldung.httpclient; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.IOException; + +import org.apache.hc.client5.http.classic.methods.HttpGet; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.core5.http.HttpEntity; +import org.apache.hc.core5.http.HttpStatus; +import org.junit.jupiter.api.Test; + +class HttpClientCancelRequestLiveTest { + + private static final String SAMPLE_URL = "http://www.github.com"; + + @Test + void whenRequestIsCanceled_thenCorrect() throws IOException { + HttpGet request = new HttpGet(SAMPLE_URL); + try (CloseableHttpClient httpClient = HttpClients.createDefault()) { + httpClient.execute(request, response -> { + HttpEntity entity = response.getEntity(); + + System.out.println("----------------------------------------"); + System.out.println(response.getCode()); + if (entity != null) { + System.out.println("Response content length: " + entity.getContentLength()); + } + System.out.println("----------------------------------------"); + // Do not feel like reading the response body + // Call abort on the request object + request.abort(); + + assertThat(response.getCode()).isEqualTo(HttpStatus.SC_OK); + return response; + }); + } + } +} diff --git a/apache-httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientLiveTest.java index ef12c37412..4173909f7d 100644 --- a/apache-httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientLiveTest.java +++ b/apache-httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientLiveTest.java @@ -1,8 +1,8 @@ package com.baeldung.httpclient.base; import com.baeldung.httpclient.ResponseUtil; + import org.apache.http.Header; -import org.apache.http.HttpEntity; import org.apache.http.HttpHeaders; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; @@ -10,7 +10,6 @@ import org.apache.http.client.methods.HttpGet; import org.apache.http.conn.ConnectTimeoutException; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.BasicHttpClientConnectionManager; import org.junit.After; import org.junit.Before; @@ -73,30 +72,4 @@ public class HttpClientLiveTest { assertThat(headers, not(emptyArray())); } - // tests - cancel request - - @Test - public final void whenRequestIsCanceled_thenCorrect() throws IOException { - instance = HttpClients.custom().build(); - final HttpGet request = new HttpGet(SAMPLE_URL); - response = instance.execute(request); - - try { - final HttpEntity entity = response.getEntity(); - - System.out.println("----------------------------------------"); - System.out.println(response.getStatusLine()); - if (entity != null) { - System.out.println("Response content length: " + entity.getContentLength()); - } - System.out.println("----------------------------------------"); - - // Do not feel like reading the response body - // Call abort on the request object - request.abort(); - } finally { - response.close(); - } - } - } diff --git a/apache-httpclient4/README.md b/apache-httpclient4/README.md index 9c18e06243..22b0391e6b 100644 --- a/apache-httpclient4/README.md +++ b/apache-httpclient4/README.md @@ -4,6 +4,7 @@ This module contains articles about Apache HttpClient 4.5 ### Relevant Articles +- [Apache HttpClient – Cancel Request](https://www.baeldung.com/httpclient-cancel-request) - [Apache HttpClient with SSL](https://www.baeldung.com/httpclient-ssl) - [Apache HttpClient Timeout](https://www.baeldung.com/httpclient-timeout) - [Custom HTTP Header with the Apache HttpClient](https://www.baeldung.com/httpclient-custom-http-header) diff --git a/apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpClientCancelRequestV4LiveTest.java b/apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpClientCancelRequestV4LiveTest.java new file mode 100644 index 0000000000..226a7b8cf7 --- /dev/null +++ b/apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpClientCancelRequestV4LiveTest.java @@ -0,0 +1,57 @@ +package com.baeldung.httpclient; + +import java.io.IOException; + +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.client.HttpClients; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class HttpClientCancelRequestV4LiveTest { + + private static final String SAMPLE_URL = "http://www.github.com"; + + private CloseableHttpClient instance; + + private CloseableHttpResponse response; + + @Before + public final void before() { + instance = HttpClientBuilder.create().build(); + } + + @After + public final void after() throws IllegalStateException, IOException { + ResponseUtil.closeResponse(response); + } + + @Test + public final void whenRequestIsCanceled_thenCorrect() throws IOException { + instance = HttpClients.custom().build(); + final HttpGet request = new HttpGet(SAMPLE_URL); + response = instance.execute(request); + + try { + final HttpEntity entity = response.getEntity(); + + System.out.println("----------------------------------------"); + System.out.println(response.getStatusLine()); + if (entity != null) { + System.out.println("Response content length: " + entity.getContentLength()); + } + System.out.println("----------------------------------------"); + + // Do not feel like reading the response body + // Call abort on the request object + request.abort(); + } finally { + response.close(); + } + } +} diff --git a/apache-httpclient4/src/test/java/com/baeldung/httpclient/retry/ApacheHttpClientRetryIntegrationTest.java b/apache-httpclient4/src/test/java/com/baeldung/httpclient/retry/ApacheHttpClientRetryLiveTest.java similarity index 99% rename from apache-httpclient4/src/test/java/com/baeldung/httpclient/retry/ApacheHttpClientRetryIntegrationTest.java rename to apache-httpclient4/src/test/java/com/baeldung/httpclient/retry/ApacheHttpClientRetryLiveTest.java index cfb51f058a..3a8ff252c2 100644 --- a/apache-httpclient4/src/test/java/com/baeldung/httpclient/retry/ApacheHttpClientRetryIntegrationTest.java +++ b/apache-httpclient4/src/test/java/com/baeldung/httpclient/retry/ApacheHttpClientRetryLiveTest.java @@ -24,7 +24,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -public class ApacheHttpClientRetryIntegrationTest { +public class ApacheHttpClientRetryLiveTest { private Integer requestCounter; private CloseableHttpClient httpClient; diff --git a/aws-modules/aws-lambda/.gitignore b/aws-modules/aws-lambda-modules/.gitignore similarity index 100% rename from aws-modules/aws-lambda/.gitignore rename to aws-modules/aws-lambda-modules/.gitignore diff --git a/aws-modules/aws-lambda/README.md b/aws-modules/aws-lambda-modules/README.md similarity index 100% rename from aws-modules/aws-lambda/README.md rename to aws-modules/aws-lambda-modules/README.md diff --git a/aws-modules/aws-lambda/lambda/pom.xml b/aws-modules/aws-lambda-modules/lambda-function/pom.xml similarity index 96% rename from aws-modules/aws-lambda/lambda/pom.xml rename to aws-modules/aws-lambda-modules/lambda-function/pom.xml index 8e47bab4be..9fff7d1d9a 100644 --- a/aws-modules/aws-lambda/lambda/pom.xml +++ b/aws-modules/aws-lambda-modules/lambda-function/pom.xml @@ -3,14 +3,14 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - lambda + lambda-function 0.1.0-SNAPSHOT - lambda + lambda-function jar com.baeldung - aws-lambda + aws-lambda-modules 1.0.0-SNAPSHOT diff --git a/aws-modules/aws-lambda/lambda/sam-templates/template-implicit.yaml b/aws-modules/aws-lambda-modules/lambda-function/sam-templates/template-implicit.yaml similarity index 100% rename from aws-modules/aws-lambda/lambda/sam-templates/template-implicit.yaml rename to aws-modules/aws-lambda-modules/lambda-function/sam-templates/template-implicit.yaml diff --git a/aws-modules/aws-lambda/lambda/sam-templates/template-inline-swagger.yaml b/aws-modules/aws-lambda-modules/lambda-function/sam-templates/template-inline-swagger.yaml similarity index 100% rename from aws-modules/aws-lambda/lambda/sam-templates/template-inline-swagger.yaml rename to aws-modules/aws-lambda-modules/lambda-function/sam-templates/template-inline-swagger.yaml diff --git a/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java b/aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java similarity index 100% rename from aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java rename to aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java diff --git a/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java b/aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java similarity index 100% rename from aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java rename to aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java diff --git a/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java b/aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java similarity index 100% rename from aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java rename to aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java diff --git a/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java b/aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java similarity index 100% rename from aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java rename to aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java diff --git a/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java b/aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/apigateway/model/Person.java similarity index 100% rename from aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java rename to aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/apigateway/model/Person.java diff --git a/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java b/aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java similarity index 100% rename from aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java rename to aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java diff --git a/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java b/aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java similarity index 100% rename from aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java rename to aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java diff --git a/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java b/aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java similarity index 100% rename from aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java rename to aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java diff --git a/aws-modules/aws-lambda/lambda/src/main/resources/logback.xml b/aws-modules/aws-lambda-modules/lambda-function/src/main/resources/logback.xml similarity index 100% rename from aws-modules/aws-lambda/lambda/src/main/resources/logback.xml rename to aws-modules/aws-lambda-modules/lambda-function/src/main/resources/logback.xml diff --git a/aws-modules/aws-lambda/pom.xml b/aws-modules/aws-lambda-modules/pom.xml similarity index 67% rename from aws-modules/aws-lambda/pom.xml rename to aws-modules/aws-lambda-modules/pom.xml index bdd295c007..9886ff58d2 100644 --- a/aws-modules/aws-lambda/pom.xml +++ b/aws-modules/aws-lambda-modules/pom.xml @@ -3,8 +3,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - aws-lambda - aws-lambda + aws-lambda-modules + aws-lambda-modules pom @@ -14,9 +14,9 @@ - lambda - shipping-tracker/ShippingFunction - todo-reminder/ToDoFunction + lambda-function + shipping-tracker-lambda/ShippingFunction + todo-reminder-lambda/ToDoFunction \ No newline at end of file diff --git a/aws-modules/aws-lambda/shipping-tracker/.gitignore b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/.gitignore similarity index 100% rename from aws-modules/aws-lambda/shipping-tracker/.gitignore rename to aws-modules/aws-lambda-modules/shipping-tracker-lambda/.gitignore diff --git a/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/pom.xml b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/pom.xml similarity index 98% rename from aws-modules/aws-lambda/shipping-tracker/ShippingFunction/pom.xml rename to aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/pom.xml index a60f934bad..abd22ea50c 100644 --- a/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/pom.xml +++ b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/pom.xml @@ -9,7 +9,7 @@ com.baeldung - aws-lambda + aws-lambda-modules 1.0.0-SNAPSHOT ../../ diff --git a/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java similarity index 100% rename from aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java rename to aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java diff --git a/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java similarity index 100% rename from aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java rename to aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java diff --git a/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java similarity index 100% rename from aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java rename to aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java diff --git a/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java similarity index 100% rename from aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java rename to aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java diff --git a/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingDao.java b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingDao.java similarity index 100% rename from aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingDao.java rename to aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingDao.java diff --git a/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingService.java b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingService.java similarity index 100% rename from aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingService.java rename to aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingService.java diff --git a/aws-modules/aws-lambda/shipping-tracker/template.yaml b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/template.yaml similarity index 100% rename from aws-modules/aws-lambda/shipping-tracker/template.yaml rename to aws-modules/aws-lambda-modules/shipping-tracker-lambda/template.yaml diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/pom.xml b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/pom.xml similarity index 95% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/pom.xml rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/pom.xml index 5545154a5d..04295e1ab1 100644 --- a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/pom.xml +++ b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/pom.xml @@ -8,6 +8,13 @@ ToDoFunction jar + + com.baeldung + aws-lambda-modules + 1.0.0-SNAPSHOT + ../../ + + com.amazonaws diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/resources/configuration.yml b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/resources/configuration.yml similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/resources/configuration.yml rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/resources/configuration.yml diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/resources/log4j2.xml b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/resources/log4j2.xml similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/resources/log4j2.xml rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/resources/log4j2.xml diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppTest.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppUnitTest.java similarity index 98% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppTest.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppUnitTest.java index cbdc8c22cb..952a773f69 100644 --- a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppTest.java +++ b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppUnitTest.java @@ -21,7 +21,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.verify; @RunWith(MockitoJUnitRunner.class) -public class AppTest { +public class AppUnitTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) private Context mockContext; diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceTest.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceUnitTest.java similarity index 94% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceTest.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceUnitTest.java index 634c5257ff..dd5b52d073 100644 --- a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceTest.java +++ b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceUnitTest.java @@ -7,7 +7,7 @@ import uk.org.webcompere.systemstubs.rules.SystemOutRule; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; -public class ToDoReaderServiceTest { +public class ToDoReaderServiceUnitTest { @Rule public SystemOutRule systemOutRule = new SystemOutRule(); diff --git a/aws-modules/aws-lambda/todo-reminder/template.yaml b/aws-modules/aws-lambda-modules/todo-reminder-lambda/template.yaml similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/template.yaml rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/template.yaml diff --git a/aws-modules/aws-s3/README.md b/aws-modules/aws-s3/README.md index efebf7d933..109a898405 100644 --- a/aws-modules/aws-s3/README.md +++ b/aws-modules/aws-s3/README.md @@ -6,4 +6,5 @@ This module contains articles about Simple Storage Service (S3) on AWS - [AWS S3 with Java](https://www.baeldung.com/aws-s3-java) - [Multipart Uploads in Amazon S3 with Java](https://www.baeldung.com/aws-s3-multipart-upload) -- [Using the JetS3t Java Client With Amazon S3](https://www.baeldung.com/jets3t-amazon-s3) \ No newline at end of file +- [Using the JetS3t Java Client With Amazon S3](https://www.baeldung.com/jets3t-amazon-s3) +- [Check if a Specified Key Exists in a Given S3 Bucket Using Java](https://www.baeldung.com/java-aws-s3-check-specified-key-exists) diff --git a/aws-modules/pom.xml b/aws-modules/pom.xml index 72c5017c32..02473815b5 100644 --- a/aws-modules/pom.xml +++ b/aws-modules/pom.xml @@ -15,7 +15,7 @@ aws-app-sync - aws-lambda + aws-lambda-modules aws-miscellaneous aws-reactive aws-s3 diff --git a/checker-plugin/README.md b/checker-framework/README.md similarity index 100% rename from checker-plugin/README.md rename to checker-framework/README.md diff --git a/checker-plugin/pom.xml b/checker-framework/pom.xml similarity index 98% rename from checker-plugin/pom.xml rename to checker-framework/pom.xml index e90dcf271e..a348745343 100644 --- a/checker-plugin/pom.xml +++ b/checker-framework/pom.xml @@ -3,9 +3,9 @@ xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 - checker-plugin + checker-framework 1.0-SNAPSHOT - checker-plugin + checker-framework jar diff --git a/checker-plugin/src/main/java/com/baeldung/typechecker/FakeNumExample.java b/checker-framework/src/main/java/com/baeldung/typechecker/FakeNumExample.java similarity index 100% rename from checker-plugin/src/main/java/com/baeldung/typechecker/FakeNumExample.java rename to checker-framework/src/main/java/com/baeldung/typechecker/FakeNumExample.java diff --git a/checker-plugin/src/main/java/com/baeldung/typechecker/FormatExample.java b/checker-framework/src/main/java/com/baeldung/typechecker/FormatExample.java similarity index 100% rename from checker-plugin/src/main/java/com/baeldung/typechecker/FormatExample.java rename to checker-framework/src/main/java/com/baeldung/typechecker/FormatExample.java diff --git a/checker-plugin/src/main/java/com/baeldung/typechecker/KeyForExample.java b/checker-framework/src/main/java/com/baeldung/typechecker/KeyForExample.java similarity index 100% rename from checker-plugin/src/main/java/com/baeldung/typechecker/KeyForExample.java rename to checker-framework/src/main/java/com/baeldung/typechecker/KeyForExample.java diff --git a/checker-plugin/src/main/java/com/baeldung/typechecker/MonotonicNotNullExample.java b/checker-framework/src/main/java/com/baeldung/typechecker/MonotonicNotNullExample.java similarity index 100% rename from checker-plugin/src/main/java/com/baeldung/typechecker/MonotonicNotNullExample.java rename to checker-framework/src/main/java/com/baeldung/typechecker/MonotonicNotNullExample.java diff --git a/checker-plugin/src/main/java/com/baeldung/typechecker/NonNullExample.java b/checker-framework/src/main/java/com/baeldung/typechecker/NonNullExample.java similarity index 100% rename from checker-plugin/src/main/java/com/baeldung/typechecker/NonNullExample.java rename to checker-framework/src/main/java/com/baeldung/typechecker/NonNullExample.java diff --git a/checker-plugin/src/main/java/com/baeldung/typechecker/RegexExample.java b/checker-framework/src/main/java/com/baeldung/typechecker/RegexExample.java similarity index 100% rename from checker-plugin/src/main/java/com/baeldung/typechecker/RegexExample.java rename to checker-framework/src/main/java/com/baeldung/typechecker/RegexExample.java diff --git a/checker-plugin/src/main/resources/logback.xml b/checker-framework/src/main/resources/logback.xml similarity index 100% rename from checker-plugin/src/main/resources/logback.xml rename to checker-framework/src/main/resources/logback.xml diff --git a/clojure/ring/.gitignore b/clojure-modules/clojure-ring/.gitignore similarity index 100% rename from clojure/ring/.gitignore rename to clojure-modules/clojure-ring/.gitignore diff --git a/clojure/ring/README.md b/clojure-modules/clojure-ring/README.md similarity index 100% rename from clojure/ring/README.md rename to clojure-modules/clojure-ring/README.md diff --git a/clojure/ring/project.clj b/clojure-modules/clojure-ring/project.clj similarity index 100% rename from clojure/ring/project.clj rename to clojure-modules/clojure-ring/project.clj diff --git a/clojure/ring/src/ring/core.clj b/clojure-modules/clojure-ring/src/ring/core.clj similarity index 100% rename from clojure/ring/src/ring/core.clj rename to clojure-modules/clojure-ring/src/ring/core.clj diff --git a/core-java-modules/core-java-19/README.md b/core-java-modules/core-java-19/README.md index 6a9c6c7fdd..68244d9f91 100644 --- a/core-java-modules/core-java-19/README.md +++ b/core-java-modules/core-java-19/README.md @@ -1,3 +1,4 @@ ## Relevant Articles - [Record Patterns in Java 19](https://www.baeldung.com/java-19-record-patterns) - [Structured Concurrency in Java 19](https://www.baeldung.com/java-structured-concurrency) +- [Possible Root Causes for High CPU Usage in Java](https://www.baeldung.com/java-high-cpu-usage-causes) diff --git a/core-java-modules/core-java-8-2/README.md b/core-java-modules/core-java-8-2/README.md index cad4a4f1fa..c723a827b1 100644 --- a/core-java-modules/core-java-8-2/README.md +++ b/core-java-modules/core-java-8-2/README.md @@ -11,4 +11,6 @@ This module contains articles about Java 8 core features - [Convert Between Byte Array and UUID in Java](https://www.baeldung.com/java-byte-array-to-uuid) - [Create a Simple “Rock-Paper-Scissors” Game in Java](https://www.baeldung.com/java-rock-paper-scissors) - [VarArgs vs Array Input Parameters in Java](https://www.baeldung.com/varargs-vs-array) +- [Lambda Expression vs. Anonymous Inner Class](https://www.baeldung.com/java-lambdas-vs-anonymous-class) +- [Java Helper vs. Utility Classes](https://www.baeldung.com/java-helper-vs-utility-classes) - [[<-- Prev]](/core-java-modules/core-java-8) diff --git a/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/anonymousclass/AnonymousClassExample.java b/core-java-modules/core-java-8-2/src/main/java/com/baeldung/anonymousclass/AnonymousClassExample.java similarity index 100% rename from core-java-modules/core-java-lambdas/src/main/java/com/baeldung/anonymousclass/AnonymousClassExample.java rename to core-java-modules/core-java-8-2/src/main/java/com/baeldung/anonymousclass/AnonymousClassExample.java diff --git a/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/lambdaexpression/LambdaExpressionExample.java b/core-java-modules/core-java-8-2/src/main/java/com/baeldung/lambdaexpression/LambdaExpressionExample.java similarity index 100% rename from core-java-modules/core-java-lambdas/src/main/java/com/baeldung/lambdaexpression/LambdaExpressionExample.java rename to core-java-modules/core-java-8-2/src/main/java/com/baeldung/lambdaexpression/LambdaExpressionExample.java diff --git a/core-java-modules/core-java-8-datetime-2/README.md b/core-java-modules/core-java-8-datetime-2/README.md index f16563aacc..56f66c10fb 100644 --- a/core-java-modules/core-java-8-datetime-2/README.md +++ b/core-java-modules/core-java-8-datetime-2/README.md @@ -2,4 +2,5 @@ - [Generating Random Dates in Java](https://www.baeldung.com/java-random-dates) - [Creating a LocalDate with Values in Java](https://www.baeldung.com/java-creating-localdate-with-values) -- [[<-- Prev]](/core-java-modules/core-java-datetime-java8-1) \ No newline at end of file +- [Parsing Date Strings with Varying Formats](https://www.baeldung.com/java-parsing-dates-many-formats) +- [[<-- Prev]](/core-java-modules/core-java-datetime-java8-1) diff --git a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleDateTimeFormat.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleDateTimeFormat.java new file mode 100644 index 0000000000..a82f3bce2b --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleDateTimeFormat.java @@ -0,0 +1,20 @@ +package com.baeldung.parsingDates; + +import java.util.Arrays; +import java.util.List; +import org.joda.time.LocalDate; +import org.joda.time.format.DateTimeFormat; + +public class SimpleDateTimeFormat { + + public static LocalDate parseDate(String date) { + List patternList = Arrays.asList("MM/dd/yyyy", "dd.MM.yyyy", "yyyy-MM-dd"); + for (String pattern : patternList) { + try { + return DateTimeFormat.forPattern(pattern).parseLocalDate(date); + } catch (IllegalArgumentException e) { + } + } + return null; + } +} diff --git a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleDateTimeFormater.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleDateTimeFormater.java new file mode 100644 index 0000000000..aa12038032 --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleDateTimeFormater.java @@ -0,0 +1,17 @@ +package com.baeldung.parsingDates; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; + +public class SimpleDateTimeFormater { + + public static LocalDate parseDate(String date) { + DateTimeFormatterBuilder dateTimeFormatterBuilder = new DateTimeFormatterBuilder() + .append(DateTimeFormatter.ofPattern("[MM/dd/yyyy]" + "[dd-MM-yyyy]" + "[yyyy-MM-dd]")); + + DateTimeFormatter dateTimeFormatter = dateTimeFormatterBuilder.toFormatter(); + + return LocalDate.parse(date, dateTimeFormatter); + } +} diff --git a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleDateUtils.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleDateUtils.java new file mode 100644 index 0000000000..8a154d3cd8 --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleDateUtils.java @@ -0,0 +1,18 @@ +package com.baeldung.parsingDates; + +import java.text.ParseException; +import java.util.Date; +import org.apache.commons.lang3.time.DateUtils; + +public class SimpleDateUtils { + + public static Date parseDate(String date) { + try { + return DateUtils.parseDateStrictly(date, + new String[]{"yyyy/MM/dd", "dd/MM/yyyy", "yyyy-MM-dd"}); + } catch (ParseException ex) { + return null; + } + } + +} diff --git a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleParseDate.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleParseDate.java new file mode 100644 index 0000000000..cb024eea53 --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleParseDate.java @@ -0,0 +1,19 @@ +package com.baeldung.parsingDates; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +public class SimpleParseDate { + + public Date parseDate(String dateString, List formatStrings) { + for (String formatString : formatStrings) { + try { + return new SimpleDateFormat(formatString).parse(dateString); + } catch (ParseException e) { + } + } + return null; + } +} diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/parsingDates/SimpleParseDateUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/parsingDates/SimpleParseDateUnitTest.java new file mode 100644 index 0000000000..d7cbb6a834 --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/parsingDates/SimpleParseDateUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.parsingDates; + +import com.baeldung.parsingDates.SimpleDateTimeFormat; +import com.baeldung.parsingDates.SimpleDateTimeFormater; +import com.baeldung.parsingDates.SimpleDateUtils; +import com.baeldung.parsingDates.SimpleParseDate; +import java.time.format.DateTimeParseException; +import java.util.Arrays; +import org.junit.*; +import static org.junit.Assert.*; +import org.joda.time.LocalDate; + +public class SimpleParseDateUnitTest { + + @Test + public void whenInvalidInput_thenGettingUnexpectedResult() { + SimpleParseDate simpleParseDate = new SimpleParseDate(); + String date = "2022-40-40"; + assertEquals("Sat May 10 00:00:00 UTC 2025", simpleParseDate.parseDate(date, Arrays.asList("MM/dd/yyyy", "dd.MM.yyyy", "yyyy-MM-dd")).toString()); + } + + @Test + public void whenInvalidDate_thenAssertThrows() { + SimpleDateTimeFormater simpleDateTimeFormater = new SimpleDateTimeFormater(); + assertEquals(java.time.LocalDate.parse("2022-12-04"), simpleDateTimeFormater.parseDate("2022-12-04")); + assertThrows(DateTimeParseException.class, () -> simpleDateTimeFormater.parseDate("2022-13-04")); + } + + @Test + public void whenDateIsCorrect_thenParseCorrect() { + SimpleDateUtils simpleDateUtils = new SimpleDateUtils(); + assertNull(simpleDateUtils.parseDate("53/10/2014")); + assertEquals("Wed Sep 10 00:00:00 UTC 2014", simpleDateUtils.parseDate("10/09/2014").toString()); + } + + @Test + public void whenDateIsCorrect_thenResultCorrect() { + SimpleDateTimeFormat simpleDateTimeFormat = new SimpleDateTimeFormat(); + assertNull(simpleDateTimeFormat.parseDate("53/10/2014")); + assertEquals(LocalDate.parse("2014-10-10"), simpleDateTimeFormat.parseDate("2014-10-10")); + } + +} diff --git a/core-java-modules/core-java-9-jigsaw/README.md b/core-java-modules/core-java-9-jigsaw/README.md index cfffb86588..73905e6033 100644 --- a/core-java-modules/core-java-9-jigsaw/README.md +++ b/core-java-modules/core-java-9-jigsaw/README.md @@ -8,5 +8,5 @@ This module contains articles about Project Jigsaw and the Java Platform Module - [A Guide to Java 9 Modularity](https://www.baeldung.com/java-9-modularity) - [Java 9 java.lang.Module API](https://www.baeldung.com/java-9-module-api) - [Java 9 Illegal Reflective Access Warning](https://www.baeldung.com/java-illegal-reflective-access) - +- [Java Modularity and Unit Testing](https://www.baeldung.com/java-modularity-unit-testing) diff --git a/core-java-modules/core-java-9-jigsaw/compile-library-core-module.sh b/core-java-modules/core-java-9-jigsaw/compile-library-core-module.sh new file mode 100644 index 0000000000..fa0d4d5f14 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/compile-library-core-module.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +javac -d mods/com.baeldung.library.core $(find library-core/src/main -name "*.java") \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/compile-library-core-tests.sh b/core-java-modules/core-java-9-jigsaw/compile-library-core-tests.sh new file mode 100644 index 0000000000..751906103b --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/compile-library-core-tests.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +javac --class-path outDir/library-core/:\ +libs/junit-jupiter-engine-5.9.2.jar:\ +libs/junit-platform-engine-1.9.2.jar:\ +libs/apiguardian-api-1.1.2.jar:\ +libs/junit-jupiter-params-5.9.2.jar:\ +libs/junit-jupiter-api-5.9.2.jar:\ +libs/opentest4j-1.2.0.jar:\ +libs/junit-platform-commons-1.9.2.jar \ +-d outDir/library-test library-core/src/test/java/com/baeldung/library/core/LibraryUnitTest.java \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/compile-library-core-with-tests.sh b/core-java-modules/core-java-9-jigsaw/compile-library-core-with-tests.sh new file mode 100644 index 0000000000..c873a9003c --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/compile-library-core-with-tests.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +javac --class-path libs/junit-jupiter-engine-5.9.2.jar:\ +libs/junit-platform-engine-1.9.2.jar:\ +libs/apiguardian-api-1.1.2.jar:\ +libs/junit-jupiter-params-5.9.2.jar:\ +libs/junit-jupiter-api-5.9.2.jar:\ +libs/opentest4j-1.2.0.jar:\ +libs/junit-platform-commons-1.9.2.jar \ +-d outDir/library-core \ +library-core/src/main/java/com/baeldung/library/core/Book.java \ +library-core/src/main/java/com/baeldung/library/core/Library.java \ +library-core/src/main/java/com/baeldung/library/core/Main.java \ +library-core/src/test/java/com/baeldung/library/core/LibraryUnitTest.java \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/compile-library-core.sh b/core-java-modules/core-java-9-jigsaw/compile-library-core.sh new file mode 100644 index 0000000000..7531148d0f --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/compile-library-core.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +javac --class-path libs/junit-jupiter-engine-5.9.2.jar:\ +libs/junit-platform-engine-1.9.2.jar:\ +libs/apiguardian-api-1.1.2.jar:\ +libs/junit-jupiter-params-5.9.2.jar:\ +libs/junit-jupiter-api-5.9.2.jar:\ +libs/opentest4j-1.2.0.jar:\ +libs/junit-platform-commons-1.9.2.jar \ +-d outDir/library-core \ +library-core/src/main/java/com/baeldung/library/core/Book.java \ +library-core/src/main/java/com/baeldung/library/core/Library.java \ +library-core/src/main/java/com/baeldung/library/core/Main.java \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/compile-library-test-module.sh b/core-java-modules/core-java-9-jigsaw/compile-library-test-module.sh new file mode 100644 index 0000000000..c6fd614fd0 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/compile-library-test-module.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +javac --module-path mods:libs -d mods/com.baeldung.library.test $(find library-test/src/test -name "*.java") \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/download-junit-dependencies.sh b/core-java-modules/core-java-9-jigsaw/download-junit-dependencies.sh new file mode 100644 index 0000000000..64c72a5429 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/download-junit-dependencies.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +wget -P libs/ https://repo1.maven.org/maven2/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar / +wget -P libs/ https://repo1.maven.org/maven2/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar / +wget -P libs/ https://repo1.maven.org/maven2/org/junit/platform/junit-platform-commons/1.9.2/junit-platform-commons-1.9.2.jar / +wget -P libs/ https://repo1.maven.org/maven2/org/junit/platform/junit-platform-engine/1.9.2/junit-platform-engine-1.9.2.jar / +wget -P libs/ https://repo1.maven.org/maven2/org/junit/platform/junit-platform-reporting/1.9.2/junit-platform-reporting-1.9.2.jar / +wget -P libs/ https://repo1.maven.org/maven2/org/junit/platform/junit-platform-console/1.9.2/junit-platform-console-1.9.2.jar / +wget -P libs/ https://repo1.maven.org/maven2/org/junit/platform/junit-platform-launcher/1.9.2/junit-platform-launcher-1.9.2.jar / +wget -P libs/ https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-engine/5.9.2/junit-jupiter-engine-5.9.2.jar / +wget -P libs/ https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-params/5.9.2/junit-jupiter-params-5.9.2.jar \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/library-core/pom.xml b/core-java-modules/core-java-9-jigsaw/library-core/pom.xml new file mode 100644 index 0000000000..b860d89932 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/library-core/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + + com.baeldung + core-java-9-jigsaw + 0.2-SNAPSHOT + + + library-core + + + 19 + 19 + UTF-8 + + + + + org.junit.jupiter + junit-jupiter-api + 5.9.2 + test + + + org.junit.jupiter + junit-jupiter-engine + 5.9.2 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 9 + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M5 + + false + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/com/baeldung/library/core/Book.java b/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/com/baeldung/library/core/Book.java new file mode 100644 index 0000000000..782de8fa10 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/com/baeldung/library/core/Book.java @@ -0,0 +1,52 @@ +package com.baeldung.library.core; + +import java.util.Objects; + +public class Book { + + private String title; + private String author; + + public Book(String title, String author) { + this.title = title; + this.author = author; + } + + public String getTitle() { + return title; + } + + public String getAuthor() { + return author; + } + + + @Override + public String toString() { + return "Book [title=" + title + ", author=" + author + "]"; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + final Book book = (Book) o; + + if (!Objects.equals(title, book.title)) { + return false; + } + return Objects.equals(author, book.author); + } + + @Override + public int hashCode() { + int result = title != null ? title.hashCode() : 0; + result = 31 * result + (author != null ? author.hashCode() : 0); + return result; + } +} diff --git a/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/com/baeldung/library/core/Library.java b/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/com/baeldung/library/core/Library.java new file mode 100644 index 0000000000..ee2225810d --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/com/baeldung/library/core/Library.java @@ -0,0 +1,25 @@ +package com.baeldung.library.core; + +import java.util.ArrayList; +import java.util.List; + +public class Library { + + private List books = new ArrayList<>(); + + public void addBook(Book book) { + books.add(book); + } + + public List getBooks() { + return books; + } + + void removeBook(Book book) { + books.remove(book); + } + + protected void removeBookByAuthor(String author) { + books.removeIf(book -> book.getAuthor().equals(author)); + } +} diff --git a/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/com/baeldung/library/core/Main.java b/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/com/baeldung/library/core/Main.java new file mode 100644 index 0000000000..18839602c2 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/com/baeldung/library/core/Main.java @@ -0,0 +1,16 @@ +package com.baeldung.library.core; + +public class Main { + + public static void main(String[] args) { + Library library = new Library(); + library.addBook(new Book("The Lord of the Rings", "J.R.R. Tolkien")); + library.addBook(new Book("The Hobbit", "J.R.R. Tolkien")); + library.addBook(new Book("The Silmarillion", "J.R.R. Tolkien")); + library.addBook(new Book("The Chronicles of Narnia", "C.S. Lewis")); + library.addBook(new Book("The Lion, the Witch and the Wardrobe", "C.S. Lewis")); + System.out.println("Welcome to our library!"); + System.out.println("We have the following books:"); + library.getBooks().forEach(System.out::println); + } +} diff --git a/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/module-info.java b/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/module-info.java new file mode 100644 index 0000000000..bdf88d8bc9 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/module-info.java @@ -0,0 +1,3 @@ +module com.baeldung.library.core { + exports com.baeldung.library.core; +} \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/library-core/src/test/java/com/baeldung/library/core/LibraryUnitTest.java b/core-java-modules/core-java-9-jigsaw/library-core/src/test/java/com/baeldung/library/core/LibraryUnitTest.java new file mode 100644 index 0000000000..20a4889e8c --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/library-core/src/test/java/com/baeldung/library/core/LibraryUnitTest.java @@ -0,0 +1,47 @@ +package com.baeldung.library.core; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class LibraryUnitTest { + + @Test + void givenEmptyLibrary_whenAddABook_thenLibraryHasOneBook() { + Library library = new Library(); + Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien"); + library.addBook(theLordOfTheRings); + int expected = 1; + int actual = library.getBooks().size(); + assertEquals(expected, actual); + } + + @Test + void givenTheLibraryWithABook_whenRemoveABook_thenLibraryIsEmpty() { + Library library = new Library(); + Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien"); + library.addBook(theLordOfTheRings); + library.removeBook(theLordOfTheRings); + int expected = 0; + int actual = library.getBooks().size(); + assertEquals(expected, actual); + } + + @Test + void givenTheLibraryWithSeveralBook_whenRemoveABookByAuthor_thenLibraryHasNoBooksByTheAuthor() { + Library library = new Library(); + Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien"); + Book theHobbit = new Book("The Hobbit", "J.R.R. Tolkien"); + Book theSilmarillion = new Book("The Silmarillion", "J.R.R. Tolkien"); + Book theHungerGames = new Book("The Hunger Games", "Suzanne Collins"); + library.addBook(theLordOfTheRings); + library.addBook(theHobbit); + library.addBook(theSilmarillion); + library.addBook(theHungerGames); + library.removeBookByAuthor("J.R.R. Tolkien"); + int expected = 1; + int actual = library.getBooks().size(); + assertEquals(expected, actual); + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/library-test/src/test/java/com/baeldung/library/test/LibraryUnitTest.java b/core-java-modules/core-java-9-jigsaw/library-test/src/test/java/com/baeldung/library/test/LibraryUnitTest.java new file mode 100644 index 0000000000..31eae89bba --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/library-test/src/test/java/com/baeldung/library/test/LibraryUnitTest.java @@ -0,0 +1,53 @@ +package com.baeldung.library.test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.baeldung.library.core.Book; +import com.baeldung.library.core.Library; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import org.junit.jupiter.api.Test; + +class LibraryUnitTest { + + @Test + void givenEmptyLibrary_whenAddABook_thenLibraryHasOneBook() { + Library library = new Library(); + Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien"); + library.addBook(theLordOfTheRings); + int expected = 1; + int actual = library.getBooks().size(); + assertEquals(expected, actual); + } + + @Test + void givenTheLibraryWithABook_whenRemoveABook_thenLibraryIsEmpty() + throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Library library = new Library(); + Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien"); + library.addBook(theLordOfTheRings); + Method removeBook = Library.class.getDeclaredMethod("removeBook", Book.class); + removeBook.setAccessible(true); + removeBook.invoke(library, theLordOfTheRings); + int expected = 0; + int actual = library.getBooks().size(); + assertEquals(expected, actual); + } +@Test +void givenTheLibraryWithSeveralBook_whenRemoveABookByAuthor_thenLibraryHasNoBooksByTheAuthor() { + TestLibrary library = new TestLibrary(); + Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien"); + Book theHobbit = new Book("The Hobbit", "J.R.R. Tolkien"); + Book theSilmarillion = new Book("The Silmarillion", "J.R.R. Tolkien"); + Book theHungerGames = new Book("The Hunger Games", "Suzanne Collins"); + library.addBook(theLordOfTheRings); + library.addBook(theHobbit); + library.addBook(theSilmarillion); + library.addBook(theHungerGames); + library.removeBookByAuthor("J.R.R. Tolkien"); + int expected = 1; + int actual = library.getBooks().size(); + assertEquals(expected, actual); +} + +} \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/library-test/src/test/java/com/baeldung/library/test/TestLibrary.java b/core-java-modules/core-java-9-jigsaw/library-test/src/test/java/com/baeldung/library/test/TestLibrary.java new file mode 100644 index 0000000000..8ee3b0e3fe --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/library-test/src/test/java/com/baeldung/library/test/TestLibrary.java @@ -0,0 +1,10 @@ +package com.baeldung.library.test; + +import com.baeldung.library.core.Library; + +public class TestLibrary extends Library { + @Override + public void removeBookByAuthor(final String author) { + super.removeBookByAuthor(author); + } +} diff --git a/core-java-modules/core-java-9-jigsaw/library-test/src/test/java/module-info.java b/core-java-modules/core-java-9-jigsaw/library-test/src/test/java/module-info.java new file mode 100644 index 0000000000..8d60b574f2 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/library-test/src/test/java/module-info.java @@ -0,0 +1,5 @@ +module com.baeldung.library.test { + requires com.baeldung.library.core; + requires org.junit.jupiter.api; + opens com.baeldung.library.test to org.junit.platform.commons; +} \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/pom.xml b/core-java-modules/core-java-9-jigsaw/pom.xml index 70a2882234..288254b9cf 100644 --- a/core-java-modules/core-java-9-jigsaw/pom.xml +++ b/core-java-modules/core-java-9-jigsaw/pom.xml @@ -5,6 +5,10 @@ 4.0.0 core-java-9-jigsaw core-java-9-jigsaw + pom + + library-core + com.baeldung diff --git a/core-java-modules/core-java-9-jigsaw/run-library-core-module-with-patch.sh b/core-java-modules/core-java-9-jigsaw/run-library-core-module-with-patch.sh new file mode 100644 index 0000000000..70772a3589 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/run-library-core-module-with-patch.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +java --module-path mods:libs \ +--add-modules com.baeldung.library.core \ +--add-opens com.baeldung.library.core/com.baeldung.library.core=org.junit.platform.commons \ +--add-reads com.baeldung.library.core=org.junit.jupiter.api \ +--patch-module com.baeldung.library.core=outDir/library-test \ +--module org.junit.platform.console --select-class com.baeldung.library.core.LibraryUnitTest \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/run-library-core-module.sh b/core-java-modules/core-java-9-jigsaw/run-library-core-module.sh new file mode 100644 index 0000000000..f2bb976512 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/run-library-core-module.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +java --module-path mods --module com.baeldung.library.core/com.baeldung.library.core.Main \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/run-library-test-class-path.sh b/core-java-modules/core-java-9-jigsaw/run-library-test-class-path.sh new file mode 100644 index 0000000000..73e3d504bf --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/run-library-test-class-path.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +java --module-path libs \ +org.junit.platform.console.ConsoleLauncher \ +--classpath ./outDir/library-core \ +--select-class com.baeldung.library.core.LibraryUnitTest \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/run-library-test-module-path.sh b/core-java-modules/core-java-9-jigsaw/run-library-test-module-path.sh new file mode 100644 index 0000000000..08d149dbd7 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/run-library-test-module-path.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +java --module-path mods:libs \ +--add-modules com.baeldung.library.test \ +--add-opens com.baeldung.library.core/com.baeldung.library.core=com.baeldung.library.test \ +org.junit.platform.console.ConsoleLauncher --select-class com.baeldung.library.test.LibraryUnitTest \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java index d308aac7eb..4ac562ef04 100644 --- a/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java +++ b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java @@ -1,84 +1,126 @@ package com.baeldung.map; -import com.google.common.collect.ImmutableMap; -import org.junit.jupiter.api.Test; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import java.util.AbstractMap; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import static org.junit.jupiter.api.Assertions.*; +import org.hamcrest.collection.IsMapContaining; +import org.junit.jupiter.api.Test; +import com.google.common.collect.ImmutableMap; -public class ImmutableMapUnitTest { +class ImmutableMapUnitTest { - @Test - public void whenCollectionsUnModifiableMapMethod_thenOriginalCollectionChangesReflectInUnmodifiableMap() { + @Test + void whenCollectionsUnModifiableMapMethod_thenOriginalCollectionChangesReflectInUnmodifiableMap() { - Map mutableMap = new HashMap<>(); - mutableMap.put("USA", "North America"); + Map mutableMap = new HashMap<>(); + mutableMap.put("USA", "North America"); - Map unmodifiableMap = Collections.unmodifiableMap(mutableMap); - assertThrows(UnsupportedOperationException.class, () -> unmodifiableMap.put("Canada", "North America")); - - mutableMap.remove("USA"); - assertFalse(unmodifiableMap.containsKey("USA")); - - mutableMap.put("Mexico", "North America"); - assertTrue(unmodifiableMap.containsKey("Mexico")); - } - - @Test - @SuppressWarnings("deprecation") - public void whenGuavaImmutableMapFromCopyOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { + Map unmodifiableMap = Collections.unmodifiableMap(mutableMap); + assertThrows(UnsupportedOperationException.class, () -> unmodifiableMap.put("Canada", "North America")); - Map mutableMap = new HashMap<>(); - mutableMap.put("USA", "North America"); + mutableMap.remove("USA"); + assertFalse(unmodifiableMap.containsKey("USA")); - ImmutableMap immutableMap = ImmutableMap.copyOf(mutableMap); - assertTrue(immutableMap.containsKey("USA")); - - assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); - - mutableMap.remove("USA"); - assertTrue(immutableMap.containsKey("USA")); - - mutableMap.put("Mexico", "North America"); - assertFalse(immutableMap.containsKey("Mexico")); - } - - @Test - @SuppressWarnings("deprecation") - public void whenGuavaImmutableMapFromBuilderMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { + mutableMap.put("Mexico", "North America"); + assertTrue(unmodifiableMap.containsKey("Mexico")); + } - Map mutableMap = new HashMap<>(); - mutableMap.put("USA", "North America"); + @Test + @SuppressWarnings("deprecation") + void whenGuavaImmutableMapFromCopyOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { - ImmutableMap immutableMap = ImmutableMap.builder() - .putAll(mutableMap) - .put("Costa Rica", "North America") - .build(); - assertTrue(immutableMap.containsKey("USA")); - assertTrue(immutableMap.containsKey("Costa Rica")); - - assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); - - mutableMap.remove("USA"); - assertTrue(immutableMap.containsKey("USA")); - - mutableMap.put("Mexico", "North America"); - assertFalse(immutableMap.containsKey("Mexico")); - } - - @Test - @SuppressWarnings("deprecation") - public void whenGuavaImmutableMapFromOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { + Map mutableMap = new HashMap<>(); + mutableMap.put("USA", "North America"); - ImmutableMap immutableMap = ImmutableMap.of("USA", "North America", "Costa Rica", "North America"); - assertTrue(immutableMap.containsKey("USA")); - assertTrue(immutableMap.containsKey("Costa Rica")); + ImmutableMap immutableMap = ImmutableMap.copyOf(mutableMap); + assertTrue(immutableMap.containsKey("USA")); + + assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); + + mutableMap.remove("USA"); + assertTrue(immutableMap.containsKey("USA")); + + mutableMap.put("Mexico", "North America"); + assertFalse(immutableMap.containsKey("Mexico")); + } + + @Test + @SuppressWarnings("deprecation") + void whenGuavaImmutableMapFromBuilderMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { + + Map mutableMap = new HashMap<>(); + mutableMap.put("USA", "North America"); + + ImmutableMap immutableMap = ImmutableMap.builder() + .putAll(mutableMap) + .put("Costa Rica", "North America") + .build(); + assertTrue(immutableMap.containsKey("USA")); + assertTrue(immutableMap.containsKey("Costa Rica")); + + assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); + + mutableMap.remove("USA"); + assertTrue(immutableMap.containsKey("USA")); + + mutableMap.put("Mexico", "North America"); + assertFalse(immutableMap.containsKey("Mexico")); + } + + @Test + @SuppressWarnings("deprecation") + void whenGuavaImmutableMapFromOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { + + ImmutableMap immutableMap = ImmutableMap.of("USA", "North America", "Costa Rica", "North America"); + assertTrue(immutableMap.containsKey("USA")); + assertTrue(immutableMap.containsKey("Costa Rica")); + + assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); + } + + @Test + @SuppressWarnings("deprecation") + void givenGuavaImmutableMapFromOfEntriesMethodwhenModifyEntry_thenThrowUnsupportedOperationException() { + + ImmutableMap immutableMap = ImmutableMap.ofEntries(new AbstractMap.SimpleEntry<>(1, "USA"), new AbstractMap.SimpleEntry<>(2, "Canada")); + + assertThrows(UnsupportedOperationException.class, () -> immutableMap.put(2, "Mexico")); + } + + @Test + void givenEntrieswhenCreatingGuavaImmutableMapFromOfEntriesMethod_thenCorrect() { + + ImmutableMap immutableMap = ImmutableMap.ofEntries(new AbstractMap.SimpleEntry<>(1, "USA")); + + assertEquals(1, immutableMap.size()); + assertThat(immutableMap, IsMapContaining.hasEntry(1, "USA")); + } + + @Test + void givenGuavaImmutableMapFromOfEntriesMethodwhenEntryKeyExists_thenThrowIllegalArgumentException() { + + assertThrows(IllegalArgumentException.class, () -> ImmutableMap.ofEntries(new AbstractMap.SimpleEntry<>(1, "USA"), new AbstractMap.SimpleEntry<>(1, "Canada"))); + } + + @Test + void givenGuavaImmutableMapFromOfEntriesMethodwhenEntryKeyIsNull_thenThrowNullPointerException() { + + assertThrows(NullPointerException.class, () -> ImmutableMap.ofEntries(new AbstractMap.SimpleEntry<>(null, "USA"))); + } + + @Test + void givenGuavaImmutableMapFromOfEntriesMethodwhenEntryValueIsNull_thenThrowNullPointerException() { + + assertThrows(NullPointerException.class, () -> ImmutableMap.ofEntries(new AbstractMap.SimpleEntry<>(1, null))); + } - assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); - } - } diff --git a/core-java-modules/core-java-compiler/README.md b/core-java-modules/core-java-compiler/README.md new file mode 100644 index 0000000000..2a1e609194 --- /dev/null +++ b/core-java-modules/core-java-compiler/README.md @@ -0,0 +1,6 @@ +## Core Java Compiler + +### Relevant Articles: + +- [Compiling Java *.class Files with javac](http://www.baeldung.com/javac) +- [Illegal Character Compilation Error](https://www.baeldung.com/java-illegal-character-error) diff --git a/core-java-modules/core-java-compiler/pom.xml b/core-java-modules/core-java-compiler/pom.xml new file mode 100644 index 0000000000..8f2be3f142 --- /dev/null +++ b/core-java-modules/core-java-compiler/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + core-java-compiler + 0.1.0-SNAPSHOT + core-java-compiler + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + com.google.gdata + core + ${gdata.version} + + + + + 1.47.1 + + + \ No newline at end of file diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/javac/Data.java b/core-java-modules/core-java-compiler/src/main/java/com/baeldung/javac/Data.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/javac/Data.java rename to core-java-modules/core-java-compiler/src/main/java/com/baeldung/javac/Data.java diff --git a/core-java-modules/core-java/src/main/java/javac-args/arguments b/core-java-modules/core-java-compiler/src/main/java/javac-args/arguments similarity index 100% rename from core-java-modules/core-java/src/main/java/javac-args/arguments rename to core-java-modules/core-java-compiler/src/main/java/javac-args/arguments diff --git a/core-java-modules/core-java/src/main/java/javac-args/options b/core-java-modules/core-java-compiler/src/main/java/javac-args/options similarity index 100% rename from core-java-modules/core-java/src/main/java/javac-args/options rename to core-java-modules/core-java-compiler/src/main/java/javac-args/options diff --git a/core-java-modules/core-java/src/main/java/javac-args/types b/core-java-modules/core-java-compiler/src/main/java/javac-args/types similarity index 100% rename from core-java-modules/core-java/src/main/java/javac-args/types rename to core-java-modules/core-java-compiler/src/main/java/javac-args/types diff --git a/core-java-modules/core-java/src/main/java/javac-args/xlint-ops b/core-java-modules/core-java-compiler/src/main/java/javac-args/xlint-ops similarity index 100% rename from core-java-modules/core-java/src/main/java/javac-args/xlint-ops rename to core-java-modules/core-java-compiler/src/main/java/javac-args/xlint-ops diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/illegalcharacter/IllegalCharacterUnitTest.java b/core-java-modules/core-java-compiler/src/test/java/com/baeldung/illegalcharacter/IllegalCharacterUnitTest.java similarity index 100% rename from core-java-modules/core-java/src/test/java/com/baeldung/illegalcharacter/IllegalCharacterUnitTest.java rename to core-java-modules/core-java-compiler/src/test/java/com/baeldung/illegalcharacter/IllegalCharacterUnitTest.java diff --git a/core-java-modules/core-java/src/test/resources/bom-file.txt b/core-java-modules/core-java-compiler/src/test/resources/bom-file.txt similarity index 100% rename from core-java-modules/core-java/src/test/resources/bom-file.txt rename to core-java-modules/core-java-compiler/src/test/resources/bom-file.txt diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/sandbox/SandboxJavaManualTest.java b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/sandbox/SandboxJavaManualTest.java similarity index 100% rename from core-java-modules/core-java/src/test/java/com/baeldung/sandbox/SandboxJavaManualTest.java rename to core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/sandbox/SandboxJavaManualTest.java diff --git a/core-java-modules/core-java-documentation/README.md b/core-java-modules/core-java-documentation/README.md new file mode 100644 index 0000000000..b66b9e8c05 --- /dev/null +++ b/core-java-modules/core-java-documentation/README.md @@ -0,0 +1,6 @@ +## Core Java Documentation + +### Relevant Articles: + +- [Introduction to Javadoc](http://www.baeldung.com/javadoc) + diff --git a/core-java-modules/core-java-documentation/pom.xml b/core-java-modules/core-java-documentation/pom.xml new file mode 100644 index 0000000000..be18af1b10 --- /dev/null +++ b/core-java-modules/core-java-documentation/pom.xml @@ -0,0 +1,41 @@ + + + 4.0.0 + core-java-documentation + 0.1.0-SNAPSHOT + core-java-documentation + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + + ${source.version} + ${target.version} + + + + + + + + 3.0.0-M1 + 1.8 + 1.8 + + + \ No newline at end of file diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/javadoc/CodeSnippetFormatting.java b/core-java-modules/core-java-documentation/src/main/java/com/baeldung/javadoc/CodeSnippetFormatting.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/javadoc/CodeSnippetFormatting.java rename to core-java-modules/core-java-documentation/src/main/java/com/baeldung/javadoc/CodeSnippetFormatting.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/javadoc/Person.java b/core-java-modules/core-java-documentation/src/main/java/com/baeldung/javadoc/Person.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/javadoc/Person.java rename to core-java-modules/core-java-documentation/src/main/java/com/baeldung/javadoc/Person.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/javadoc/SuperHero.java b/core-java-modules/core-java-documentation/src/main/java/com/baeldung/javadoc/SuperHero.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/javadoc/SuperHero.java rename to core-java-modules/core-java-documentation/src/main/java/com/baeldung/javadoc/SuperHero.java diff --git a/core-java-modules/core-java-io-apis-2/README.md b/core-java-modules/core-java-io-apis-2/README.md index f3d72fe8b5..bbaf7d9584 100644 --- a/core-java-modules/core-java-io-apis-2/README.md +++ b/core-java-modules/core-java-io-apis-2/README.md @@ -5,3 +5,5 @@ This module contains articles about core Java input/output(IO) APIs. ### Relevant Articles: - [Constructing a Relative Path From Two Absolute Paths in Java](https://www.baeldung.com/java-relative-path-absolute) - [Java Scanner Taking a Character Input](https://www.baeldung.com/java-scanner-character-input) +- [Get the Desktop Path in Java](https://www.baeldung.com/java-desktop-path) + diff --git a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/scanner/NextLineVsNextIntUnitTest.java b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/scanner/NextLineVsNextIntUnitTest.java new file mode 100644 index 0000000000..8fab7c62e9 --- /dev/null +++ b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/scanner/NextLineVsNextIntUnitTest.java @@ -0,0 +1,85 @@ +package com.baeldung.scanner; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.util.InputMismatchException; +import java.util.Scanner; + +import org.junit.jupiter.api.Test; + +public class NextLineVsNextIntUnitTest { + + @Test + void whenInputLineIsNumber_thenNextLineAndNextIntBothWork() { + String input = "42\n"; + + //nextLine() + Scanner sc1 = new Scanner(input); + int num1 = Integer.parseInt(sc1.nextLine()); + assertEquals(42, num1); + + //nextInt() + Scanner sc2 = new Scanner(input); + int num2 = sc2.nextInt(); + assertEquals(42, num2); + + } + + @Test + void whenInputIsNotValidNumber_thenNextLineAndNextIntThrowDifferentException() { + String input = "Nan\n"; + + //nextLine() -> NumberFormatException + Scanner sc1 = new Scanner(input); + assertThrows(NumberFormatException.class, () -> Integer.parseInt(sc1.nextLine())); + + //nextInt() -> InputMismatchException + Scanner sc2 = new Scanner(input); + assertThrows(InputMismatchException.class, sc2::nextInt); + } + + @Test + void whenUsingNextInt_thenTheNextTokenAfterItFailsToParseIsNotConsumed() { + String input = "42 is a magic number\n"; + + //nextInt() to read '42' + Scanner sc2 = new Scanner(input); + int num2 = sc2.nextInt(); + assertEquals(42, num2); + + // call nextInt() again on "is" + assertThrows(InputMismatchException.class, sc2::nextInt); + + String theNextToken = sc2.next(); + assertEquals("is", theNextToken); + + theNextToken = sc2.next(); + assertEquals("a", theNextToken); + } + + @Test + void whenReadingTwoInputLines_thenNextLineAndNextIntBehaveDifferently() { + + String input = new StringBuilder().append("42\n") + .append("It is a magic number.\n") + .toString(); + + //nextLine() + Scanner sc1 = new Scanner(input); + int num1 = Integer.parseInt(sc1.nextLine()); + String nextLineText1 = sc1.nextLine(); + assertEquals(42, num1); + assertEquals("It is a magic number.", nextLineText1); + + //nextInt() + Scanner sc2 = new Scanner(input); + int num2 = sc2.nextInt(); + assertEquals(42, num2); + + // nextInt() leaves the newline character (\n) behind + String nextLineText2 = sc2.nextLine(); + assertEquals("", nextLineText2); + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-jpms/pom.xml b/core-java-modules/core-java-jpms/pom.xml index 62aa49f299..3cfa0e3f45 100644 --- a/core-java-modules/core-java-jpms/pom.xml +++ b/core-java-modules/core-java-jpms/pom.xml @@ -4,7 +4,6 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 core-java-jpms - 0.0.1-SNAPSHOT core-java-jpms pom @@ -15,8 +14,8 @@ - decoupling-pattern1 - decoupling-pattern2 + service-provider-factory-pattern + service-loader-api-pattern diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/pom.xml b/core-java-modules/core-java-jpms/service-loader-api-pattern/consumermodule2/pom.xml similarity index 92% rename from core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/pom.xml rename to core-java-modules/core-java-jpms/service-loader-api-pattern/consumermodule2/pom.xml index 13d0b2d201..f928912ffd 100644 --- a/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/pom.xml +++ b/core-java-modules/core-java-jpms/service-loader-api-pattern/consumermodule2/pom.xml @@ -8,8 +8,8 @@ 1.0 - com.baeldung.decoupling-pattern2 - decoupling-pattern2 + com.baeldung.service-loader-api-pattern + service-loader-api-pattern 1.0-SNAPSHOT diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/src/main/java/com/baeldung/consumermodule/Application.java b/core-java-modules/core-java-jpms/service-loader-api-pattern/consumermodule2/src/main/java/com/baeldung/consumermodule/Application.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/src/main/java/com/baeldung/consumermodule/Application.java rename to core-java-modules/core-java-jpms/service-loader-api-pattern/consumermodule2/src/main/java/com/baeldung/consumermodule/Application.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/src/main/java/module-info.java b/core-java-modules/core-java-jpms/service-loader-api-pattern/consumermodule2/src/main/java/module-info.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/src/main/java/module-info.java rename to core-java-modules/core-java-jpms/service-loader-api-pattern/consumermodule2/src/main/java/module-info.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/pom.xml b/core-java-modules/core-java-jpms/service-loader-api-pattern/pom.xml similarity index 92% rename from core-java-modules/core-java-jpms/decoupling-pattern2/pom.xml rename to core-java-modules/core-java-jpms/service-loader-api-pattern/pom.xml index 5b2e4cfc82..13a443eab5 100644 --- a/core-java-modules/core-java-jpms/decoupling-pattern2/pom.xml +++ b/core-java-modules/core-java-jpms/service-loader-api-pattern/pom.xml @@ -3,8 +3,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung.decoupling-pattern2 - decoupling-pattern2 + com.baeldung.service-loader-api-pattern + service-loader-api-pattern 1.0-SNAPSHOT pom diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/providermodule/pom.xml b/core-java-modules/core-java-jpms/service-loader-api-pattern/providermodule/pom.xml similarity index 91% rename from core-java-modules/core-java-jpms/decoupling-pattern2/providermodule/pom.xml rename to core-java-modules/core-java-jpms/service-loader-api-pattern/providermodule/pom.xml index ddb8aeccd1..bcee01f631 100644 --- a/core-java-modules/core-java-jpms/decoupling-pattern2/providermodule/pom.xml +++ b/core-java-modules/core-java-jpms/service-loader-api-pattern/providermodule/pom.xml @@ -8,8 +8,8 @@ 1.0 - com.baeldung.decoupling-pattern2 - decoupling-pattern2 + com.baeldung.service-loader-api-pattern + service-loader-api-pattern 1.0-SNAPSHOT diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/providermodule/src/main/java/com/baeldung/providermodule/LowercaseTextService.java b/core-java-modules/core-java-jpms/service-loader-api-pattern/providermodule/src/main/java/com/baeldung/providermodule/LowercaseTextService.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern2/providermodule/src/main/java/com/baeldung/providermodule/LowercaseTextService.java rename to core-java-modules/core-java-jpms/service-loader-api-pattern/providermodule/src/main/java/com/baeldung/providermodule/LowercaseTextService.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/providermodule/src/main/java/module-info.java b/core-java-modules/core-java-jpms/service-loader-api-pattern/providermodule/src/main/java/module-info.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern2/providermodule/src/main/java/module-info.java rename to core-java-modules/core-java-jpms/service-loader-api-pattern/providermodule/src/main/java/module-info.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule2/pom.xml b/core-java-modules/core-java-jpms/service-loader-api-pattern/servicemodule2/pom.xml similarity index 88% rename from core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule2/pom.xml rename to core-java-modules/core-java-jpms/service-loader-api-pattern/servicemodule2/pom.xml index 06ef900092..f40745541b 100644 --- a/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule2/pom.xml +++ b/core-java-modules/core-java-jpms/service-loader-api-pattern/servicemodule2/pom.xml @@ -8,8 +8,8 @@ 1.0 - com.baeldung.decoupling-pattern2 - decoupling-pattern2 + com.baeldung.service-loader-api-pattern + service-loader-api-pattern 1.0-SNAPSHOT diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule2/src/main/java/com/baeldung/servicemodule/TextService.java b/core-java-modules/core-java-jpms/service-loader-api-pattern/servicemodule2/src/main/java/com/baeldung/servicemodule/TextService.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule2/src/main/java/com/baeldung/servicemodule/TextService.java rename to core-java-modules/core-java-jpms/service-loader-api-pattern/servicemodule2/src/main/java/com/baeldung/servicemodule/TextService.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule2/src/main/java/module-info.java b/core-java-modules/core-java-jpms/service-loader-api-pattern/servicemodule2/src/main/java/module-info.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule2/src/main/java/module-info.java rename to core-java-modules/core-java-jpms/service-loader-api-pattern/servicemodule2/src/main/java/module-info.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule1/pom.xml b/core-java-modules/core-java-jpms/service-provider-factory-pattern/consumermodule1/pom.xml similarity index 89% rename from core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule1/pom.xml rename to core-java-modules/core-java-jpms/service-provider-factory-pattern/consumermodule1/pom.xml index f82e72b85d..ba92733f34 100644 --- a/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule1/pom.xml +++ b/core-java-modules/core-java-jpms/service-provider-factory-pattern/consumermodule1/pom.xml @@ -8,8 +8,8 @@ jar - com.baeldung.decoupling-pattern1 - decoupling-pattern1 + com.baeldung.service-provider-factory-pattern + service-provider-factory-pattern 1.0-SNAPSHOT diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule1/src/main/java/com/baeldung/consumermodule/Application.java b/core-java-modules/core-java-jpms/service-provider-factory-pattern/consumermodule1/src/main/java/com/baeldung/consumermodule/Application.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule1/src/main/java/com/baeldung/consumermodule/Application.java rename to core-java-modules/core-java-jpms/service-provider-factory-pattern/consumermodule1/src/main/java/com/baeldung/consumermodule/Application.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule1/src/main/java/module-info.java b/core-java-modules/core-java-jpms/service-provider-factory-pattern/consumermodule1/src/main/java/module-info.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule1/src/main/java/module-info.java rename to core-java-modules/core-java-jpms/service-provider-factory-pattern/consumermodule1/src/main/java/module-info.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/pom.xml b/core-java-modules/core-java-jpms/service-provider-factory-pattern/pom.xml similarity index 91% rename from core-java-modules/core-java-jpms/decoupling-pattern1/pom.xml rename to core-java-modules/core-java-jpms/service-provider-factory-pattern/pom.xml index 2121b46b82..35a9912312 100644 --- a/core-java-modules/core-java-jpms/decoupling-pattern1/pom.xml +++ b/core-java-modules/core-java-jpms/service-provider-factory-pattern/pom.xml @@ -3,8 +3,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung.decoupling-pattern1 - decoupling-pattern1 + com.baeldung.service-provider-factory-pattern + service-provider-factory-pattern 1.0-SNAPSHOT pom diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/pom.xml b/core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/pom.xml similarity index 86% rename from core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/pom.xml rename to core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/pom.xml index fc4b5854f9..d6e50ee9ff 100644 --- a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/pom.xml +++ b/core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/pom.xml @@ -9,8 +9,8 @@ jar - com.baeldung.decoupling-pattern1 - decoupling-pattern1 + com.baeldung.service-provider-factory-pattern + service-provider-factory-pattern 1.0-SNAPSHOT diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextService.java b/core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextService.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextService.java rename to core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextService.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextServiceFactory.java b/core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextServiceFactory.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextServiceFactory.java rename to core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextServiceFactory.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/LowercaseTextService.java b/core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/LowercaseTextService.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/LowercaseTextService.java rename to core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/LowercaseTextService.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/UppercaseTextService.java b/core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/UppercaseTextService.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/UppercaseTextService.java rename to core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/UppercaseTextService.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/module-info.java b/core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/src/main/java/module-info.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/module-info.java rename to core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/src/main/java/module-info.java diff --git a/core-java-modules/core-java-lambdas/README.md b/core-java-modules/core-java-lambdas/README.md index 56b2a79e7e..cad2097673 100644 --- a/core-java-modules/core-java-lambdas/README.md +++ b/core-java-modules/core-java-lambdas/README.md @@ -10,4 +10,3 @@ - [Serialize a Lambda in Java](https://www.baeldung.com/java-serialize-lambda) - [Convert Anonymous Class into Lambda in Java](https://www.baeldung.com/java-from-anonymous-class-to-lambda) - [When to Use Callable and Supplier in Java](https://www.baeldung.com/java-callable-vs-supplier) -- [Lambda Expression vs. Anonymous Inner Class](https://www.baeldung.com/java-lambdas-vs-anonymous-class) diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/rawtypes/RawTypesUnitTest.java b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/rawtypes/RawTypesUnitTest.java similarity index 100% rename from core-java-modules/core-java/src/test/java/com/baeldung/rawtypes/RawTypesUnitTest.java rename to core-java-modules/core-java-lang-5/src/test/java/com/baeldung/rawtypes/RawTypesUnitTest.java diff --git a/core-java-modules/core-java-lang-math-3/README.md b/core-java-modules/core-java-lang-math-3/README.md index 89adc23100..847bd314a7 100644 --- a/core-java-modules/core-java-lang-math-3/README.md +++ b/core-java-modules/core-java-lang-math-3/README.md @@ -10,4 +10,5 @@ - [Create a BMI Calculator in Java](https://www.baeldung.com/java-body-mass-index-calculator) - [Java Program to Calculate the Standard Deviation](https://www.baeldung.com/java-calculate-standard-deviation) - [Java Program to Print Pascal’s Triangle](https://www.baeldung.com/java-pascal-triangle) +- [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency) - More articles: [[<-- Prev]](/core-java-modules/core-java-lang-math-2) diff --git a/core-java-modules/core-java-lang-math-3/pom.xml b/core-java-modules/core-java-lang-math-3/pom.xml index 9cd3673df3..7860f57735 100644 --- a/core-java-modules/core-java-lang-math-3/pom.xml +++ b/core-java-modules/core-java-lang-math-3/pom.xml @@ -23,11 +23,17 @@ javaluator ${javaluator.version} + + org.javamoney + moneta + ${javamoney.moneta.version} + 0.4.8 3.0.3 + 1.1 \ No newline at end of file diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/money/JavaMoney.java b/core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/money/JavaMoney.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/money/JavaMoney.java rename to core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/money/JavaMoney.java diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/money/JavaMoneyUnitManualTest.java b/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/money/JavaMoneyUnitManualTest.java similarity index 100% rename from core-java-modules/core-java/src/test/java/com/baeldung/money/JavaMoneyUnitManualTest.java rename to core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/money/JavaMoneyUnitManualTest.java diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/Car.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/Car.java new file mode 100644 index 0000000000..a72d7dd0f1 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/Car.java @@ -0,0 +1,98 @@ +package com.baeldung.methods; + +public class Car { + + private final String make; + private final String model; + private final int year; + private final String color; + private final boolean automatic; + private final int numDoors; + private final String features; + + private Car(CarBuilder carBuilder) { + this.make = carBuilder.make; + this.model = carBuilder.model; + this.year = carBuilder.year; + this.color = carBuilder.color; + this.automatic = carBuilder.automatic; + this.numDoors = carBuilder.numDoors; + this.features = carBuilder.features; + } + + public String getMake() { + return make; + } + + public String getModel() { + return model; + } + + public int getYear() { + return year; + } + + public String getColor() { + return color; + } + + public boolean isAutomatic() { + return automatic; + } + + public int getNumDoors() { + return numDoors; + } + + public String getFeatures() { + return features; + } + + public static class CarBuilder { + + private final String make; + private final String model; + private final int year; + + private String color = "unknown"; + private boolean automatic = false; + private int numDoors = 4; + private String features = ""; + + public CarBuilder(String make, String model, int year) { + this.make = make; + this.model = model; + this.year = year; + } + + public CarBuilder color(String color) { + this.color = color; + return this; + } + + public CarBuilder automatic(boolean automatic) { + this.automatic = automatic; + return this; + } + + public CarBuilder numDoors(int numDoors) { + this.numDoors = numDoors; + return this; + } + + public CarBuilder features(String features) { + this.features = features; + return this; + } + + public Car build() { + return new Car(this); + } + } + + @Override + public String toString() { + return "Car [make=" + make + ", model=" + model + ", year=" + year + ", color=" + color + ", automatic=" + automatic + ", numDoors=" + numDoors + ", features=" + features + "]"; + } + +} diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/Motorcycle.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/Motorcycle.java new file mode 100644 index 0000000000..8a1fce4a5d --- /dev/null +++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/Motorcycle.java @@ -0,0 +1,52 @@ +package com.baeldung.methods; + +import java.io.Serializable; + +public class Motorcycle extends Vehicle implements Serializable { + + private static final long serialVersionUID = 5973661295933599929L; + + private int year; + private String features = ""; + + public Motorcycle() { + super(); + } + + public Motorcycle(String make, String model, String color, int weight, boolean statusNew, int year) { + super(make, model, color, weight, statusNew); + this.year = year; + } + + public Motorcycle(Vehicle vehicle, int year) { + super(vehicle); + this.year = year; + } + + public int getYear() { + return year; + } + + public void setYear(int year) { + this.year = year; + } + + public void setFeatures(String features) { + this.features = features; + } + + public String getFeatures() { + return features; + } + + public void addMotorcycleFeatures(String... features) { + StringBuilder str = new StringBuilder(this.getFeatures()); + for (String feature : features) { + if (!str.toString().isEmpty()) + str.append(", "); + str.append(feature); + } + this.setFeatures(str.toString()); + } + +} diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/Vehicle.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/Vehicle.java new file mode 100644 index 0000000000..0c6964d255 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/Vehicle.java @@ -0,0 +1,33 @@ +package com.baeldung.methods; + +public class Vehicle { + + static String defaultValue = "DEFAULT"; + private String make = defaultValue; + private String model = defaultValue; + private String color = defaultValue; + private int weight = 0; + private boolean statusNew = true; + + public Vehicle() { + super(); + } + + public Vehicle(String make, String model, String color, int weight, boolean statusNew) { + this.make = make; + this.model = model; + this.color = color; + this.weight = weight; + this.statusNew = statusNew; + } + + public Vehicle(Vehicle vehicle) { + this(vehicle.make, vehicle.model, vehicle.color, vehicle.weight, vehicle.statusNew); + } + + @Override + public String toString() { + return "Vehicle [make=" + make + ", model=" + model + ", color=" + color + ", weight=" + weight + ", statusNew=" + statusNew + "]"; + } + +} diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/VehicleProcessor.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/VehicleProcessor.java new file mode 100644 index 0000000000..a7d5975813 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/VehicleProcessor.java @@ -0,0 +1,20 @@ +package com.baeldung.methods; + +public class VehicleProcessor { + + Vehicle processVehicle(String make, String model, String color, int weight, boolean status) { + return new Vehicle(make, model, color, weight, status); + } + + Vehicle processVehicle(Vehicle vehicle) { + return new Vehicle(vehicle); + } + + Car processCar(Car car) { + return new Car.CarBuilder(car.getMake(), car.getModel(), car.getYear()).color(car.getColor()) + .automatic(car.isAutomatic()) + .features(car.getFeatures()) + .build(); + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methods/VehicleProcessorUnitTest.java b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methods/VehicleProcessorUnitTest.java new file mode 100644 index 0000000000..928fbcb426 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methods/VehicleProcessorUnitTest.java @@ -0,0 +1,58 @@ +package com.baeldung.methods; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +class VehicleProcessorUnitTest { + + VehicleProcessor vehicleProcessor = new VehicleProcessor(); + Vehicle vehicle = new Vehicle("Ford", "Focus", "red", 2200, true); + + @Test + void givenAllArguments_whenMethodCall_thenVerifyCallIsDoneCorrectly() { + Vehicle veh = vehicleProcessor.processVehicle("Ford", "Focus", "red", 2200, true); + assertThat(veh.toString()).hasToString(vehicle.toString()); + } + + @Test + void givenParameterObject_whenMethodCall_thenVerifyCallIsDoneCorrectly() { + Vehicle veh = vehicleProcessor.processVehicle(vehicle); + assertThat(veh.toString()).hasToString(vehicle.toString()); + } + + @Test + void givenJavaBeanPattern_whenMethodCall_thenVerifyCallIsDoneCorrectly() { + Motorcycle motorcycle = new Motorcycle("Ducati", "Monster", "yellow", 235, true, 2023); + motorcycle.setFeatures("GPS"); + + vehicleProcessor.processVehicle(motorcycle); + assertThat(motorcycle.getFeatures()).isEqualToIgnoringCase("GPS"); + } + + @Test + void givenJavaVarargs_whenMethodCall_thenAssertTheReturnedConcatenatedString() { + Motorcycle motorcycle = new Motorcycle("Ducati", "Monster", "red", 350, true, 2023); + motorcycle.addMotorcycleFeatures("abs"); + assertThat(motorcycle.getFeatures()).isEqualToIgnoringCase("abs"); + + motorcycle.addMotorcycleFeatures("navi", "charger"); + assertThat(motorcycle.getFeatures()).isEqualToIgnoringCase("abs, navi, charger"); + + motorcycle.addMotorcycleFeatures("wifi", "phone", "satellite"); + assertThat(motorcycle.getFeatures()).isEqualToIgnoringCase("abs, navi, charger, wifi, phone, satellite"); + } + + @Test + void givenJavaBuilderPattern_whenMethodCall_thenVerifyCallIsDoneCorrectly() { + Car car = new Car.CarBuilder("Ford", "Focus", 2023).color("blue") + .automatic(true) + .features("abs, navi, charger, wifi, phone, satellite") + .build(); + + Car result = vehicleProcessor.processCar(car); + + assertThat(result.toString()).hasToString(car.toString()); + } + +} diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/staticclass/Pizza.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticclass/Pizza.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/staticclass/Pizza.java rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticclass/Pizza.java diff --git a/core-java-modules/core-java-networking-2/pom.xml b/core-java-modules/core-java-networking-2/pom.xml index 982f4fa346..34f16a9938 100644 --- a/core-java-modules/core-java-networking-2/pom.xml +++ b/core-java-modules/core-java-networking-2/pom.xml @@ -15,9 +15,9 @@ - org.apache.httpcomponents - httpclient - ${httpclient.version} + commons-codec + commons-codec + ${commons-codec.version} org.apache.commons @@ -52,11 +52,11 @@ - 4.5.9 2.0.1 2.4.5 2.3.3 2.0.0-alpha-3 + 1.15 \ No newline at end of file diff --git a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java index 779f8aa898..f9d747a133 100644 --- a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java +++ b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java @@ -21,7 +21,7 @@ public class HttpClient { this.password = password; } - public int sendRquestWithAuthHeader(String url) throws IOException { + public int sendRequestWithAuthHeader(String url) throws IOException { HttpURLConnection connection = null; try { connection = createConnection(url); @@ -34,7 +34,7 @@ public class HttpClient { } } - public int sendRquestWithAuthenticator(String url) throws IOException { + public int sendRequestWithAuthenticator(String url) throws IOException { setAuthenticator(); HttpURLConnection connection = null; diff --git a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/url/auth/HttpClientLiveTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/url/auth/HttpClientLiveTest.java index 01d580bc65..387b228953 100644 --- a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/url/auth/HttpClientLiveTest.java +++ b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/url/auth/HttpClientLiveTest.java @@ -7,28 +7,28 @@ import org.junit.Test; public class HttpClientLiveTest { @Test - public void sendRquestWithAuthHeader() throws Exception { + public void sendRequestWithAuthHeader() throws Exception { HttpClient httpClient = new HttpClient("user1", "pass1"); - int status = httpClient.sendRquestWithAuthHeader("https://httpbin.org/basic-auth/user1/pass1"); + int status = httpClient.sendRequestWithAuthHeader("https://httpbin.org/basic-auth/user1/pass1"); assertTrue(isSuccess(status)); } @Test - public void sendRquestWithAuthHeader_whenIncorrectCredentials_thenNotSuccessful() throws Exception { + public void sendRequestWithAuthHeader_whenIncorrectCredentials_thenNotSuccessful() throws Exception { HttpClient httpClient = new HttpClient("John", "Smith"); - int status = httpClient.sendRquestWithAuthHeader("https://httpbin.org/basic-auth/user1/pass1"); + int status = httpClient.sendRequestWithAuthHeader("https://httpbin.org/basic-auth/user1/pass1"); assertTrue(isUnauthorized(status)); } @Test - public void sendRquestWithAuthenticator() throws Exception { + public void sendRequestWithAuthenticator() throws Exception { HttpClient httpClient = new HttpClient("user2", "pass2"); - int status = httpClient.sendRquestWithAuthenticator("https://httpbin.org/basic-auth/user2/pass2"); + int status = httpClient.sendRequestWithAuthenticator("https://httpbin.org/basic-auth/user2/pass2"); assertTrue(isSuccess(status)); } @@ -37,7 +37,7 @@ public class HttpClientLiveTest { public void sendRquestWithAuthenticator_whenIncorrectCredentials_thenNotSuccessful() throws Exception { HttpClient httpClient = new HttpClient("John", "Smith"); - int status = httpClient.sendRquestWithAuthenticator("https://httpbin.org/basic-auth/user2/pass2"); + int status = httpClient.sendRequestWithAuthenticator("https://httpbin.org/basic-auth/user2/pass2"); assertTrue(isUnauthorized(status)); } diff --git a/core-java-modules/core-java-networking-4/pom.xml b/core-java-modules/core-java-networking-4/pom.xml index 5fca4a1cab..cbe6356d0f 100644 --- a/core-java-modules/core-java-networking-4/pom.xml +++ b/core-java-modules/core-java-networking-4/pom.xml @@ -24,6 +24,30 @@ jsoup ${jsoup.version} + + + org.apache.httpcomponents + httpclient + 4.5.2 + + + + javax.ws.rs + javax.ws.rs-api + 2.1.1 + + + org.glassfish.jersey.core + jersey-common + 2.22.2 + test + + + + org.springframework + spring-web + 6.0.6 + diff --git a/core-java-modules/core-java-networking-4/src/test/java/com/baeldung/urlquerymanipulation/UrlQueryManipulationUnitTest.java b/core-java-modules/core-java-networking-4/src/test/java/com/baeldung/urlquerymanipulation/UrlQueryManipulationUnitTest.java new file mode 100644 index 0000000000..cc53a3e3a8 --- /dev/null +++ b/core-java-modules/core-java-networking-4/src/test/java/com/baeldung/urlquerymanipulation/UrlQueryManipulationUnitTest.java @@ -0,0 +1,53 @@ +package com.baeldung.urlquerymanipulation; + +import static junit.framework.TestCase.assertEquals; + +import java.net.URI; +import java.net.URISyntaxException; + +import javax.ws.rs.core.UriBuilder; + +import org.apache.http.client.utils.URIBuilder; + +import org.junit.Test; +import org.springframework.web.util.UriComponentsBuilder; + +public class UrlQueryManipulationUnitTest { + + @Test + public void whenUsingApacheUriBuilder_thenParametersAreCorrectlyAdded() throws URISyntaxException { + String url = "baeldung.com"; + String key = "article"; + String value = "alpha"; + URI uri = new URIBuilder(url).addParameter(key, value) + .build(); + + assertEquals("baeldung.com?article=alpha", uri.toString()); + } + + @Test + public void whenUsingJavaUriBuilder_thenParametersAreCorrectlyAdded() { + String url = "baeldung.com"; + String key = "article"; + String value = "beta"; + URI uri = UriBuilder.fromUri(url) + .queryParam(key, value) + .build(); + + assertEquals("baeldung.com?article=beta", uri.toString()); + } + + @Test + public void whenUsingSpringUriComponentsBuilder_thenParametersAreCorrectlyAdded() { + String url = "baeldung.com"; + String key = "article"; + String value = "charlie"; + URI uri = UriComponentsBuilder.fromUriString(url) + .queryParam(key, value) + .build() + .toUri(); + + assertEquals("baeldung.com?article=charlie", uri.toString()); + } + +} diff --git a/core-java-modules/core-java-networking/pom.xml b/core-java-modules/core-java-networking/pom.xml index 19c620198d..59aadbd1ed 100644 --- a/core-java-modules/core-java-networking/pom.xml +++ b/core-java-modules/core-java-networking/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 core-java-networking core-java-networking @@ -19,6 +19,11 @@ spring-web ${springframework.spring-web.version} + + org.apache.httpcomponents + httpclient + ${apache.httpclient.version} + @@ -27,6 +32,7 @@ 4.3.4.RELEASE + 4.5.14 \ No newline at end of file diff --git a/core-java-modules/core-java-networking/src/test/java/com/baeldung/networking/url/UrlUnitTest.java b/core-java-modules/core-java-networking/src/test/java/com/baeldung/networking/url/UrlUnitTest.java index 112f2cf53f..87d9d7a620 100644 --- a/core-java-modules/core-java-networking/src/test/java/com/baeldung/networking/url/UrlUnitTest.java +++ b/core-java-modules/core-java-networking/src/test/java/com/baeldung/networking/url/UrlUnitTest.java @@ -1,11 +1,19 @@ package com.baeldung.networking.url; +import static java.util.stream.Collectors.toList; import static org.junit.Assert.assertEquals; import java.net.MalformedURLException; +import java.net.URISyntaxException; import java.net.URL; +import java.util.Map; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.message.BasicNameValuePair; import org.junit.Test; +import org.springframework.web.util.UriComponentsBuilder; + +import com.google.common.collect.ImmutableMap; public class UrlUnitTest { @@ -101,4 +109,44 @@ public class UrlUnitTest { assertEquals("http://baeldung.com:9000/guidelines.txt", url.toString()); } -} + @Test + public void givenUrlParameters_whenBuildUrlWithURIBuilder_thenSuccess() throws URISyntaxException, MalformedURLException { + URIBuilder uriBuilder = new URIBuilder("http://baeldung.com/articles"); + uriBuilder.setPort(9090); + uriBuilder.addParameter("topic", "java"); + uriBuilder.addParameter("version", "8"); + URL url = uriBuilder.build().toURL(); + assertEquals("http://baeldung.com:9090/articles?topic=java&version=8", url.toString()); + } + + @Test + public void givenUrlParametersInMap_whenBuildUrlWithURIBuilder_thenSuccess() throws URISyntaxException, MalformedURLException { + Map paramMap = ImmutableMap.of("topic", "java", "version", "8"); + URIBuilder uriBuilder = new URIBuilder("http://baeldung.com/articles"); + uriBuilder.setPort(9090); + uriBuilder.addParameters(paramMap.entrySet() + .stream() + .map(entry -> new BasicNameValuePair(entry.getKey(), entry.getValue())) + .collect(toList())); + + URL url = uriBuilder.build().toURL(); + assertEquals("http://baeldung.com:9090/articles?topic=java&version=8", url.toString()); + } + + @Test + public void givenUrlParameters_whenBuildUrlWithSpringUriComponentsBuilder_thenSuccess() throws MalformedURLException { + URL url = UriComponentsBuilder.newInstance() + .scheme("http") + .host("baeldung.com") + .port(9090) + .path("articles") + .queryParam("topic", "java") + .queryParam("version", "8") + .build() + .toUri() + .toURL(); + + assertEquals("http://baeldung.com:9090/articles?topic=java&version=8", url.toString()); + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-nio-2/README.md b/core-java-modules/core-java-nio-2/README.md index 308356cf8b..527600779a 100644 --- a/core-java-modules/core-java-nio-2/README.md +++ b/core-java-modules/core-java-nio-2/README.md @@ -14,5 +14,4 @@ This module contains articles about core Java non-blocking input and output (IO) - [What Is the Difference Between NIO and NIO.2?](https://www.baeldung.com/java-nio-vs-nio-2) - [Guide to ByteBuffer](https://www.baeldung.com/java-bytebuffer) - [Find Files that Match Wildcard Strings in Java](https://www.baeldung.com/java-files-match-wildcard-strings) -- [Get the Desktop Path in Java](https://www.baeldung.com/java-desktop-path) - [[<-- Prev]](/core-java-modules/core-java-nio) diff --git a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/selector/EchoServer.java b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/selector/EchoServer.java index 9e9edcd0ba..c8b638dc04 100644 --- a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/selector/EchoServer.java +++ b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/selector/EchoServer.java @@ -45,8 +45,9 @@ public class EchoServer { private static void answerWithEcho(ByteBuffer buffer, SelectionKey key) throws IOException { SocketChannel client = (SocketChannel) key.channel(); - client.read(buffer); - if (new String(buffer.array()).trim().equals(POISON_PILL)) { + int r = client.read(buffer); + if (r == -1 || new String(buffer.array()).trim() + .equals(POISON_PILL)) { client.close(); System.out.println("Not accepting client messages anymore"); } else { diff --git a/core-java-modules/core-java-numbers-6/README.md b/core-java-modules/core-java-numbers-6/README.md index 2c0b0554c4..97e4e2ca28 100644 --- a/core-java-modules/core-java-numbers-6/README.md +++ b/core-java-modules/core-java-numbers-6/README.md @@ -1,2 +1,4 @@ ### Relevant Articles: - [Java Program to Calculate Pi](https://www.baeldung.com/java-monte-carlo-compute-pi) +- [Convert Integer to Hexadecimal in Java](https://www.baeldung.com/java-convert-int-to-hex) +- More articles: [[<-- prev]](../core-java-numbers-5) diff --git a/core-java-modules/core-java-numbers-6/pom.xml b/core-java-modules/core-java-numbers-6/pom.xml index 0f78f41b9f..531f1293d1 100644 --- a/core-java-modules/core-java-numbers-6/pom.xml +++ b/core-java-modules/core-java-numbers-6/pom.xml @@ -12,6 +12,21 @@ 0.0.1-SNAPSHOT + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + commons-codec + commons-codec + ${commons-codec} + test + + + core-java-numbers-6 @@ -22,4 +37,7 @@ + + 1.15 + \ No newline at end of file diff --git a/core-java-modules/core-java-numbers-6/src/main/java/com/baeldung/integertohex/IntegerToHex.java b/core-java-modules/core-java-numbers-6/src/main/java/com/baeldung/integertohex/IntegerToHex.java new file mode 100644 index 0000000000..9f75b9a145 --- /dev/null +++ b/core-java-modules/core-java-numbers-6/src/main/java/com/baeldung/integertohex/IntegerToHex.java @@ -0,0 +1,16 @@ +package com.baeldung.integertohex; + +class IntegerToHex { + static final String digits = "0123456789ABCDEF"; + static String integerToHex(int input) { + if (input <= 0) + return "0"; + StringBuilder hex = new StringBuilder(); + while (input > 0) { + int digit = input % 16; + hex.insert(0, digits.charAt(digit)); + input = input / 16; + } + return hex.toString(); + } +} diff --git a/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/integertohex/IntegerToHexUnitTest.java b/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/integertohex/IntegerToHexUnitTest.java new file mode 100644 index 0000000000..6073c2d347 --- /dev/null +++ b/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/integertohex/IntegerToHexUnitTest.java @@ -0,0 +1,75 @@ +package com.baeldung.integertohex; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.apache.commons.codec.binary.Hex; +import org.junit.jupiter.api.Test; + +class IntegerToHexUnitTest { + + @Test + void givenIntegerValue_whenUseRawMethod_thenWillGetHexValue() { + String result = IntegerToHex.integerToHex(1055); + assertEquals("41F", result); + } + + @Test + void givenIntegerNegativeValue_whenUseRawMethod_thenZeroValue() { + String result = IntegerToHex.integerToHex(-1055); + assertEquals("0", result); + } + + @Test + void givenIntegerPositiveValue_whenUseStringFormat_thenWillGetHexValue() { + String result = String.format("%02x", 255); + assertEquals("ff", result); + } + + @Test + void givenIntegerPositiveValue_whenUseStringFormat_thenWillGetHexValueWithLeftZeros() { + String result = String.format("%04x", 255); + assertEquals("00ff", result); + } + + @Test + void givenIntegerPositiveValue_whenUseStringFormat_thenWillGetHexValueWithLeftZerosAndUpperLetter() { + String result = String.format("%04X", 255); + assertEquals("00FF", result); + } + + @Test + void givenIntegerValue_whenUseIntegerToHexString_thenWillGetHexValue() { + String result = Integer.toHexString(1000); + assertEquals("3e8", result); + } + + @Test + void givenIntegerValue_whenUseLongToHexString_thenWillGetHexValue() { + String result = Long.toHexString(255L); + assertEquals("ff", result); + } + + @Test + public void givenNegativeIntegerValue_whenUseIntegerToString_thenWillGetHexValue() { + String result = Integer.toString(-1458, 16); + assertEquals("-5b2", result); + } + + @Test + public void givenIntegerValue_whenUseIntegerToString_thenWillGetHexValue() { + String result = Integer.toString(1458, 16); + assertEquals("5b2", result); + } + + @Test + public void givenLongValue_whenUseLongToString_thenWillGetHexValue() { + String result = Long.toString(158, 16); + assertEquals("9e", result); + } + + @Test + public void givenIntegerValue_whenUseApacheCommons_thenWillGetHexSignedValue() { + String result = Hex.encodeHexString(new byte[] { (byte) 254 }); + assertEquals("fe", result); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-perf-2/README.md b/core-java-modules/core-java-perf-2/README.md new file mode 100644 index 0000000000..5616cce48b --- /dev/null +++ b/core-java-modules/core-java-perf-2/README.md @@ -0,0 +1 @@ +## Relevant Articles diff --git a/core-java-modules/core-java-perf-2/pom.xml b/core-java-modules/core-java-perf-2/pom.xml new file mode 100644 index 0000000000..a9408ca385 --- /dev/null +++ b/core-java-modules/core-java-perf-2/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + core-java-perf-2 + core-java-perf-2 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + \ No newline at end of file diff --git a/core-java-modules/core-java-perf-2/src/main/java/com/baeldung/highcpu/Application.java b/core-java-modules/core-java-perf-2/src/main/java/com/baeldung/highcpu/Application.java new file mode 100644 index 0000000000..82162406b3 --- /dev/null +++ b/core-java-modules/core-java-perf-2/src/main/java/com/baeldung/highcpu/Application.java @@ -0,0 +1,20 @@ +package com.baeldung.highcpu; + +import java.util.LinkedList; +import java.util.List; +import java.util.function.IntUnaryOperator; +import java.util.stream.IntStream; + +public class Application { + + static List generateList() { + return IntStream.range(0, 10000000).parallel().map(IntUnaryOperator.identity()).collect(LinkedList::new, List::add, List::addAll); + } + + public static void main(String[] args) { + List list = generateList(); + long start = System.nanoTime(); + int value = list.get(9500000); + System.out.printf("Found value %d in %d nanos\n", value, (System.nanoTime() - start)); + } +} diff --git a/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/AbstractPlayerMBean.java b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/AbstractPlayerMBean.java new file mode 100644 index 0000000000..698d107c51 --- /dev/null +++ b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/AbstractPlayerMBean.java @@ -0,0 +1,16 @@ +package com.baeldung.jmxterm; + +import java.util.UUID; + +public abstract class AbstractPlayerMBean implements PlayerMBean{ + + private final UUID id; + + protected AbstractPlayerMBean() { + this.id = UUID.randomUUID(); + } + + String getId() { + return getName() + id.toString(); + } +} diff --git a/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/BroadcastingGuessGame.java b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/BroadcastingGuessGame.java new file mode 100644 index 0000000000..921d87c4d7 --- /dev/null +++ b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/BroadcastingGuessGame.java @@ -0,0 +1,42 @@ +package com.baeldung.jmxterm; + +import javax.management.ListenerNotFoundException; +import javax.management.MBeanNotificationInfo; +import javax.management.Notification; +import javax.management.NotificationBroadcaster; +import javax.management.NotificationBroadcasterSupport; +import javax.management.NotificationFilter; +import javax.management.NotificationListener; + +public abstract class BroadcastingGuessGame implements NotificationBroadcaster, GuessGameMBean { + private final NotificationBroadcasterSupport broadcaster = + new NotificationBroadcasterSupport(); + + private long notificationSequence = 0; + + private final MBeanNotificationInfo[] notificationInfo; + + protected BroadcastingGuessGame() { + this.notificationInfo = new MBeanNotificationInfo[]{ + new MBeanNotificationInfo(new String[]{"game"}, Notification.class.getName(), "Game notification") + }; + } + + protected void notifyAboutWinner(Player winner) { + String message = "Winner is " + winner.getName() + " with score " + winner.getScore(); + Notification notification = new Notification("game.winner", this, notificationSequence++, message); + broadcaster.sendNotification(notification); + } + + public void addNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback) { + broadcaster.addNotificationListener(listener, filter, handback); + } + + public void removeNotificationListener(NotificationListener listener) throws ListenerNotFoundException { + broadcaster.removeNotificationListener(listener); + } + + public MBeanNotificationInfo[] getNotificationInfo() { + return notificationInfo; + } +} diff --git a/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/GameRunner.java b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/GameRunner.java new file mode 100644 index 0000000000..3955d37504 --- /dev/null +++ b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/GameRunner.java @@ -0,0 +1,19 @@ +package com.baeldung.jmxterm; + +import java.util.Arrays; +import java.util.List; + +public class GameRunner { + + public static void main(String[] args) { + MBeanGameServer mBeanGameServer = new MBeanGameServer(); + Player bob = new Player("Bob"); + Player alice = new Player("Alice"); + Player john = new Player("John"); + List players = Arrays.asList(bob, alice, john); + GuessGame guessGame = new GuessGame(players); + mBeanGameServer.registerGame(guessGame); + guessGame.start(); + } + +} diff --git a/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/GuessGame.java b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/GuessGame.java new file mode 100644 index 0000000000..c9d680880f --- /dev/null +++ b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/GuessGame.java @@ -0,0 +1,80 @@ +package com.baeldung.jmxterm; + +import static com.baeldung.jmxterm.RandomNumbergenerator.generateRandomNumber; + +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class GuessGame extends BroadcastingGuessGame { + + + public static final int SECOND = 1000; + private static final Logger log = Logger.getLogger(GuessGame.class.getCanonicalName()); + private final List players; + private volatile boolean isFinished = false; + private volatile boolean isPaused = false; + + + public GuessGame(List players) { + this.players = players; + log.setLevel(Level.WARNING); + } + + public void start() { + int randomNumber = generateRandomNumber(); + while (!isFinished) { + waitASecond(); + while (!isPaused && !isFinished) { + log.info("Current random number is " + randomNumber); + waitASecond(); + for (Player player : players) { + int guess = player.guessNumber(); + if (guess == randomNumber) { + log.info("Players " + player.getName() + " " + guess + " is correct"); + player.incrementScore(); + notifyAboutWinner(player); + randomNumber = generateRandomNumber(); + break; + } + log.info("Player " + player.getName() + " guessed incorrectly with " + guess); + } + log.info("\n"); + } + if (isPaused) { + log.info("Game is paused"); + } + if (isFinished) { + log.info("Game is finished"); + } + } + } + + @Override + public void finishGame() { + isFinished = true; + } + + @Override + public void pauseGame() { + isPaused = true; + } + + @Override + public void unpauseGame() { + isPaused = false; + } + + public List getPlayers() { + return players; + } + + private void waitASecond() { + try { + Thread.sleep(SECOND); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + +} diff --git a/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/GuessGameMBean.java b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/GuessGameMBean.java new file mode 100644 index 0000000000..fdf8149f71 --- /dev/null +++ b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/GuessGameMBean.java @@ -0,0 +1,8 @@ +package com.baeldung.jmxterm; + +public interface GuessGameMBean { + + void finishGame(); + void pauseGame(); + void unpauseGame(); +} diff --git a/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/MBeanGameServer.java b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/MBeanGameServer.java new file mode 100644 index 0000000000..922a0baf76 --- /dev/null +++ b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/MBeanGameServer.java @@ -0,0 +1,37 @@ +package com.baeldung.jmxterm; + +import java.lang.management.ManagementFactory; +import javax.management.InstanceAlreadyExistsException; +import javax.management.MBeanRegistrationException; +import javax.management.MBeanServer; +import javax.management.MalformedObjectNameException; +import javax.management.NotCompliantMBeanException; +import javax.management.ObjectName; + +public class MBeanGameServer { + + public static final String ID_FORMAT = "com.baeldung.jmxterm:type=%s,id=%s"; + private final MBeanServer server = ManagementFactory.getPlatformMBeanServer(); + + public void registerPlayer(AbstractPlayerMBean player) { + registerBean(player, "player", player.getId()); + } + + public void registerGame(GuessGame guessGame) { + registerBean(guessGame, "game", "singlegame"); + guessGame.getPlayers().forEach(this::registerPlayer); + } + + private void registerBean(Object bean, String type, String id) { + try { + ObjectName name = new ObjectName(String.format(ID_FORMAT, type, id)); + server.registerMBean(bean, name); + } catch (InstanceAlreadyExistsException | + MBeanRegistrationException | + NotCompliantMBeanException | + MalformedObjectNameException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/Player.java b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/Player.java new file mode 100644 index 0000000000..b24e313902 --- /dev/null +++ b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/Player.java @@ -0,0 +1,33 @@ +package com.baeldung.jmxterm; + +import static com.baeldung.jmxterm.RandomNumbergenerator.*; + +public class Player extends AbstractPlayerMBean { + private final String name; + private int score = 0; + + public Player(String name) { + super(); + this.name = name; + } + + @Override + public int guessNumber() { + return generateRandomNumber(); + } + + public void incrementScore() { + score++; + } + + @Override + public int getScore() { + return score; + } + + @Override + public String getName() { + return name; + } + +} diff --git a/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/PlayerMBean.java b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/PlayerMBean.java new file mode 100644 index 0000000000..78b73ff578 --- /dev/null +++ b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/PlayerMBean.java @@ -0,0 +1,10 @@ +package com.baeldung.jmxterm; + +public interface PlayerMBean { + + int guessNumber(); + + int getScore(); + + String getName(); +} diff --git a/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/RandomNumbergenerator.java b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/RandomNumbergenerator.java new file mode 100644 index 0000000000..1418f502c6 --- /dev/null +++ b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxterm/RandomNumbergenerator.java @@ -0,0 +1,18 @@ +package com.baeldung.jmxterm; + +import java.util.concurrent.ThreadLocalRandom; + +public class RandomNumbergenerator { + + private static final int MIN = 0; + private static final int MAX = 10; + + private static final ThreadLocalRandom RANDOM = ThreadLocalRandom.current(); + + private RandomNumbergenerator() { + } + public static int generateRandomNumber() { + return RANDOM.nextInt(MIN, MAX + 1); + } + +} diff --git a/core-java-modules/core-java-perf/src/test/java/com/baeldung/jmxterm/PlayerUnitTest.java b/core-java-modules/core-java-perf/src/test/java/com/baeldung/jmxterm/PlayerUnitTest.java new file mode 100644 index 0000000000..a0f31b1995 --- /dev/null +++ b/core-java-modules/core-java-perf/src/test/java/com/baeldung/jmxterm/PlayerUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.jmxterm; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class PlayerUnitTest { + + @Test + void givenNewPlayer_thenScoreIsZero() { + Player player = new Player("John"); + assertEquals(0, player.getScore()); + } + + @Test + void givenNewPlayer_whenIncrementScore_thenScoreIsOne() { + Player player = new Player("John"); + player.incrementScore(); + assertEquals(1, player.getScore()); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-properties/README.md b/core-java-modules/core-java-properties/README.md new file mode 100644 index 0000000000..73991634df --- /dev/null +++ b/core-java-modules/core-java-properties/README.md @@ -0,0 +1,6 @@ +## Core Java Properties + +### Relevant Articles: + +- [Getting Started with Java Properties](http://www.baeldung.com/java-properties) +- [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties) diff --git a/core-java-modules/core-java-properties/pom.xml b/core-java-modules/core-java-properties/pom.xml new file mode 100644 index 0000000000..9beacabdd5 --- /dev/null +++ b/core-java-modules/core-java-properties/pom.xml @@ -0,0 +1,23 @@ + + + 4.0.0 + core-java-properties + 0.1.0-SNAPSHOT + core-java-properties + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/util/PropertiesLoader.java b/core-java-modules/core-java-properties/src/main/java/com/baeldung/util/PropertiesLoader.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/util/PropertiesLoader.java rename to core-java-modules/core-java-properties/src/main/java/com/baeldung/util/PropertiesLoader.java diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/java/properties/PropertiesUnitTest.java b/core-java-modules/core-java-properties/src/test/java/com/baeldung/java/properties/PropertiesUnitTest.java similarity index 100% rename from core-java-modules/core-java/src/test/java/com/baeldung/java/properties/PropertiesUnitTest.java rename to core-java-modules/core-java-properties/src/test/java/com/baeldung/java/properties/PropertiesUnitTest.java diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java b/core-java-modules/core-java-properties/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java similarity index 100% rename from core-java-modules/core-java/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java rename to core-java-modules/core-java-properties/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/util/PropertiesLoaderUnitTest.java b/core-java-modules/core-java-properties/src/test/java/com/baeldung/util/PropertiesLoaderUnitTest.java similarity index 100% rename from core-java-modules/core-java/src/test/java/com/baeldung/util/PropertiesLoaderUnitTest.java rename to core-java-modules/core-java-properties/src/test/java/com/baeldung/util/PropertiesLoaderUnitTest.java diff --git a/core-java-modules/core-java/src/test/resources/app.properties b/core-java-modules/core-java-properties/src/test/resources/app.properties similarity index 100% rename from core-java-modules/core-java/src/test/resources/app.properties rename to core-java-modules/core-java-properties/src/test/resources/app.properties diff --git a/core-java-modules/core-java/src/test/resources/catalog b/core-java-modules/core-java-properties/src/test/resources/catalog similarity index 100% rename from core-java-modules/core-java/src/test/resources/catalog rename to core-java-modules/core-java-properties/src/test/resources/catalog diff --git a/core-java-modules/core-java/src/test/resources/configuration.properties b/core-java-modules/core-java-properties/src/test/resources/configuration.properties similarity index 100% rename from core-java-modules/core-java/src/test/resources/configuration.properties rename to core-java-modules/core-java-properties/src/test/resources/configuration.properties diff --git a/core-java-modules/core-java/src/test/resources/default.properties b/core-java-modules/core-java-properties/src/test/resources/default.properties similarity index 100% rename from core-java-modules/core-java/src/test/resources/default.properties rename to core-java-modules/core-java-properties/src/test/resources/default.properties diff --git a/core-java-modules/core-java/src/test/resources/icons.xml b/core-java-modules/core-java-properties/src/test/resources/icons.xml similarity index 100% rename from core-java-modules/core-java/src/test/resources/icons.xml rename to core-java-modules/core-java-properties/src/test/resources/icons.xml diff --git a/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/regex/aftermatch/GetTextAfterTheRegexMatchUnitTest.java b/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/regex/aftermatch/GetTextAfterTheRegexMatchUnitTest.java new file mode 100644 index 0000000000..04650a0c02 --- /dev/null +++ b/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/regex/aftermatch/GetTextAfterTheRegexMatchUnitTest.java @@ -0,0 +1,83 @@ +package com.baeldung.regex.aftermatch; + +import org.junit.jupiter.api.Test; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class GetTextAfterTheRegexMatchUnitTest { + private static final String INPUT1 = "Some text, targetValue=Regex is cool"; + private static final String INPUT2 = "Some text. targetValue=Java is cool. some other text"; + + @Test + void whenUsingSplit_thenGetExpectedString() { + String result1 = INPUT1.split("targetValue=")[1]; + assertEquals("Regex is cool", result1); + + String afterFirstSplit = INPUT2.split("targetValue=")[1]; + assertEquals("Java is cool. some other text", afterFirstSplit); + String result2 = afterFirstSplit.split("[.]")[0]; + assertEquals("Java is cool", result2); + + // if use the dot as the regex for splitting, the result array is empty + String[] splitByDot = INPUT2.split("targetValue=")[1].split("."); + assertEquals(0, splitByDot.length); + } + + @Test + void whenUsingReplaceAll_thenGetExpectedString() { + String result1 = INPUT1.replaceAll(".*targetValue=", ""); + assertEquals("Regex is cool", result1); + + String afterFirstReplace = INPUT2.replaceAll(".*targetValue=", ""); + assertEquals("Java is cool. some other text", afterFirstReplace); + String result2 = afterFirstReplace.replaceAll("[.].*", ""); + assertEquals("Java is cool", result2); + + } + + @Test + void whenUsingRegexGrouping_thenGetExpectedString() { + Pattern p1 = Pattern.compile("targetValue=(.*)"); + Matcher m1 = p1.matcher(INPUT1); + assertTrue(m1.find()); + String result1 = m1.group(1); + assertEquals("Regex is cool", result1); + + Pattern p2 = Pattern.compile("targetValue=([^.]*)"); + Matcher m2 = p2.matcher(INPUT2); + assertTrue(m2.find()); + String result2 = m2.group(1); + assertEquals("Java is cool", result2); + + Pattern p3 = Pattern.compile("targetValue=(.*?)[.]"); + Matcher m3 = p3.matcher(INPUT2); + assertTrue(m3.find()); + String result3 = m3.group(1); + assertEquals("Java is cool", result3); + } + + @Test + void whenUsingLookaround_thenGetExpectedString() { + Pattern p1 = Pattern.compile("(?<=targetValue=).*"); + Matcher m1 = p1.matcher(INPUT1); + assertTrue(m1.find()); + String result1 = m1.group(); + assertEquals("Regex is cool", result1); + + Pattern p2 = Pattern.compile("(?<=targetValue=)[^.]*"); + Matcher m2 = p2.matcher(INPUT2); + assertTrue(m2.find()); + String result2 = m2.group(); + assertEquals("Java is cool", result2); + + Pattern p3 = Pattern.compile("(?<=targetValue=).*(?=[.])"); + Matcher m3 = p3.matcher(INPUT2); + assertTrue(m3.find()); + String result3 = m3.group(); + assertEquals("Java is cool", result3); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/java8/Java8MapAndFlatMap.java b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/flatmap/map/Java8MapAndFlatMapUnitTest.java similarity index 94% rename from core-java-modules/core-java/src/test/java/com/baeldung/java8/Java8MapAndFlatMap.java rename to core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/flatmap/map/Java8MapAndFlatMapUnitTest.java index a0bd1cf093..1b09ea25c6 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/java8/Java8MapAndFlatMap.java +++ b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/flatmap/map/Java8MapAndFlatMapUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java8; +package com.baeldung.streams.flatmap.map; import org.junit.Test; @@ -12,7 +12,7 @@ import java.util.stream.Stream; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; -public class Java8MapAndFlatMap { +public class Java8MapAndFlatMapUnitTest { @Test public void givenStream_whenCalledMap_thenProduceList() { diff --git a/core-java-modules/core-java-streams-4/README.md b/core-java-modules/core-java-streams-4/README.md index 4175fb1f70..c6717ec5fe 100644 --- a/core-java-modules/core-java-streams-4/README.md +++ b/core-java-modules/core-java-streams-4/README.md @@ -10,4 +10,3 @@ - [Understanding the Difference Between Stream.of() and IntStream.range()](https://www.baeldung.com/java-stream-of-and-intstream-range) - [Check if Object Is an Array in Java](https://www.baeldung.com/java-check-if-object-is-an-array) - [Mapping an Array of Integers to Strings Using Java Streams](https://www.baeldung.com/java-stream-integer-array-to-strings) -- [Difference Between parallelStream() and stream().parallel() in Java](https://www.baeldung.com/java-parallelstream-vs-stream-parallel) diff --git a/core-java-modules/core-java-streams-5/README.md b/core-java-modules/core-java-streams-5/README.md new file mode 100644 index 0000000000..4f367799f2 --- /dev/null +++ b/core-java-modules/core-java-streams-5/README.md @@ -0,0 +1 @@ +- [Difference Between parallelStream() and stream().parallel() in Java](https://www.baeldung.com/java-parallelstream-vs-stream-parallel) diff --git a/core-java-modules/core-java-streams-5/pom.xml b/core-java-modules/core-java-streams-5/pom.xml new file mode 100644 index 0000000000..d1f8af6461 --- /dev/null +++ b/core-java-modules/core-java-streams-5/pom.xml @@ -0,0 +1,72 @@ + + + 4.0.0 + core-java-streams-5 + core-java-streams-5 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + log4j + log4j + ${log4j.version} + + + org.junit + junit-bom + ${junit-jupiter.version} + pom + import + + + org.assertj + assertj-core + 3.23.1 + test + + + org.apache.commons + commons-lang3 + 3.12.0 + test + + + + + core-java-streams-4 + + + ../core-java-streams-4/src/main + true + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compiler.source} + ${maven.compiler.target} + -parameters + + + + + + + + 3.1 + 12 + 12 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/parallelstream/Book.java b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/parallelstream/Book.java similarity index 99% rename from core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/parallelstream/Book.java rename to core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/parallelstream/Book.java index 165df55166..d52a31aac9 100644 --- a/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/parallelstream/Book.java +++ b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/parallelstream/Book.java @@ -34,4 +34,4 @@ public class Book { public void setYearPublished(int yearPublished) { this.yearPublished = yearPublished; } -} +} \ No newline at end of file diff --git a/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/parallelstream/BookSpliterator.java b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/parallelstream/BookSpliterator.java similarity index 99% rename from core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/parallelstream/BookSpliterator.java rename to core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/parallelstream/BookSpliterator.java index 14e87e0b07..7460e1372b 100644 --- a/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/parallelstream/BookSpliterator.java +++ b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/parallelstream/BookSpliterator.java @@ -37,4 +37,4 @@ public class BookSpliterator implements Spliterator { public int characteristics() { return CONCURRENT; } -} +} \ No newline at end of file diff --git a/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/parallelstream/MyBookContainer.java b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/parallelstream/MyBookContainer.java similarity index 99% rename from core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/parallelstream/MyBookContainer.java rename to core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/parallelstream/MyBookContainer.java index dc4b0e2623..d7e3adc5f1 100644 --- a/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/parallelstream/MyBookContainer.java +++ b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/parallelstream/MyBookContainer.java @@ -90,4 +90,4 @@ public class MyBookContainer implements Collection { public void clear() { } -} +} \ No newline at end of file diff --git a/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/parallelstream/ParallelStreamApplication.java b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/parallelstream/ParallelStreamApplication.java similarity index 99% rename from core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/parallelstream/ParallelStreamApplication.java rename to core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/parallelstream/ParallelStreamApplication.java index 9cdaf58bfb..4297bdd3ed 100644 --- a/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/parallelstream/ParallelStreamApplication.java +++ b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/parallelstream/ParallelStreamApplication.java @@ -38,4 +38,4 @@ public class ParallelStreamApplication { }); return countOfBooks.get(); } -} +} \ No newline at end of file diff --git a/core-java-modules/core-java-streams-4/src/test/java/parallelstream/ParallelStreamUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/parallelstream/ParallelStreamUnitTest.java similarity index 97% rename from core-java-modules/core-java-streams-4/src/test/java/parallelstream/ParallelStreamUnitTest.java rename to core-java-modules/core-java-streams-5/src/test/java/com/baeldung/parallelstream/ParallelStreamUnitTest.java index 5542a21020..af8172a10d 100644 --- a/core-java-modules/core-java-streams-4/src/test/java/parallelstream/ParallelStreamUnitTest.java +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/parallelstream/ParallelStreamUnitTest.java @@ -1,6 +1,5 @@ -package parallelstream; +package com.baeldung.parallelstream; -import java.util.ArrayList; import java.util.List; import org.junit.Assert; diff --git a/core-java-modules/core-java-string-algorithms-3/pom.xml b/core-java-modules/core-java-string-algorithms-3/pom.xml index 74a9486ec0..7d4adeba92 100644 --- a/core-java-modules/core-java-string-algorithms-3/pom.xml +++ b/core-java-modules/core-java-string-algorithms-3/pom.xml @@ -39,8 +39,8 @@ maven-compiler-plugin ${maven-compiler-plugin.version} - ${java.version} - ${java.version} + ${maven.compiler.source} + ${maven.compiler.target} -parameters diff --git a/core-java-modules/core-java-string-algorithms-3/src/main/java/com/baeldung/charfreq/CharacterWithHighestFrequency.java b/core-java-modules/core-java-string-algorithms-3/src/main/java/com/baeldung/charfreq/CharacterWithHighestFrequency.java new file mode 100644 index 0000000000..938ad1edf3 --- /dev/null +++ b/core-java-modules/core-java-string-algorithms-3/src/main/java/com/baeldung/charfreq/CharacterWithHighestFrequency.java @@ -0,0 +1,58 @@ +package com.baeldung.charfreq; + +import static java.util.Map.Entry.comparingByValue; +import static java.util.stream.Collectors.counting; +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.toSet; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class CharacterWithHighestFrequency { + public static Character byStream(String input) { + return input.chars() + .mapToObj(x -> (char) x) + .collect(groupingBy(x -> x, counting())) + .entrySet() + .stream() + .max(comparingByValue()) + .get() + .getKey(); + } + + public static Set byMap(String input) { + Map map = new HashMap<>(); + for (char c : input.toCharArray()) { + map.compute(c, (character, count) -> count == null ? 1 : ++count); + } + int maxCount = map.values() + .stream() + .mapToInt(Integer::intValue) + .max() + .getAsInt(); + + return map.keySet() + .stream() + .filter(c -> map.get(c) == maxCount) + .collect(toSet()); + } + + public static Set byBucket(String input) { + int[] buckets = new int[128]; + + int maxCount = 0; + for (char c : input.toCharArray()) { + buckets[c]++; + maxCount = Math.max(buckets[c], maxCount); + } + + int finalMaxCount = maxCount; + return IntStream.range(0, 128) + .filter(c -> buckets[c] == finalMaxCount) + .mapToObj(i -> (char) i) + .collect(Collectors.toSet()); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-string-algorithms-3/src/test/java/com/baeldung/charfreq/CharacterWithHighestFrequencyUnitTest.java b/core-java-modules/core-java-string-algorithms-3/src/test/java/com/baeldung/charfreq/CharacterWithHighestFrequencyUnitTest.java new file mode 100644 index 0000000000..978752f3d4 --- /dev/null +++ b/core-java-modules/core-java-string-algorithms-3/src/test/java/com/baeldung/charfreq/CharacterWithHighestFrequencyUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.charfreq; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Collections; +import java.util.Set; + +import org.junit.jupiter.api.Test; + +import com.google.common.collect.ImmutableSet; + +class CharacterWithHighestFrequencyUnitTest { + private static final String INPUT1 = "aaaaaaaaaa(10) bbbbbbb ccccc dddd eee ff"; + private static final Set EXPECTED1 = Collections.singleton('a'); + + private static final String INPUT2 = "YYYYYYY(7) bbbbb -------(7) dddd eee kkkkkkk(7) ff"; + private static final Set EXPECTED2 = ImmutableSet.of('Y', '-', 'k'); + + @Test + void whenGettingSingleCharWithHighestFrequencyByStream_shouldSuccess() { + char result1 = CharacterWithHighestFrequency.byStream(INPUT1); + assertEquals('a', result1); + } + + @Test + void whenGettingCharWithHighestFrequencyByMap_shouldSuccess() { + Set result1 = CharacterWithHighestFrequency.byMap(INPUT1); + assertEquals(EXPECTED1, result1); + + Set result2 = CharacterWithHighestFrequency.byMap(INPUT2); + assertEquals(EXPECTED2, result2); + + } + + @Test + void whenGettingCharWithHighestFrequencyByBucket_shouldSuccess() { + Set result1 = CharacterWithHighestFrequency.byBucket(INPUT1); + assertEquals(EXPECTED1, result1); + + Set result2 = CharacterWithHighestFrequency.byBucket(INPUT2); + assertEquals(EXPECTED2, result2); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-strings/README.md b/core-java-modules/core-java-strings/README.md index 835e9ec582..84cf31e8bd 100644 --- a/core-java-modules/core-java-strings/README.md +++ b/core-java-modules/core-java-strings/README.md @@ -13,3 +13,4 @@ This module contains articles about strings in Java. - [Java Multi-line String](https://www.baeldung.com/java-multiline-string) - [Guide to Java String Pool](https://www.baeldung.com/java-string-pool) - [Fixing “constant string too long” Build Error](https://www.baeldung.com/java-constant-string-too-long-error) +- [Reuse StringBuilder for Efficiency](https://www.baeldung.com/java-reuse-stringbuilder-for-efficiency) diff --git a/core-java-modules/core-java-uuid/README.md b/core-java-modules/core-java-uuid/README.md index 4438c9a770..bd7bd9d9da 100644 --- a/core-java-modules/core-java-uuid/README.md +++ b/core-java-modules/core-java-uuid/README.md @@ -5,3 +5,4 @@ - [Guide to UUID in Java](http://www.baeldung.com/java-uuid) - [Validate UUID String in Java](https://www.baeldung.com/java-validate-uuid-string) - [Generate the Same UUID From a String in Java](https://www.baeldung.com/java-generate-same-uuid-from-string) +- [Generating Time Based UUIDs](https://www.baeldung.com/java-generating-time-based-uuids) diff --git a/core-java-modules/core-java-uuid/pom.xml b/core-java-modules/core-java-uuid/pom.xml index b97db174b4..c0e93c1d32 100644 --- a/core-java-modules/core-java-uuid/pom.xml +++ b/core-java-modules/core-java-uuid/pom.xml @@ -24,6 +24,21 @@ log4j-over-slf4j ${org.slf4j.version} + + com.github.f4b6a3 + uuid-creator + 5.2.0 + + + com.fasterxml.uuid + java-uuid-generator + 4.1.0 + + + com.github.f4b6a3 + tsid-creator + 5.2.3 + @@ -142,4 +157,4 @@ 3.0.0-M1 - \ No newline at end of file + diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorBenchmark.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorBenchmark.java new file mode 100644 index 0000000000..20b2c127bd --- /dev/null +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorBenchmark.java @@ -0,0 +1,42 @@ +package com.baeldung.timebaseduuid; + +import com.fasterxml.uuid.Generators; + +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; + +public class JavaUUIDCreatorBenchmark { + +public static void main(String[] args) throws InterruptedException { + + int threadCount = 128; + int iterationCount = 100_000; + Map uuidMap = new ConcurrentHashMap<>(); + AtomicLong collisionCount = new AtomicLong(); + long startNanos = System.nanoTime(); + CountDownLatch endLatch = new CountDownLatch(threadCount); + + for (long i = 0; i < threadCount; i++) { + long threadId = i; + new Thread(() -> { + for (long j = 0; j < iterationCount; j++) { + UUID uuid = Generators.timeBasedGenerator().generate(); + Long existingUUID = uuidMap.put(uuid, (threadId * iterationCount) + j); + if(existingUUID != null) { + collisionCount.incrementAndGet(); + } + } + endLatch.countDown(); + }).start(); + } + + endLatch.await(); + System.out.println(threadCount * iterationCount + " UUIDs generated, " + collisionCount + " collisions in " + + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNanos) + "ms"); +} +} + diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorExample.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorExample.java new file mode 100644 index 0000000000..b59d7e236a --- /dev/null +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorExample.java @@ -0,0 +1,13 @@ +package com.baeldung.timebaseduuid; + +import com.fasterxml.uuid.Generators; + +public class JavaUUIDCreatorExample { + + public static void main(String[] args) { + System.out.println("UUID Version 1: " + Generators.timeBasedGenerator().generate()); + System.out.println("UUID Version 6: " + Generators.timeBasedReorderedGenerator().generate()); + System.out.println("UUID Version 7: " + Generators.timeBasedEpochGenerator().generate()); + + } +} diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java new file mode 100644 index 0000000000..d93cd73a25 --- /dev/null +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java @@ -0,0 +1,42 @@ +package com.baeldung.timebaseduuid; + +import com.github.f4b6a3.uuid.UuidCreator; + +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; + +public class UUIDCreatorBenchmark { + + public static void main(String[] args) throws InterruptedException { + + int threadCount = 128; + int iterationCount = 100_000; + Map uuidMap = new ConcurrentHashMap<>(); + AtomicLong collisionCount = new AtomicLong(); + long startNanos = System.nanoTime(); + CountDownLatch endLatch = new CountDownLatch(threadCount); + + for (long i = 0; i < threadCount; i++) { + long threadId = i; + new Thread(() -> { + for (long j = 0; j < iterationCount; j++) { + UUID uuid = UuidCreator.getTimeBased(); + Long existingUUID = uuidMap.put(uuid, (threadId * iterationCount) + j); + if(existingUUID != null) { + collisionCount.incrementAndGet(); + } + } + endLatch.countDown(); + }).start(); + } + + endLatch.await(); + System.out.println(threadCount * iterationCount + " UUIDs generated, " + collisionCount + " collisions in " + + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNanos) + "ms"); + } +} diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorExample.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorExample.java new file mode 100644 index 0000000000..fad2f55c93 --- /dev/null +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorExample.java @@ -0,0 +1,13 @@ +package com.baeldung.timebaseduuid; + +import com.github.f4b6a3.uuid.UuidCreator; + +public class UUIDCreatorExample { + + public static void main(String[] args) { + System.out.println("UUID Version 1: " + UuidCreator.getTimeBased()); + System.out.println("UUID Version 6: " + UuidCreator.getTimeOrdered()); + System.out.println("UUID Version 7: " + UuidCreator.getTimeOrderedEpoch()); + } +} + diff --git a/core-java-modules/core-java/.gitignore b/core-java-modules/core-java/.gitignore deleted file mode 100644 index 374c8bf907..0000000000 --- a/core-java-modules/core-java/.gitignore +++ /dev/null @@ -1,25 +0,0 @@ -*.class - -0.* - -#folders# -/target -/neoDb* -/data -/src/main/webapp/WEB-INF/classes -*/META-INF/* -.resourceCache - -# Packaged files # -*.jar -*.war -*.ear - -# Files generated by integration tests -backup-pom.xml -/bin/ -/temp - -#IntelliJ specific -.idea/ -*.iml \ No newline at end of file diff --git a/core-java-modules/core-java/README.md b/core-java-modules/core-java/README.md deleted file mode 100644 index f29d6abd7c..0000000000 --- a/core-java-modules/core-java/README.md +++ /dev/null @@ -1,10 +0,0 @@ -## Core Java Cookbooks and Examples - -### Relevant Articles: - -- [Getting Started with Java Properties](http://www.baeldung.com/java-properties) -- [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency) -- [Compiling Java *.class Files with javac](http://www.baeldung.com/javac) -- [Introduction to Javadoc](http://www.baeldung.com/javadoc) -- [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties) -- [Illegal Character Compilation Error](https://www.baeldung.com/java-illegal-character-error) diff --git a/core-java-modules/core-java/customers.xml b/core-java-modules/core-java/customers.xml deleted file mode 100644 index b52dc27633..0000000000 --- a/core-java-modules/core-java/customers.xml +++ /dev/null @@ -1,95 +0,0 @@ - - - - SELECT * FROM customers - 1008 - - true - 1000 - 0 - 2 - - - - - 0 - 0 - 0 - true - ResultSet.TYPE_SCROLL_INSENSITIVE - false - customers - jdbc:h2:mem:testdb - - com.sun.rowset.providers.RIOptimisticProvider - Oracle Corporation - 1.0 - 2 - 1 - - - - 2 - - 1 - false - true - false - 0 - true - true - 11 - ID - ID - PUBLIC - 10 - 0 - CUSTOMERS - TESTDB - 4 - INTEGER - - - 2 - false - true - false - 0 - true - true - 50 - NAME - NAME - PUBLIC - 50 - 0 - CUSTOMERS - TESTDB - 12 - VARCHAR - - - - - 1 - Customer1 - - - 2 - Customer2 - - - 3 - Customer3 - - - 4 - Customer4 - - - 5 - Customer5 - - - diff --git a/core-java-modules/core-java/externalizable.txt b/core-java-modules/core-java/externalizable.txt deleted file mode 100644 index ddd3e143a8..0000000000 Binary files a/core-java-modules/core-java/externalizable.txt and /dev/null differ diff --git a/core-java-modules/core-java/pom.xml b/core-java-modules/core-java/pom.xml deleted file mode 100644 index 552999702e..0000000000 --- a/core-java-modules/core-java/pom.xml +++ /dev/null @@ -1,198 +0,0 @@ - - - 4.0.0 - core-java - core-java - jar - - - com.baeldung.core-java-modules - core-java-modules - 0.0.1-SNAPSHOT - - - - - org.unix4j - unix4j-command - ${unix4j.version} - - - com.googlecode.grep4j - grep4j - ${grep4j.version} - - - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - - - - log4j - log4j - ${log4j.version} - - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - - - org.projectlombok - lombok - ${lombok.version} - provided - - - org.javamoney - moneta - ${javamoney.moneta.version} - - - org.springframework - spring-core - ${spring.core.version} - - - commons-io - commons-io - ${commons-io.version} - - - com.google.gdata - core - ${gdata.version} - - - - - core-java - - - src/main/resources - true - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${project.build.directory}/libs - - - - - - org.codehaus.mojo - exec-maven-plugin - - java - com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed - - -Xmx300m - -XX:+UseParallelGC - -classpath - - com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed - - - - - org.apache.maven.plugins - maven-javadoc-plugin - ${maven-javadoc-plugin.version} - - ${source.version} - ${target.version} - - - - - - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*ManualTest.java - - - **/*IntegrationTest.java - **/*IntTest.java - - - - - - - json - - - - - org.codehaus.mojo - exec-maven-plugin - - - run-benchmarks - - none - - exec - - - test - java - - -classpath - - org.openjdk.jmh.Main - .* - - - - - - - - - - - - - 0.4 - 1.8.7 - - 1.1 - 3.0.0-M1 - 1.8 - 1.8 - 4.3.20.RELEASE - 1.47.1 - - - \ No newline at end of file diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/.gitignore b/core-java-modules/core-java/src/main/java/com/baeldung/.gitignore deleted file mode 100644 index 83c05e60c8..0000000000 --- a/core-java-modules/core-java/src/main/java/com/baeldung/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -*.class - -#folders# -/target -/neoDb* -/data -/src/main/webapp/WEB-INF/classes -*/META-INF/* - -# Packaged files # -*.jar -*.war -*.ear \ No newline at end of file diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/executable/ExecutableMavenJar.java b/core-java-modules/core-java/src/main/java/com/baeldung/executable/ExecutableMavenJar.java deleted file mode 100644 index 6c79e89717..0000000000 --- a/core-java-modules/core-java/src/main/java/com/baeldung/executable/ExecutableMavenJar.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.executable; - -import javax.swing.JOptionPane; - -public class ExecutableMavenJar { - - public static void main(String[] args) { - JOptionPane.showMessageDialog(null, "It worked!", "Executable Jar with Maven", 1); - } - -} diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/filesystem/jndi/LookupFSJNDI.java b/core-java-modules/core-java/src/main/java/com/baeldung/filesystem/jndi/LookupFSJNDI.java deleted file mode 100644 index 7e6bb5d3b2..0000000000 --- a/core-java-modules/core-java/src/main/java/com/baeldung/filesystem/jndi/LookupFSJNDI.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.baeldung.filesystem.jndi; - -import java.io.File; -import java.util.Hashtable; - -import javax.naming.Context; -import javax.naming.InitialContext; -import javax.naming.NamingException; - -public class LookupFSJNDI { - private InitialContext ctx = null; - - public LookupFSJNDI() throws NamingException { - super(); - init(); - } - - private void init() throws NamingException { - Hashtable env = new Hashtable(); - - env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); - // URI to namespace (actual directory) - env.put(Context.PROVIDER_URL, "file:./src/test/resources"); - - ctx = new InitialContext(env); - } - - public InitialContext getCtx() { - return ctx; - } - - public File getFile(String fileName) { - File file; - try { - file = (File) getCtx().lookup(fileName); - } catch (NamingException e) { - file = null; - } - return file; - } - -} diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/jsonposturlconnection/PostJSONWithHttpURLConnection.java b/core-java-modules/core-java/src/main/java/com/baeldung/jsonposturlconnection/PostJSONWithHttpURLConnection.java deleted file mode 100644 index b2469ac984..0000000000 --- a/core-java-modules/core-java/src/main/java/com/baeldung/jsonposturlconnection/PostJSONWithHttpURLConnection.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.baeldung.jsonposturlconnection; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.net.HttpURLConnection; -import java.net.URL; - -public class PostJSONWithHttpURLConnection { - - public static void main (String []args) throws IOException{ - //Change the URL with any other publicly accessible POST resource, which accepts JSON request body - URL url = new URL ("https://reqres.in/api/users"); - - HttpURLConnection con = (HttpURLConnection)url.openConnection(); - con.setRequestMethod("POST"); - - con.setRequestProperty("Content-Type", "application/json; utf-8"); - con.setRequestProperty("Accept", "application/json"); - - con.setDoOutput(true); - - //JSON String need to be constructed for the specific resource. - //We may construct complex JSON using any third-party JSON libraries such as jackson or org.json - String jsonInputString = "{\"name\": \"Upendra\", \"job\": \"Programmer\"}"; - - try(OutputStream os = con.getOutputStream()){ - byte[] input = jsonInputString.getBytes("utf-8"); - os.write(input, 0, input.length); - } - - int code = con.getResponseCode(); - System.out.println(code); - - try(BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "utf-8"))){ - StringBuilder response = new StringBuilder(); - String responseLine = null; - while ((responseLine = br.readLine()) != null) { - response.append(responseLine.trim()); - } - System.out.println(response.toString()); - } - } - -} diff --git a/core-java-modules/core-java/src/main/java/log4j.properties b/core-java-modules/core-java/src/main/java/log4j.properties deleted file mode 100644 index 5fe42d854c..0000000000 --- a/core-java-modules/core-java/src/main/java/log4j.properties +++ /dev/null @@ -1,9 +0,0 @@ -# Set root logger level to DEBUG and its only appender to A1. -log4j.rootLogger=DEBUG, A1 - -# A1 is set to be a ConsoleAppender. -log4j.appender.A1=org.apache.log4j.ConsoleAppender - -# A1 uses PatternLayout. -log4j.appender.A1.layout=org.apache.log4j.PatternLayout -log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n diff --git a/core-java-modules/core-java/src/main/resources/META-INF/BenchmarkList b/core-java-modules/core-java/src/main/resources/META-INF/BenchmarkList deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/core-java-modules/core-java/src/main/resources/META-INF/MANIFEST.MF b/core-java-modules/core-java/src/main/resources/META-INF/MANIFEST.MF deleted file mode 100644 index 988de3193d..0000000000 --- a/core-java-modules/core-java/src/main/resources/META-INF/MANIFEST.MF +++ /dev/null @@ -1,5 +0,0 @@ -Agent-Class: com.baeldung.instrumentation.agent.MyInstrumentationAgent -Can-Redefine-Classes: true -Can-Retransform-Classes: true -Premain-Class: com.baeldung.instrumentation.agent.MyInstrumentationAgent -Main-Class: com.baeldung.instrumentation.application.Launcher diff --git a/core-java-modules/core-java/src/main/resources/META-INF/persistence.xml b/core-java-modules/core-java/src/main/resources/META-INF/persistence.xml deleted file mode 100644 index 3966afdcda..0000000000 --- a/core-java-modules/core-java/src/main/resources/META-INF/persistence.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/core-java-modules/core-java/src/main/resources/countries.properties b/core-java-modules/core-java/src/main/resources/countries.properties deleted file mode 100644 index 50b5e85653..0000000000 --- a/core-java-modules/core-java/src/main/resources/countries.properties +++ /dev/null @@ -1,3 +0,0 @@ -UK -US -Germany \ No newline at end of file diff --git a/core-java-modules/core-java/src/main/resources/datasource.properties b/core-java-modules/core-java/src/main/resources/datasource.properties deleted file mode 100644 index 61df0d45f7..0000000000 --- a/core-java-modules/core-java/src/main/resources/datasource.properties +++ /dev/null @@ -1,6 +0,0 @@ -dataSourceClassName=//TBD -dataSource.user=//TBD -dataSource.password=//TBD -dataSource.databaseName=//TBD -dataSource.portNumber=//TBD -dataSource.serverName=//TBD \ No newline at end of file diff --git a/core-java-modules/core-java/src/main/resources/log4j.properties b/core-java-modules/core-java/src/main/resources/log4j.properties deleted file mode 100644 index 621cf01735..0000000000 --- a/core-java-modules/core-java/src/main/resources/log4j.properties +++ /dev/null @@ -1,6 +0,0 @@ -log4j.rootLogger=DEBUG, A1 - -log4j.appender.A1=org.apache.log4j.ConsoleAppender - -log4j.appender.A1.layout=org.apache.log4j.PatternLayout -log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n \ No newline at end of file diff --git a/core-java-modules/core-java/src/main/resources/log4j2.xml b/core-java-modules/core-java/src/main/resources/log4j2.xml deleted file mode 100644 index a824bef9b0..0000000000 --- a/core-java-modules/core-java/src/main/resources/log4j2.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/core-java-modules/core-java/src/main/resources/log4jstructuraldp.properties b/core-java-modules/core-java/src/main/resources/log4jstructuraldp.properties deleted file mode 100644 index 5bc2bfe4b9..0000000000 --- a/core-java-modules/core-java/src/main/resources/log4jstructuraldp.properties +++ /dev/null @@ -1,9 +0,0 @@ - -# Root logger -log4j.rootLogger=INFO, file, stdout - -# Write to console -log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.Target=System.out -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n \ No newline at end of file diff --git a/core-java-modules/core-java/src/main/resources/logback.xml b/core-java-modules/core-java/src/main/resources/logback.xml deleted file mode 100644 index 56af2d397e..0000000000 --- a/core-java-modules/core-java/src/main/resources/logback.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - - - - - - - \ No newline at end of file diff --git a/core-java-modules/core-java/src/main/resources/product.png b/core-java-modules/core-java/src/main/resources/product.png deleted file mode 100644 index 4edd01c0a1..0000000000 Binary files a/core-java-modules/core-java/src/main/resources/product.png and /dev/null differ diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/arrays/ArraysJoinAndSplitJUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/arrays/ArraysJoinAndSplitJUnitTest.java deleted file mode 100644 index b31a829f34..0000000000 --- a/core-java-modules/core-java/src/test/java/com/baeldung/arrays/ArraysJoinAndSplitJUnitTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.arrays; - -import java.util.Arrays; - -import org.junit.Assert; -import org.junit.Test; - -public class ArraysJoinAndSplitJUnitTest { - - private final String[] sauces = { "Marinara", "Olive Oil" }; - private final String[] cheeses = { "Mozzarella", "Feta", "Parmesan" }; - private final String[] vegetables = { "Olives", "Spinach", "Green Peppers" }; - - private final String[] customers = { "Jay", "Harry", "Ronnie", "Gary", "Ross" }; - - @Test - public void givenThreeStringArrays_whenJoiningIntoOneStringArray_shouldSucceed() { - String[] toppings = new String[sauces.length + cheeses.length + vegetables.length]; - - System.arraycopy(sauces, 0, toppings, 0, sauces.length); - int AddedSoFar = sauces.length; - - System.arraycopy(cheeses, 0, toppings, AddedSoFar, cheeses.length); - AddedSoFar += cheeses.length; - - System.arraycopy(vegetables, 0, toppings, AddedSoFar, vegetables.length); - - Assert.assertArrayEquals(toppings, new String[] { "Marinara", "Olive Oil", "Mozzarella", "Feta", "Parmesan", "Olives", "Spinach", "Green Peppers" }); - } - - @Test - public void givenOneStringArray_whenSplittingInHalfTwoStringArrays_shouldSucceed() { - int ordersHalved = (customers.length / 2) + (customers.length % 2); - - String[] driverOne = Arrays.copyOf(customers, ordersHalved); - String[] driverTwo = Arrays.copyOfRange(customers, ordersHalved, customers.length); - - Assert.assertArrayEquals(driverOne, new String[] { "Jay", "Harry", "Ronnie" }); - Assert.assertArrayEquals(driverTwo, new String[] { "Gary", "Ross" }); - } -} diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/stringisnumeric.zip b/core-java-modules/core-java/src/test/java/com/baeldung/stringisnumeric.zip deleted file mode 100644 index b8a7b9b35a..0000000000 Binary files a/core-java-modules/core-java/src/test/java/com/baeldung/stringisnumeric.zip and /dev/null differ diff --git a/core-java-modules/core-java/src/test/resources/.gitignore b/core-java-modules/core-java/src/test/resources/.gitignore deleted file mode 100644 index 83c05e60c8..0000000000 --- a/core-java-modules/core-java/src/test/resources/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -*.class - -#folders# -/target -/neoDb* -/data -/src/main/webapp/WEB-INF/classes -*/META-INF/* - -# Packaged files # -*.jar -*.war -*.ear \ No newline at end of file diff --git a/core-java-modules/core-java/src/test/resources/newFile1.txt b/core-java-modules/core-java/src/test/resources/newFile1.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/core-java-modules/core-java/src/test/resources/newFile2.txt b/core-java-modules/core-java/src/test/resources/newFile2.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/core-java-modules/core-java/src/test/resources/newFile3.txt b/core-java-modules/core-java/src/test/resources/newFile3.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/core-java-modules/core-java/src/test/resources/original.txt b/core-java-modules/core-java/src/test/resources/original.txt deleted file mode 100644 index 8511f56bef..0000000000 --- a/core-java-modules/core-java/src/test/resources/original.txt +++ /dev/null @@ -1,2 +0,0 @@ -#Copy a File with Java (www.Baeldung.com) -Copying Files with Java is Fun! \ No newline at end of file diff --git a/core-java-modules/core-java/src/test/resources/sourceFile.txt b/core-java-modules/core-java/src/test/resources/sourceFile.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/core-java-modules/core-java/src/test/resources/test.find b/core-java-modules/core-java/src/test/resources/test.find deleted file mode 100644 index 0cb7d51df1..0000000000 --- a/core-java-modules/core-java/src/test/resources/test.find +++ /dev/null @@ -1 +0,0 @@ -Test of JNDI on file. \ No newline at end of file diff --git a/core-java-modules/core-java/src/test/resources/test_read.in b/core-java-modules/core-java/src/test/resources/test_read.in deleted file mode 100644 index 70c379b63f..0000000000 --- a/core-java-modules/core-java/src/test/resources/test_read.in +++ /dev/null @@ -1 +0,0 @@ -Hello world \ No newline at end of file diff --git a/core-java-modules/core-java/src/test/resources/test_read1.in b/core-java-modules/core-java/src/test/resources/test_read1.in deleted file mode 100644 index 1e46242993..0000000000 --- a/core-java-modules/core-java/src/test/resources/test_read1.in +++ /dev/null @@ -1 +0,0 @@ -Hello world 1 \ No newline at end of file diff --git a/core-java-modules/core-java/src/test/resources/test_read2.in b/core-java-modules/core-java/src/test/resources/test_read2.in deleted file mode 100644 index fe47dc003b..0000000000 --- a/core-java-modules/core-java/src/test/resources/test_read2.in +++ /dev/null @@ -1 +0,0 @@ -2,3 4 \ No newline at end of file diff --git a/core-java-modules/core-java/src/test/resources/test_read3.in b/core-java-modules/core-java/src/test/resources/test_read3.in deleted file mode 100644 index db9f25a672..0000000000 --- a/core-java-modules/core-java/src/test/resources/test_read3.in +++ /dev/null @@ -1 +0,0 @@ -Hello 1 \ No newline at end of file diff --git a/core-java-modules/core-java/src/test/resources/test_read4.in b/core-java-modules/core-java/src/test/resources/test_read4.in deleted file mode 100644 index 5727d54bfc..0000000000 Binary files a/core-java-modules/core-java/src/test/resources/test_read4.in and /dev/null differ diff --git a/core-java-modules/core-java/src/test/resources/test_read7.in b/core-java-modules/core-java/src/test/resources/test_read7.in deleted file mode 100644 index 28d4d45d43..0000000000 --- a/core-java-modules/core-java/src/test/resources/test_read7.in +++ /dev/null @@ -1 +0,0 @@ -青空 \ No newline at end of file diff --git a/core-java-modules/core-java/src/test/resources/test_read8.in b/core-java-modules/core-java/src/test/resources/test_read8.in deleted file mode 100644 index 10fc1aac8a..0000000000 --- a/core-java-modules/core-java/src/test/resources/test_read8.in +++ /dev/null @@ -1,2 +0,0 @@ -Hello world - Test line diff --git a/core-java-modules/core-java/src/test/resources/test_read_d.in b/core-java-modules/core-java/src/test/resources/test_read_d.in deleted file mode 100644 index 82bbb4071f..0000000000 --- a/core-java-modules/core-java/src/test/resources/test_read_d.in +++ /dev/null @@ -1 +0,0 @@ -John,Adam-Tom \ No newline at end of file diff --git a/core-java-modules/core-java/src/test/resources/test_read_multiple.in b/core-java-modules/core-java/src/test/resources/test_read_multiple.in deleted file mode 100644 index 7d64000a76..0000000000 --- a/core-java-modules/core-java/src/test/resources/test_read_multiple.in +++ /dev/null @@ -1,2 +0,0 @@ -Hello world -Hi, John \ No newline at end of file diff --git a/core-java-modules/core-java/yofile.txt b/core-java-modules/core-java/yofile.txt deleted file mode 100644 index ad56bf35f7..0000000000 Binary files a/core-java-modules/core-java/yofile.txt and /dev/null differ diff --git a/core-java-modules/core-java/yofile2.txt b/core-java-modules/core-java/yofile2.txt deleted file mode 100644 index 8393b6e98b..0000000000 Binary files a/core-java-modules/core-java/yofile2.txt and /dev/null differ diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index c5dbdca299..6f3aec8c3a 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -17,7 +17,6 @@ - @@ -53,6 +52,7 @@ core-java-collections-maps core-java-collections-maps-2 core-java-collections-maps-3 + core-java-compiler core-java-concurrency-2 core-java-concurrency-advanced core-java-concurrency-advanced-2 @@ -67,6 +67,7 @@ core-java-datetime-string-2 core-java-date-operations-2 core-java-date-operations-3 + core-java-documentation core-java-exceptions core-java-exceptions-2 core-java-exceptions-3 @@ -119,6 +120,7 @@ core-java-numbers-6 core-java-optional core-java-perf + core-java-properties core-java-reflection core-java-reflection-2 core-java-security-2 diff --git a/docker-modules/docker-caching/multi-module-caching/core/pom.xml b/docker-modules/docker-caching/multi-module-caching/core-module/pom.xml similarity index 95% rename from docker-modules/docker-caching/multi-module-caching/core/pom.xml rename to docker-modules/docker-caching/multi-module-caching/core-module/pom.xml index bcfc4b5783..159d76830b 100644 --- a/docker-modules/docker-caching/multi-module-caching/core/pom.xml +++ b/docker-modules/docker-caching/multi-module-caching/core-module/pom.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - core + core-module multi-module-caching diff --git a/docker-modules/docker-caching/multi-module-caching/core/src/main/java/com/baeldung/maven_caching/CoreClass.java b/docker-modules/docker-caching/multi-module-caching/core-module/src/main/java/com/baeldung/maven_caching/CoreClass.java similarity index 100% rename from docker-modules/docker-caching/multi-module-caching/core/src/main/java/com/baeldung/maven_caching/CoreClass.java rename to docker-modules/docker-caching/multi-module-caching/core-module/src/main/java/com/baeldung/maven_caching/CoreClass.java diff --git a/docker-modules/docker-caching/multi-module-caching/pom.xml b/docker-modules/docker-caching/multi-module-caching/pom.xml index 1fdd6173bc..b64cf1a8b8 100644 --- a/docker-modules/docker-caching/multi-module-caching/pom.xml +++ b/docker-modules/docker-caching/multi-module-caching/pom.xml @@ -10,8 +10,8 @@ pom - runner - core + runner-module + core-module diff --git a/docker-modules/docker-caching/multi-module-caching/runner/pom.xml b/docker-modules/docker-caching/multi-module-caching/runner-module/pom.xml similarity index 95% rename from docker-modules/docker-caching/multi-module-caching/runner/pom.xml rename to docker-modules/docker-caching/multi-module-caching/runner-module/pom.xml index e3f234bac0..e608706864 100644 --- a/docker-modules/docker-caching/multi-module-caching/runner/pom.xml +++ b/docker-modules/docker-caching/multi-module-caching/runner-module/pom.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - runner + runner-module multi-module-caching @@ -14,7 +14,7 @@ com.baeldung - core + core-module 0.0.1-SNAPSHOT diff --git a/docker-modules/docker-caching/multi-module-caching/runner/src/main/java/com/baeldung/maven_caching/MavenCachingApplication.java b/docker-modules/docker-caching/multi-module-caching/runner-module/src/main/java/com/baeldung/maven_caching/MavenCachingApplication.java similarity index 100% rename from docker-modules/docker-caching/multi-module-caching/runner/src/main/java/com/baeldung/maven_caching/MavenCachingApplication.java rename to docker-modules/docker-caching/multi-module-caching/runner-module/src/main/java/com/baeldung/maven_caching/MavenCachingApplication.java diff --git a/code-generation/README.md b/google-auto-project/README.md similarity index 100% rename from code-generation/README.md rename to google-auto-project/README.md diff --git a/code-generation/pom.xml b/google-auto-project/pom.xml similarity index 96% rename from code-generation/pom.xml rename to google-auto-project/pom.xml index ed8890e1dd..839ccabc5f 100644 --- a/code-generation/pom.xml +++ b/google-auto-project/pom.xml @@ -3,9 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 - code-generation + google-auto-project 1.0 - code-generation + google-auto-project com.baeldung diff --git a/code-generation/src/main/java/com/baeldung/autofactory/App.java b/google-auto-project/src/main/java/com/baeldung/autofactory/App.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/App.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/App.java diff --git a/code-generation/src/main/java/com/baeldung/autofactory/CustomStorage.java b/google-auto-project/src/main/java/com/baeldung/autofactory/CustomStorage.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/CustomStorage.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/CustomStorage.java diff --git a/code-generation/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java b/google-auto-project/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java diff --git a/code-generation/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java b/google-auto-project/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java diff --git a/code-generation/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java b/google-auto-project/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java diff --git a/code-generation/src/main/java/com/baeldung/autofactory/model/Camera.java b/google-auto-project/src/main/java/com/baeldung/autofactory/model/Camera.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/model/Camera.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/model/Camera.java diff --git a/code-generation/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java b/google-auto-project/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java diff --git a/code-generation/src/main/java/com/baeldung/autofactory/model/Phone.java b/google-auto-project/src/main/java/com/baeldung/autofactory/model/Phone.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/model/Phone.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/model/Phone.java diff --git a/code-generation/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java b/google-auto-project/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java diff --git a/code-generation/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java b/google-auto-project/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java diff --git a/code-generation/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java b/google-auto-project/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java diff --git a/code-generation/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java b/google-auto-project/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java rename to google-auto-project/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java diff --git a/code-generation/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java b/google-auto-project/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java rename to google-auto-project/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java diff --git a/code-generation/src/main/java/com/baeldung/autoservice/TranslationService.java b/google-auto-project/src/main/java/com/baeldung/autoservice/TranslationService.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autoservice/TranslationService.java rename to google-auto-project/src/main/java/com/baeldung/autoservice/TranslationService.java diff --git a/code-generation/src/main/java/com/baeldung/autovalue/AutoValueMoney.java b/google-auto-project/src/main/java/com/baeldung/autovalue/AutoValueMoney.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autovalue/AutoValueMoney.java rename to google-auto-project/src/main/java/com/baeldung/autovalue/AutoValueMoney.java diff --git a/code-generation/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java b/google-auto-project/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java rename to google-auto-project/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java diff --git a/code-generation/src/main/java/com/baeldung/autovalue/Foo.java b/google-auto-project/src/main/java/com/baeldung/autovalue/Foo.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autovalue/Foo.java rename to google-auto-project/src/main/java/com/baeldung/autovalue/Foo.java diff --git a/code-generation/src/main/java/com/baeldung/autovalue/ImmutableMoney.java b/google-auto-project/src/main/java/com/baeldung/autovalue/ImmutableMoney.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autovalue/ImmutableMoney.java rename to google-auto-project/src/main/java/com/baeldung/autovalue/ImmutableMoney.java diff --git a/code-generation/src/main/java/com/baeldung/autovalue/MutableMoney.java b/google-auto-project/src/main/java/com/baeldung/autovalue/MutableMoney.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autovalue/MutableMoney.java rename to google-auto-project/src/main/java/com/baeldung/autovalue/MutableMoney.java diff --git a/code-generation/src/main/java/com/baeldung/autovalue/Person.java b/google-auto-project/src/main/java/com/baeldung/autovalue/Person.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autovalue/Person.java rename to google-auto-project/src/main/java/com/baeldung/autovalue/Person.java diff --git a/code-generation/src/main/resources/logback.xml b/google-auto-project/src/main/resources/logback.xml similarity index 100% rename from code-generation/src/main/resources/logback.xml rename to google-auto-project/src/main/resources/logback.xml diff --git a/code-generation/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java b/google-auto-project/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java similarity index 100% rename from code-generation/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java rename to google-auto-project/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java diff --git a/code-generation/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java b/google-auto-project/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java similarity index 100% rename from code-generation/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java rename to google-auto-project/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java diff --git a/code-generation/src/test/java/com/baeldung/autovalue/PersonUnitTest.java b/google-auto-project/src/test/java/com/baeldung/autovalue/PersonUnitTest.java similarity index 100% rename from code-generation/src/test/java/com/baeldung/autovalue/PersonUnitTest.java rename to google-auto-project/src/test/java/com/baeldung/autovalue/PersonUnitTest.java diff --git a/gradle-modules/gradle-customization/protobuf/README.md b/gradle-modules/gradle-customization/protobuf/README.md new file mode 100644 index 0000000000..4e94aa3557 --- /dev/null +++ b/gradle-modules/gradle-customization/protobuf/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Configuring Protobuf Compilation with Custom Source Directories](https://www.baeldung.com/java-configure-protobuf-compilation-custom-source-directories) diff --git a/gradle-modules/gradle-customization/protobuf/build.gradle b/gradle-modules/gradle-customization/protobuf/build.gradle new file mode 100644 index 0000000000..3cac57fb03 --- /dev/null +++ b/gradle-modules/gradle-customization/protobuf/build.gradle @@ -0,0 +1,45 @@ +plugins { + id 'java' + id "com.google.protobuf" version "0.8.18" +} + +group = 'com.baeldung' +version = '0.0.1-SNAPSHOT' +sourceCompatibility = '17' + +repositories { + mavenCentral() +} + +dependencies { + implementation group: 'com.google.protobuf', name: 'protobuf-java', version: '3.15.0' + implementation group: 'javax.annotation', name: 'javax.annotation-api', version: '1.3.2' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' +} + +tasks.named('test') { + useJUnitPlatform() +} + +protobuf { + protoc { + artifact = 'com.google.protobuf:protoc:3.15.0' + } +} + +sourceSets { + main { + proto { + srcDir 'src/sample_protofiles' + } + java { + srcDirs 'build/generated/source/proto/main/java' + } + } + test { + proto { + srcDir 'src/sample_protofiles' + } + } +} \ No newline at end of file diff --git a/gradle-modules/gradle-customization/protobuf/gradle/wrapper/gradle-wrapper.properties b/gradle-modules/gradle-customization/protobuf/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..774fae8767 --- /dev/null +++ b/gradle-modules/gradle-customization/protobuf/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradle-modules/gradle-customization/protobuf/gradlew b/gradle-modules/gradle-customization/protobuf/gradlew new file mode 100755 index 0000000000..a69d9cb6c2 --- /dev/null +++ b/gradle-modules/gradle-customization/protobuf/gradlew @@ -0,0 +1,240 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# 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. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +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 + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradle-modules/gradle-customization/protobuf/gradlew.bat b/gradle-modules/gradle-customization/protobuf/gradlew.bat new file mode 100644 index 0000000000..f127cfd49d --- /dev/null +++ b/gradle-modules/gradle-customization/protobuf/gradlew.bat @@ -0,0 +1,91 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem 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, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/gradle-modules/gradle-customization/protobuf/settings.gradle b/gradle-modules/gradle-customization/protobuf/settings.gradle new file mode 100644 index 0000000000..63483bae11 --- /dev/null +++ b/gradle-modules/gradle-customization/protobuf/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'protobuf' diff --git a/gradle-modules/gradle-customization/protobuf/src/main/resources/application.properties b/gradle-modules/gradle-customization/protobuf/src/main/resources/application.properties new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/gradle-modules/gradle-customization/protobuf/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/gradle-modules/gradle-customization/protobuf/src/sample_protofiles/user_message.proto b/gradle-modules/gradle-customization/protobuf/src/sample_protofiles/user_message.proto new file mode 100644 index 0000000000..60e06c2016 --- /dev/null +++ b/gradle-modules/gradle-customization/protobuf/src/sample_protofiles/user_message.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +package com.baeldung.protobuf; + +option java_multiple_files = true; +option java_package = "com.baeldung.protobuf.service"; + +message User { + string firstName = 1; + optional string middleName = 2; + string lastName = 3; + optional uint32 age = 4; +} \ No newline at end of file diff --git a/gradle-modules/gradle-customization/protobuf/src/test/java/com/baeldung/protobuf/ProtobufCodeGenerationUnitTest.java b/gradle-modules/gradle-customization/protobuf/src/test/java/com/baeldung/protobuf/ProtobufCodeGenerationUnitTest.java new file mode 100644 index 0000000000..12187e3efb --- /dev/null +++ b/gradle-modules/gradle-customization/protobuf/src/test/java/com/baeldung/protobuf/ProtobufCodeGenerationUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.protobuf; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +import com.baeldung.protobuf.service.User; + +class ProtobufCodeGenerationUnitTest { + + @Test + void givenUserData_whenObjectCreated_thenDataShouldMatch() { + final String firstName = "John"; + final String lastName = "Doe"; + final int age = 28; + + User user = User.newBuilder() + .setFirstName(firstName) + .setLastName(lastName) + .setAge(age) + .build(); + + assertEquals(firstName, user.getFirstName()); + assertEquals(lastName, user.getLastName()); + assertEquals(age, user.getAge()); + } + +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/format/User.java b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/format/User.java index e655deb93b..119c1e3ce3 100644 --- a/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/format/User.java +++ b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/format/User.java @@ -1,26 +1,41 @@ package com.baeldung.jackson.format; +import com.fasterxml.jackson.annotation.JsonFormat; + import java.util.Date; -import com.baeldung.jackson.domain.Person; -import com.fasterxml.jackson.annotation.JsonFormat; - -/** - * @author Jay Sridhar - * @version 1.0 - */ -public class User extends Person { +public class User { private String firstName; private String lastName; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd@HH:mm:ss.SSSZ") private Date createdDate; + public User() { + } + public User(String firstName, String lastName) { - super(firstName, lastName); + this.firstName = firstName; + this.lastName = lastName; this.createdDate = new Date(); } + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + public Date getCreatedDate() { return createdDate; } @@ -35,3 +50,51 @@ public class User extends Person { return new Date(); } } + +@JsonFormat(with = JsonFormat.Feature.ACCEPT_CASE_INSENSITIVE_PROPERTIES) +class UserIgnoreCase { + private String firstName; + private String lastName; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd@HH:mm:ss.SSSZ") + private Date createdDate; + + public UserIgnoreCase() { + } + + public UserIgnoreCase(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + this.createdDate = new Date(); + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public Date getCreatedDate() { + return createdDate; + } + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd@HH:mm:ss.SSSZ", locale = "en_GB") + public Date getCurrentDate() { + return new Date(); + } + + @JsonFormat(shape = JsonFormat.Shape.NUMBER) + public Date getDateNum() { + return new Date(); + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/format/JsonFormatUnitTest.java b/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/format/JsonFormatUnitTest.java index cf166fdc36..5cdc248d3b 100644 --- a/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/format/JsonFormatUnitTest.java +++ b/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/format/JsonFormatUnitTest.java @@ -1,24 +1,25 @@ package com.baeldung.jackson.format; -import java.util.Date; - import com.fasterxml.jackson.core.JsonProcessingException; - import com.fasterxml.jackson.databind.ObjectMapper; - +import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException; import org.junit.Test; -import static io.restassured.path.json.JsonPath.from; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; +import static io.restassured.path.json.JsonPath.from; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.from; import static org.assertj.core.data.Percentage.withPercentage; -/** - * @author Jay Sridhar - * @version 1.0 - */ public class JsonFormatUnitTest { + private static final String JSON_STRING = "{\"FIRSTNAME\":\"John\",\"lastname\":\"Smith\",\"cReAtEdDaTe\":\"2016-12-18@07:53:34.740+0000\"}"; + @Test public void whenSerializedDateFormat_thenCorrect() throws JsonProcessingException { @@ -32,6 +33,24 @@ public class JsonFormatUnitTest { // Expected to be close to current time long now = new Date().getTime(); assertThat(from(result).getLong("dateNum")).isCloseTo(now, withPercentage(10.0)); - } -} + + @Test + public void whenDeserializeJsonStrToUserObject_thenFail() { + assertThatThrownBy(() -> new ObjectMapper().readValue(JSON_STRING, User.class)).isInstanceOf(UnrecognizedPropertyException.class); + } + + @Test + public void whenDeserializeJsonStrToUserIgnoreCaseObject_thenSuccess() throws JsonProcessingException, ParseException { + UserIgnoreCase result = new ObjectMapper().readValue(JSON_STRING, UserIgnoreCase.class); + SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSzz"); + Date expectedDate = fmt.parse("2016-12-18T07:53:34.740+0000"); + + assertThat(result) + .isNotNull() + .returns("John", from(UserIgnoreCase::getFirstName)) + .returns("Smith", from(UserIgnoreCase::getLastName)) + .returns(expectedDate, from(UserIgnoreCase::getCreatedDate)); + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-conversions/src/test/java/com/baeldung/jackson/map/MapWithJsonKeyValueUnitTest.java b/jackson-modules/jackson-conversions/src/test/java/com/baeldung/jackson/map/MapWithJsonKeyValueUnitTest.java index 87c425fe96..0b4639ca3b 100644 --- a/jackson-modules/jackson-conversions/src/test/java/com/baeldung/jackson/map/MapWithJsonKeyValueUnitTest.java +++ b/jackson-modules/jackson-conversions/src/test/java/com/baeldung/jackson/map/MapWithJsonKeyValueUnitTest.java @@ -1,6 +1,6 @@ package com.baeldung.jackson.map; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import org.junit.Test; @@ -25,7 +25,7 @@ public class MapWithJsonKeyValueUnitTest { @Test public void givenMapWithObjectKeys_WhenSerialize_ThenUseJsonKeyForSerialization() throws JsonProcessingException { // Given - Map selectionByFruit = new HashMap<>(); + Map selectionByFruit = new LinkedHashMap(); selectionByFruit.put(FRUIT1, "Hagrid"); selectionByFruit.put(FRUIT2, "Hercules"); // When @@ -37,7 +37,7 @@ public class MapWithJsonKeyValueUnitTest { @Test public void givenMapWithObjectValues_WhenSerialize_ThenUseJsonValueForSerialization() throws JsonProcessingException { // Given - Map selectionByPerson = new HashMap<>(); + Map selectionByPerson = new LinkedHashMap(); selectionByPerson.put("Hagrid", FRUIT1); selectionByPerson.put("Hercules", FRUIT2); // When diff --git a/jackson-modules/jackson-core/README.md b/jackson-modules/jackson-core/README.md index d34a9e8bf7..73293b1e84 100644 --- a/jackson-modules/jackson-core/README.md +++ b/jackson-modules/jackson-core/README.md @@ -15,3 +15,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Working with Tree Model Nodes in Jackson](https://www.baeldung.com/jackson-json-node-tree-model) - [Get all the Keys in a JSON String Using JsonNode](https://www.baeldung.com/java-jsonnode-get-keys) - [Difference Between asText() and toString() in JsonNode](https://www.baeldung.com/java-jsonnode-astext-vs-tostring) +- [Deserialize Generic Type with Jackson](https://www.baeldung.com/java-deserialize-generic-type-with-jackson) diff --git a/jackson-modules/jackson-exceptions/README.md b/jackson-modules/jackson-exceptions/README.md index 6f082aaaa5..b9c43cb09f 100644 --- a/jackson-modules/jackson-exceptions/README.md +++ b/jackson-modules/jackson-exceptions/README.md @@ -5,3 +5,4 @@ This module contains articles about Jackson exceptions. ### Relevant Articles: - [Jackson Exceptions – Problems and Solutions](https://www.baeldung.com/jackson-exception) - [Jackson – JsonMappingException (No serializer found for class)](https://www.baeldung.com/jackson-jsonmappingexception) +- [Fix the JsonMappingException: Can not deserialize instance of java.util.ArrayList from Object value (token `JsonToken.START_OBJECT`)](https://www.baeldung.com/jsonmappingexception-can-not-deserialize-instance-of-java-util-arraylist-from-object-value-token-jsontoken-start_object) diff --git a/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mappingexception/Country.java b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mappingexception/Country.java new file mode 100644 index 0000000000..a8e6dfbc94 --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mappingexception/Country.java @@ -0,0 +1,26 @@ +package com.baeldung.mappingexception; + +import java.util.List; + +public class Country { + + private String name; + private List cities; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getCities() { + return cities; + } + + public void setCities(List cities) { + this.cities = cities; + } + +} diff --git a/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mappingexception/JacksonMappingExceptionUnitTest.java b/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mappingexception/JacksonMappingExceptionUnitTest.java index df35626828..026fd6719f 100644 --- a/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mappingexception/JacksonMappingExceptionUnitTest.java +++ b/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mappingexception/JacksonMappingExceptionUnitTest.java @@ -1,34 +1,33 @@ package com.baeldung.mappingexception; import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Arrays; -import java.io.IOException; -import java.util.List; import org.junit.Test; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.PropertyAccessor; -import com.fasterxml.jackson.core.JsonGenerationException; -import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.module.SimpleModule; -import com.google.common.collect.Lists; public class JacksonMappingExceptionUnitTest { @Test(expected = JsonMappingException.class) - public final void givenObjectHasNoAccessors_whenSerializing_thenException() throws JsonParseException, IOException { + public void givenObjectHasNoAccessors_whenSerializing_thenException() throws JsonProcessingException { final String dtoAsString = new ObjectMapper().writeValueAsString(new MyDtoNoAccessors()); assertThat(dtoAsString, notNullValue()); } @Test - public final void givenObjectHasNoAccessors_whenSerializingWithPrivateFieldsVisibility_thenNoException() throws JsonParseException, IOException { + public void givenObjectHasNoAccessors_whenSerializingWithPrivateFieldsVisibility_thenNoException() throws JsonProcessingException { final ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); final String dtoAsString = objectMapper.writeValueAsString(new MyDtoNoAccessors()); @@ -39,7 +38,7 @@ public class JacksonMappingExceptionUnitTest { } @Test - public final void givenObjectHasNoAccessorsButHasVisibleFields_whenSerializing_thenNoException() throws JsonParseException, IOException { + public void givenObjectHasNoAccessorsButHasVisibleFields_whenSerializing_thenNoException() throws JsonProcessingException { final ObjectMapper objectMapper = new ObjectMapper(); final String dtoAsString = objectMapper.writeValueAsString(new MyDtoNoAccessorsAndFieldVisibility()); @@ -48,4 +47,30 @@ public class JacksonMappingExceptionUnitTest { assertThat(dtoAsString, containsString("booleanValue")); } + @Test + public void givenJsonWithInvalidList_whenDeserializing_thenThrowException() throws JsonProcessingException { + final String json = "{\"name\":\"Netherlands\",\"cities\":{\"Amsterdam\", \"Tamassint\"}}"; + final ObjectMapper mapper = new ObjectMapper(); + + Exception exception = assertThrows(JsonMappingException.class, () -> mapper.reader() + .forType(Country.class) + .readValue(json)); + + assertTrue(exception.getMessage() + .contains("Cannot deserialize value of type `java.util.ArrayList`")); + } + + @Test + public void givenJsonWithValidList_whenDeserializing_thenCorrect() throws JsonProcessingException { + final String json = "{\"name\":\"Netherlands\",\"cities\":[\"Amsterdam\", \"Tamassint\"]}"; + final ObjectMapper mapper = new ObjectMapper(); + + Country country = mapper.reader() + .forType(Country.class) + .readValue(json); + + assertEquals("Netherlands", country.getName()); + assertEquals(Arrays.asList("Amsterdam", "Tamassint"), country.getCities()); + } + } diff --git a/jackson-simple/src/main/java/com/baeldung/jackson/annotation/BeanWithInclude.java b/jackson-simple/src/main/java/com/baeldung/jackson/annotation/BeanWithInclude.java new file mode 100644 index 0000000000..18130fc9f2 --- /dev/null +++ b/jackson-simple/src/main/java/com/baeldung/jackson/annotation/BeanWithInclude.java @@ -0,0 +1,18 @@ +package com.baeldung.jackson.annotation; + +import com.fasterxml.jackson.annotation.JsonIncludeProperties; + +@JsonIncludeProperties({ "name" }) +public class BeanWithInclude { + public int id; + public String name; + + public BeanWithInclude() { + + } + + public BeanWithInclude(final int id, final String name) { + this.id = id; + this.name = name; + } +} diff --git a/jackson-simple/src/test/java/com/baeldung/jackson/annotation/JacksonAnnotationUnitTest.java b/jackson-simple/src/test/java/com/baeldung/jackson/annotation/JacksonAnnotationUnitTest.java index 57ef231825..1a6c7b1286 100644 --- a/jackson-simple/src/test/java/com/baeldung/jackson/annotation/JacksonAnnotationUnitTest.java +++ b/jackson-simple/src/test/java/com/baeldung/jackson/annotation/JacksonAnnotationUnitTest.java @@ -213,6 +213,15 @@ public class JacksonAnnotationUnitTest { assertThat(result, not(containsString("id"))); } + @Test + public void whenSerializingUsingJsonIncludeProperties_thenCorrect() throws JsonProcessingException { + final BeanWithInclude bean = new BeanWithInclude(1, "My bean"); + final String result = new ObjectMapper().writeValueAsString(bean); + assertThat(result, containsString("My bean")); + assertThat(result, not(containsString("id"))); + assertThat(result, containsString("name")); + } + @Test public void whenSerializingUsingJsonIgnore_thenCorrect() throws JsonProcessingException { final BeanWithIgnore bean = new BeanWithIgnore(1, "My bean"); diff --git a/java-jdi/pom.xml b/java-jdi/pom.xml index b4c11c1bfe..dded13896f 100644 --- a/java-jdi/pom.xml +++ b/java-jdi/pom.xml @@ -15,13 +15,7 @@ - - com.sun - tools - ${tools.version} - system - ${java.home}/../lib/tools.jar - + @@ -32,10 +26,25 @@ true + + + org.apache.maven.plugins + maven-compiler-plugin + + ${maven.compiler.source.version} + ${maven.compiler.target.version} + + --add-exports=jdk.jdi/com.sun.jdi=ALL-UNNAMED + + + + + - 1.8 + 17 + 17 \ No newline at end of file diff --git a/javaxval-2/pom.xml b/javaxval-2/pom.xml index 1b1c4929c8..5c311e10f8 100644 --- a/javaxval-2/pom.xml +++ b/javaxval-2/pom.xml @@ -4,6 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 javaxval-2 + 0.1-SNAPSHOT javaxval-2 diff --git a/javaxval/pom.xml b/javaxval/pom.xml index 78f37c20d9..bececb2ea7 100644 --- a/javaxval/pom.xml +++ b/javaxval/pom.xml @@ -13,26 +13,6 @@ - - org.hibernate.validator - hibernate-validator - ${hibernate-validator.version} - - - org.glassfish - javax.el - ${javax.el.version} - - - org.springframework - spring-context - ${org.springframework.version} - - - org.springframework - spring-test - ${org.springframework.version} - org.springframework.boot spring-boot-starter-validation @@ -57,11 +37,8 @@ - 6.2.3.Final 6.2.0.Final - 3.0.0 - 5.3.21 - 2.7.1 + 3.0.4 \ No newline at end of file diff --git a/javaxval/src/main/java/com/baeldung/javaxval/beanvalidation/User.java b/javaxval/src/main/java/com/baeldung/javaxval/beanvalidation/User.java index d583ac51d2..7305b6c201 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/beanvalidation/User.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/beanvalidation/User.java @@ -4,14 +4,14 @@ import java.time.LocalDate; import java.util.List; import java.util.Optional; -import javax.validation.constraints.AssertTrue; -import javax.validation.constraints.Email; -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Past; -import javax.validation.constraints.Size; +import jakarta.validation.constraints.AssertTrue; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Past; +import jakarta.validation.constraints.Size; public class User { diff --git a/javaxval/src/main/java/com/baeldung/javaxval/bigdecimal/Invoice.java b/javaxval/src/main/java/com/baeldung/javaxval/bigdecimal/Invoice.java index c14a6bd2b1..c946a8df68 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/bigdecimal/Invoice.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/bigdecimal/Invoice.java @@ -2,8 +2,8 @@ package com.baeldung.javaxval.bigdecimal; import java.math.BigDecimal; -import javax.validation.constraints.DecimalMin; -import javax.validation.constraints.Digits; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.Digits; public class Invoice { diff --git a/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/AlphanumericReturnValue.java b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/AlphanumericReturnValue.java index 6e3408712b..65f6eceb34 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/AlphanumericReturnValue.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/AlphanumericReturnValue.java @@ -2,12 +2,12 @@ package com.baeldung.javaxval.constraint.composition; import org.hibernate.validator.constraints.Length; -import javax.validation.Constraint; -import javax.validation.Payload; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; -import javax.validation.constraintvalidation.SupportedValidationTarget; -import javax.validation.constraintvalidation.ValidationTarget; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraintvalidation.SupportedValidationTarget; +import jakarta.validation.constraintvalidation.ValidationTarget; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidAlphanumeric.java b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidAlphanumeric.java index 916b4e36a4..9d4d4995c5 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidAlphanumeric.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidAlphanumeric.java @@ -11,10 +11,10 @@ import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; import org.hibernate.validator.constraints.Length; diff --git a/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidAlphanumericWithSingleViolation.java b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidAlphanumericWithSingleViolation.java index edc5b6af3e..31eca29a07 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidAlphanumericWithSingleViolation.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidAlphanumericWithSingleViolation.java @@ -11,11 +11,11 @@ import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; -import javax.validation.ReportAsSingleViolation; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; +import jakarta.validation.ReportAsSingleViolation; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; import org.hibernate.validator.constraints.Length; diff --git a/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidLengthOrNumericCharacter.java b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidLengthOrNumericCharacter.java index 444cb4a63a..9f46e1e7b8 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidLengthOrNumericCharacter.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/constraint/composition/ValidLengthOrNumericCharacter.java @@ -4,9 +4,9 @@ import org.hibernate.validator.constraints.CompositionType; import org.hibernate.validator.constraints.ConstraintComposition; import org.hibernate.validator.constraints.Length; -import javax.validation.Constraint; -import javax.validation.Payload; -import javax.validation.constraints.Pattern; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; +import jakarta.validation.constraints.Pattern; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/javaxval/src/main/java/com/baeldung/javaxval/container/validation/Customer.java b/javaxval/src/main/java/com/baeldung/javaxval/container/validation/Customer.java index 03811635ee..c0b23f0ae8 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/container/validation/Customer.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/container/validation/Customer.java @@ -4,9 +4,9 @@ import java.util.List; import java.util.Optional; import java.util.OptionalInt; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.PositiveOrZero; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.PositiveOrZero; public class Customer { diff --git a/javaxval/src/main/java/com/baeldung/javaxval/container/validation/CustomerMap.java b/javaxval/src/main/java/com/baeldung/javaxval/container/validation/CustomerMap.java index 554285fbae..902f04c654 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/container/validation/CustomerMap.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/container/validation/CustomerMap.java @@ -2,8 +2,8 @@ package com.baeldung.javaxval.container.validation; import java.util.Map; -import javax.validation.constraints.Email; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotNull; public class CustomerMap { diff --git a/javaxval/src/main/java/com/baeldung/javaxval/container/validation/valueextractors/ProfileValueExtractor.java b/javaxval/src/main/java/com/baeldung/javaxval/container/validation/valueextractors/ProfileValueExtractor.java index 03e0c7aac4..a3a21fe88b 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/container/validation/valueextractors/ProfileValueExtractor.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/container/validation/valueextractors/ProfileValueExtractor.java @@ -1,8 +1,8 @@ package com.baeldung.javaxval.container.validation.valueextractors; -import javax.validation.valueextraction.ExtractedValue; -import javax.validation.valueextraction.UnwrapByDefault; -import javax.validation.valueextraction.ValueExtractor; +import jakarta.validation.valueextraction.ExtractedValue; +import jakarta.validation.valueextraction.UnwrapByDefault; +import jakarta.validation.valueextraction.ValueExtractor; import com.baeldung.javaxval.container.validation.Profile; diff --git a/javaxval/src/main/java/com/baeldung/javaxval/enums/CustomerTypeSubSetValidator.java b/javaxval/src/main/java/com/baeldung/javaxval/enums/CustomerTypeSubSetValidator.java index c91f449bad..da86ec6c89 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/enums/CustomerTypeSubSetValidator.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/enums/CustomerTypeSubSetValidator.java @@ -2,8 +2,8 @@ package com.baeldung.javaxval.enums; import java.util.Arrays; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import com.baeldung.javaxval.enums.constraints.CustomerTypeSubset; import com.baeldung.javaxval.enums.demo.CustomerType; diff --git a/javaxval/src/main/java/com/baeldung/javaxval/enums/EnumNamePatternValidator.java b/javaxval/src/main/java/com/baeldung/javaxval/enums/EnumNamePatternValidator.java index 3d56d40563..5cce8e10e7 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/enums/EnumNamePatternValidator.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/enums/EnumNamePatternValidator.java @@ -4,8 +4,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import com.baeldung.javaxval.enums.constraints.EnumNamePattern; diff --git a/javaxval/src/main/java/com/baeldung/javaxval/enums/EnumSubSetValidator.java b/javaxval/src/main/java/com/baeldung/javaxval/enums/EnumSubSetValidator.java index 04cccb8b0c..a3a92a4f4e 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/enums/EnumSubSetValidator.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/enums/EnumSubSetValidator.java @@ -3,8 +3,8 @@ package com.baeldung.javaxval.enums; import java.lang.annotation.Annotation; import java.util.Arrays; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; public abstract class EnumSubSetValidator implements ConstraintValidator { private U[] subset; diff --git a/javaxval/src/main/java/com/baeldung/javaxval/enums/ValueOfEnumValidator.java b/javaxval/src/main/java/com/baeldung/javaxval/enums/ValueOfEnumValidator.java index 0203d63923..c2f2ecee3b 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/enums/ValueOfEnumValidator.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/enums/ValueOfEnumValidator.java @@ -4,8 +4,8 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import com.baeldung.javaxval.enums.constraints.ValueOfEnum; diff --git a/javaxval/src/main/java/com/baeldung/javaxval/enums/constraints/CustomerTypeSubset.java b/javaxval/src/main/java/com/baeldung/javaxval/enums/constraints/CustomerTypeSubset.java index 97c2137f6a..fe03e228f6 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/enums/constraints/CustomerTypeSubset.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/enums/constraints/CustomerTypeSubset.java @@ -12,8 +12,8 @@ import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; import com.baeldung.javaxval.enums.CustomerTypeSubSetValidator; import com.baeldung.javaxval.enums.demo.CustomerType; diff --git a/javaxval/src/main/java/com/baeldung/javaxval/enums/constraints/EnumNamePattern.java b/javaxval/src/main/java/com/baeldung/javaxval/enums/constraints/EnumNamePattern.java index 29fff857c8..4ef1eac9c0 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/enums/constraints/EnumNamePattern.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/enums/constraints/EnumNamePattern.java @@ -12,8 +12,8 @@ import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; import com.baeldung.javaxval.enums.EnumNamePatternValidator; diff --git a/javaxval/src/main/java/com/baeldung/javaxval/enums/constraints/ValueOfEnum.java b/javaxval/src/main/java/com/baeldung/javaxval/enums/constraints/ValueOfEnum.java index 29b44a1793..bbfe6ed5ab 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/enums/constraints/ValueOfEnum.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/enums/constraints/ValueOfEnum.java @@ -12,8 +12,8 @@ import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; import com.baeldung.javaxval.enums.ValueOfEnumValidator; diff --git a/javaxval/src/main/java/com/baeldung/javaxval/enums/demo/Customer.java b/javaxval/src/main/java/com/baeldung/javaxval/enums/demo/Customer.java index 15cd9e0da7..db38dd0015 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/enums/demo/Customer.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/enums/demo/Customer.java @@ -1,6 +1,6 @@ package com.baeldung.javaxval.enums.demo; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; import com.baeldung.javaxval.enums.constraints.CustomerTypeSubset; import com.baeldung.javaxval.enums.constraints.EnumNamePattern; diff --git a/javaxval/src/main/java/com/baeldung/javaxval/javabeanconstraints/application/Application.java b/javaxval/src/main/java/com/baeldung/javaxval/javabeanconstraints/application/Application.java index 22157f351c..b1c53c5be3 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/javabeanconstraints/application/Application.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/javabeanconstraints/application/Application.java @@ -1,7 +1,7 @@ package com.baeldung.javaxval.javabeanconstraints.application; -import javax.validation.Validation; -import javax.validation.Validator; +import jakarta.validation.Validation; +import jakarta.validation.Validator; import com.baeldung.javaxval.javabeanconstraints.entities.UserNotBlank; diff --git a/javaxval/src/main/java/com/baeldung/javaxval/javabeanconstraints/entities/UserNotBlank.java b/javaxval/src/main/java/com/baeldung/javaxval/javabeanconstraints/entities/UserNotBlank.java index 5542be8c25..1a6c634ed4 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/javabeanconstraints/entities/UserNotBlank.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/javabeanconstraints/entities/UserNotBlank.java @@ -1,6 +1,6 @@ package com.baeldung.javaxval.javabeanconstraints.entities; -import javax.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotBlank; public class UserNotBlank { diff --git a/javaxval/src/main/java/com/baeldung/javaxval/javabeanconstraints/entities/UserNotEmpty.java b/javaxval/src/main/java/com/baeldung/javaxval/javabeanconstraints/entities/UserNotEmpty.java index e3dbe27b0e..0e01c41388 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/javabeanconstraints/entities/UserNotEmpty.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/javabeanconstraints/entities/UserNotEmpty.java @@ -1,6 +1,6 @@ package com.baeldung.javaxval.javabeanconstraints.entities; -import javax.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotEmpty; public class UserNotEmpty { diff --git a/javaxval/src/main/java/com/baeldung/javaxval/javabeanconstraints/entities/UserNotNull.java b/javaxval/src/main/java/com/baeldung/javaxval/javabeanconstraints/entities/UserNotNull.java index b3a0f90d36..39164e2f6b 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/javabeanconstraints/entities/UserNotNull.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/javabeanconstraints/entities/UserNotNull.java @@ -1,6 +1,6 @@ package com.baeldung.javaxval.javabeanconstraints.entities; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; public class UserNotNull { diff --git a/javaxval/src/main/java/com/baeldung/javaxval/validationgroup/CompleteInfo.java b/javaxval/src/main/java/com/baeldung/javaxval/validationgroup/CompleteInfo.java index 4ecdc3c5f1..22c0b01ddf 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/validationgroup/CompleteInfo.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/validationgroup/CompleteInfo.java @@ -1,6 +1,6 @@ package com.baeldung.javaxval.validationgroup; -import javax.validation.GroupSequence; +import jakarta.validation.GroupSequence; @GroupSequence({ BasicInfo.class, AdvanceInfo.class }) public interface CompleteInfo { diff --git a/javaxval/src/main/java/com/baeldung/javaxval/validationgroup/RegistrationForm.java b/javaxval/src/main/java/com/baeldung/javaxval/validationgroup/RegistrationForm.java index a30a074556..2f759d633d 100644 --- a/javaxval/src/main/java/com/baeldung/javaxval/validationgroup/RegistrationForm.java +++ b/javaxval/src/main/java/com/baeldung/javaxval/validationgroup/RegistrationForm.java @@ -1,7 +1,7 @@ package com.baeldung.javaxval.validationgroup; -import javax.validation.constraints.Email; -import javax.validation.constraints.NotBlank; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; public class RegistrationForm { @NotBlank(groups = BasicInfo.class) diff --git a/javaxval/src/test/java/com/baeldung/javaxval/beanvalidation/ValidationIntegrationTest.java b/javaxval/src/test/java/com/baeldung/javaxval/beanvalidation/ValidationIntegrationTest.java index 3e60fa7acd..132dddad5d 100644 --- a/javaxval/src/test/java/com/baeldung/javaxval/beanvalidation/ValidationIntegrationTest.java +++ b/javaxval/src/test/java/com/baeldung/javaxval/beanvalidation/ValidationIntegrationTest.java @@ -6,10 +6,10 @@ import java.time.LocalDate; import java.util.Collections; import java.util.Set; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; import org.junit.Before; import org.junit.Test; diff --git a/javaxval/src/test/java/com/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java b/javaxval/src/test/java/com/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java index 801d7966a5..a149a3a6fe 100644 --- a/javaxval/src/test/java/com/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java +++ b/javaxval/src/test/java/com/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java @@ -4,9 +4,9 @@ import com.baeldung.javaxval.LocaleAwareUnitTest; import org.junit.BeforeClass; import org.junit.Test; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; import java.math.BigDecimal; import java.util.Set; diff --git a/javaxval/src/test/java/com/baeldung/javaxval/constraint/composition/ConstraintCompositionUnitTest.java b/javaxval/src/test/java/com/baeldung/javaxval/constraint/composition/ConstraintCompositionUnitTest.java index 6c2b8f801c..918944cd5f 100644 --- a/javaxval/src/test/java/com/baeldung/javaxval/constraint/composition/ConstraintCompositionUnitTest.java +++ b/javaxval/src/test/java/com/baeldung/javaxval/constraint/composition/ConstraintCompositionUnitTest.java @@ -5,11 +5,11 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.util.Set; -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; import org.junit.Before; import org.junit.Test; diff --git a/javaxval/src/test/java/com/baeldung/javaxval/container/validation/ContainerValidationIntegrationTest.java b/javaxval/src/test/java/com/baeldung/javaxval/container/validation/ContainerValidationIntegrationTest.java index d96b641442..5c50fde7c6 100644 --- a/javaxval/src/test/java/com/baeldung/javaxval/container/validation/ContainerValidationIntegrationTest.java +++ b/javaxval/src/test/java/com/baeldung/javaxval/container/validation/ContainerValidationIntegrationTest.java @@ -6,10 +6,10 @@ import java.util.Collections; import java.util.OptionalInt; import java.util.Set; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; import com.baeldung.javaxval.container.validation.valueextractors.ProfileValueExtractor; import org.junit.Before; diff --git a/javaxval/src/test/java/com/baeldung/javaxval/enums/CustomerTypeSubSetValidatorUnitTest.java b/javaxval/src/test/java/com/baeldung/javaxval/enums/CustomerTypeSubSetValidatorUnitTest.java index 524f8eec36..7ccd840e8c 100644 --- a/javaxval/src/test/java/com/baeldung/javaxval/enums/CustomerTypeSubSetValidatorUnitTest.java +++ b/javaxval/src/test/java/com/baeldung/javaxval/enums/CustomerTypeSubSetValidatorUnitTest.java @@ -4,9 +4,9 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.Set; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; import org.junit.BeforeClass; import org.junit.Test; diff --git a/javaxval/src/test/java/com/baeldung/javaxval/enums/EnumNamePatternValidatorUnitTest.java b/javaxval/src/test/java/com/baeldung/javaxval/enums/EnumNamePatternValidatorUnitTest.java index 805d40ee5e..0556f88832 100644 --- a/javaxval/src/test/java/com/baeldung/javaxval/enums/EnumNamePatternValidatorUnitTest.java +++ b/javaxval/src/test/java/com/baeldung/javaxval/enums/EnumNamePatternValidatorUnitTest.java @@ -6,9 +6,9 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.Set; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; import org.junit.BeforeClass; import org.junit.Test; diff --git a/javaxval/src/test/java/com/baeldung/javaxval/enums/ValueOfEnumValidatorUnitTest.java b/javaxval/src/test/java/com/baeldung/javaxval/enums/ValueOfEnumValidatorUnitTest.java index 150da5d83b..c7eb740d86 100644 --- a/javaxval/src/test/java/com/baeldung/javaxval/enums/ValueOfEnumValidatorUnitTest.java +++ b/javaxval/src/test/java/com/baeldung/javaxval/enums/ValueOfEnumValidatorUnitTest.java @@ -4,9 +4,9 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.Set; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; import org.junit.BeforeClass; import org.junit.Test; diff --git a/javaxval/src/test/java/com/baeldung/javaxval/enums/demo/CustomerUnitTest.java b/javaxval/src/test/java/com/baeldung/javaxval/enums/demo/CustomerUnitTest.java index 02a49f50fa..c4380f75fa 100644 --- a/javaxval/src/test/java/com/baeldung/javaxval/enums/demo/CustomerUnitTest.java +++ b/javaxval/src/test/java/com/baeldung/javaxval/enums/demo/CustomerUnitTest.java @@ -5,9 +5,9 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.Set; import java.util.function.Predicate; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; import org.junit.BeforeClass; import org.junit.Test; diff --git a/javaxval/src/test/java/com/baeldung/javaxval/javabeanconstraints/UserNotBlankUnitTest.java b/javaxval/src/test/java/com/baeldung/javaxval/javabeanconstraints/UserNotBlankUnitTest.java index 4cb87e8e27..68e48de41d 100644 --- a/javaxval/src/test/java/com/baeldung/javaxval/javabeanconstraints/UserNotBlankUnitTest.java +++ b/javaxval/src/test/java/com/baeldung/javaxval/javabeanconstraints/UserNotBlankUnitTest.java @@ -4,9 +4,9 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.Set; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; import com.baeldung.javaxval.javabeanconstraints.entities.UserNotBlank; import org.junit.BeforeClass; diff --git a/javaxval/src/test/java/com/baeldung/javaxval/javabeanconstraints/UserNotEmptyUnitTest.java b/javaxval/src/test/java/com/baeldung/javaxval/javabeanconstraints/UserNotEmptyUnitTest.java index eb76ac260c..bd83d30601 100644 --- a/javaxval/src/test/java/com/baeldung/javaxval/javabeanconstraints/UserNotEmptyUnitTest.java +++ b/javaxval/src/test/java/com/baeldung/javaxval/javabeanconstraints/UserNotEmptyUnitTest.java @@ -4,9 +4,9 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.Set; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; import com.baeldung.javaxval.javabeanconstraints.entities.UserNotEmpty; import org.junit.BeforeClass; diff --git a/javaxval/src/test/java/com/baeldung/javaxval/javabeanconstraints/UserNotNullUnitTest.java b/javaxval/src/test/java/com/baeldung/javaxval/javabeanconstraints/UserNotNullUnitTest.java index f0280000de..36874f4f21 100644 --- a/javaxval/src/test/java/com/baeldung/javaxval/javabeanconstraints/UserNotNullUnitTest.java +++ b/javaxval/src/test/java/com/baeldung/javaxval/javabeanconstraints/UserNotNullUnitTest.java @@ -4,9 +4,9 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.Set; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; import com.baeldung.javaxval.javabeanconstraints.entities.UserNotNull; import org.junit.BeforeClass; diff --git a/javaxval/src/test/java/com/baeldung/javaxval/validationgroup/RegistrationFormUnitTest.java b/javaxval/src/test/java/com/baeldung/javaxval/validationgroup/RegistrationFormUnitTest.java index 3333703328..52aadf80b0 100644 --- a/javaxval/src/test/java/com/baeldung/javaxval/validationgroup/RegistrationFormUnitTest.java +++ b/javaxval/src/test/java/com/baeldung/javaxval/validationgroup/RegistrationFormUnitTest.java @@ -4,9 +4,9 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.Set; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; import org.junit.BeforeClass; import org.junit.Test; diff --git a/jhipster-5/bookstore-monolith/.yo-rc.json b/jhipster-5/bookstore-monolith/.yo-rc.json deleted file mode 100644 index d852aeeddc..0000000000 --- a/jhipster-5/bookstore-monolith/.yo-rc.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "generator-jhipster": { - "promptValues": { - "packageName": "com.baeldung.jhipster5" - }, - "jhipsterVersion": "5.8.2", - "applicationType": "monolith", - "baseName": "Bookstore", - "packageName": "com.baeldung.jhipster5", - "packageFolder": "com/baeldung/jhipster5", - "serverPort": "8080", - "authenticationType": "jwt", - "cacheProvider": "no", - "websocket": false, - "databaseType": "sql", - "devDatabaseType": "h2Memory", - "prodDatabaseType": "mysql", - "searchEngine": false, - "messageBroker": false, - "serviceDiscoveryType": false, - "buildTool": "maven", - "enableSwaggerCodegen": false, - "jwtSecretKey": "NDJmOTVlZjI2NzhlZDRjNmVkNTM1NDE2NjkyNDljZDJiNzBlMjI5YmZjMjY3MzdjZmZlMjI3NjE4OTRkNzc5MWYzNDNlYWMzYmJjOWRmMjc5ZWQyZTZmOWZkOTMxZWZhNWE1MTVmM2U2NjFmYjhlNDc2Y2Q3NzliMGY0YzFkNmI=", - "clientFramework": "angularX", - "useSass": true, - "clientPackageManager": "npm", - "testFrameworks": [], - "jhiPrefix": "jhi", - "entitySuffix": "", - "dtoSuffix": "DTO", - "otherModules": [], - "enableTranslation": false - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/audit/package-info.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/audit/package-info.java deleted file mode 100644 index 49a2a73a61..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/audit/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Audit specific code. - */ -package com.baeldung.jhipster5.config.audit; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/package-info.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/package-info.java deleted file mode 100644 index eba92a598e..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * JPA domain objects. - */ -package com.baeldung.jhipster5.domain; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/package-info.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/package-info.java deleted file mode 100644 index a5002eb201..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Spring Data JPA repositories. - */ -package com.baeldung.jhipster5.repository; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/package-info.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/package-info.java deleted file mode 100644 index 87951796ea..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Data Transfer Objects. - */ -package com.baeldung.jhipster5.service.dto; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/package-info.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/package-info.java deleted file mode 100644 index a54ed5cca0..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Service layer beans. - */ -package com.baeldung.jhipster5.service; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/package-info.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/package-info.java deleted file mode 100644 index 75bf6840f6..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Spring MVC REST controllers. - */ -package com.baeldung.jhipster5.web.rest; diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/logs/logs.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/logs/logs.component.spec.ts deleted file mode 100644 index def356c0f2..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/logs/logs.component.spec.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { ComponentFixture, TestBed, async } from '@angular/core/testing'; -import { of } from 'rxjs'; -import { HttpHeaders, HttpResponse } from '@angular/common/http'; - -import { BookstoreTestModule } from '../../../test.module'; -import { LogsComponent } from 'app/admin/logs/logs.component'; -import { LogsService } from 'app/admin/logs/logs.service'; -import { ITEMS_PER_PAGE } from 'app/shared'; -import { Log } from 'app/admin'; - -describe('Component Tests', () => { - describe('LogsComponent', () => { - let comp: LogsComponent; - let fixture: ComponentFixture; - let service: LogsService; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [LogsComponent], - providers: [LogsService] - }) - .overrideTemplate(LogsComponent, '') - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(LogsComponent); - comp = fixture.componentInstance; - service = fixture.debugElement.injector.get(LogsService); - }); - - describe('OnInit', () => { - it('should set all default values correctly', () => { - expect(comp.filter).toBe(''); - expect(comp.orderProp).toBe('name'); - expect(comp.reverse).toBe(false); - }); - it('Should call load all on init', () => { - // GIVEN - const headers = new HttpHeaders().append('link', 'link;link'); - const log = new Log('main', 'WARN'); - spyOn(service, 'findAll').and.returnValue( - of( - new HttpResponse({ - body: [log], - headers - }) - ) - ); - - // WHEN - comp.ngOnInit(); - - // THEN - expect(service.findAll).toHaveBeenCalled(); - expect(comp.loggers[0]).toEqual(jasmine.objectContaining(log)); - }); - }); - describe('change log level', () => { - it('should change log level correctly', () => { - // GIVEN - const log = new Log('main', 'ERROR'); - spyOn(service, 'changeLevel').and.returnValue(of(new HttpResponse())); - spyOn(service, 'findAll').and.returnValue(of(new HttpResponse({ body: [log] }))); - - // WHEN - comp.changeLevel('main', 'ERROR'); - - // THEN - expect(service.changeLevel).toHaveBeenCalled(); - expect(service.findAll).toHaveBeenCalled(); - expect(comp.loggers[0]).toEqual(jasmine.objectContaining(log)); - }); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/logs/logs.service.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/logs/logs.service.spec.ts deleted file mode 100644 index c34833922e..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/logs/logs.service.spec.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { LogsService } from 'app/admin/logs/logs.service'; -import { Log } from 'app/admin/logs/log.model'; -import { SERVER_API_URL } from 'app/app.constants'; -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; - -describe('Service Tests', () => { - describe('Logs Service', () => { - let service: LogsService; - let httpMock; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [HttpClientTestingModule] - }); - - service = TestBed.get(LogsService); - httpMock = TestBed.get(HttpTestingController); - }); - - afterEach(() => { - httpMock.verify(); - }); - - describe('Service methods', () => { - it('should call correct URL', () => { - service.findAll().subscribe(() => {}); - - const req = httpMock.expectOne({ method: 'GET' }); - const resourceUrl = SERVER_API_URL + 'management/logs'; - expect(req.request.url).toEqual(resourceUrl); - }); - - it('should return Logs', () => { - const log = new Log('main', 'ERROR'); - - service.findAll().subscribe(received => { - expect(received.body[0]).toEqual(log); - }); - - const req = httpMock.expectOne({ method: 'GET' }); - req.flush([log]); - }); - - it('should change log level', () => { - const log = new Log('main', 'ERROR'); - - service.changeLevel(log).subscribe(received => { - expect(received.body[0]).toEqual(log); - }); - - const req = httpMock.expectOne({ method: 'PUT' }); - req.flush([log]); - }); - }); - }); -}); diff --git a/jhipster-5/README.md b/jhipster-6/README.md similarity index 89% rename from jhipster-5/README.md rename to jhipster-6/README.md index ba05641af0..9db409a032 100644 --- a/jhipster-5/README.md +++ b/jhipster-6/README.md @@ -1,3 +1,3 @@ -## JHipster 5 +## JHipster 6 This module contains articles about JHipster 5. This is an aggregator module, articles are in the relevant submodules. diff --git a/jhipster-5/bookstore-monolith/.editorconfig b/jhipster-6/bookstore-monolith/.editorconfig similarity index 100% rename from jhipster-5/bookstore-monolith/.editorconfig rename to jhipster-6/bookstore-monolith/.editorconfig diff --git a/jhipster-5/bookstore-monolith/.gitattributes b/jhipster-6/bookstore-monolith/.gitattributes similarity index 100% rename from jhipster-5/bookstore-monolith/.gitattributes rename to jhipster-6/bookstore-monolith/.gitattributes diff --git a/jhipster-5/bookstore-monolith/.gitignore b/jhipster-6/bookstore-monolith/.gitignore similarity index 100% rename from jhipster-5/bookstore-monolith/.gitignore rename to jhipster-6/bookstore-monolith/.gitignore diff --git a/jhipster-5/bookstore-monolith/.huskyrc b/jhipster-6/bookstore-monolith/.huskyrc similarity index 100% rename from jhipster-5/bookstore-monolith/.huskyrc rename to jhipster-6/bookstore-monolith/.huskyrc diff --git a/jhipster-5/bookstore-monolith/.jhipster/Book.json b/jhipster-6/bookstore-monolith/.jhipster/Book.json similarity index 100% rename from jhipster-5/bookstore-monolith/.jhipster/Book.json rename to jhipster-6/bookstore-monolith/.jhipster/Book.json diff --git a/jhipster-5/bookstore-monolith/.mvn/wrapper/MavenWrapperDownloader.java b/jhipster-6/bookstore-monolith/.mvn/wrapper/MavenWrapperDownloader.java similarity index 100% rename from jhipster-5/bookstore-monolith/.mvn/wrapper/MavenWrapperDownloader.java rename to jhipster-6/bookstore-monolith/.mvn/wrapper/MavenWrapperDownloader.java diff --git a/jhipster-5/bookstore-monolith/.mvn/wrapper/maven-wrapper.jar b/jhipster-6/bookstore-monolith/.mvn/wrapper/maven-wrapper.jar similarity index 100% rename from jhipster-5/bookstore-monolith/.mvn/wrapper/maven-wrapper.jar rename to jhipster-6/bookstore-monolith/.mvn/wrapper/maven-wrapper.jar diff --git a/jhipster-5/bookstore-monolith/.mvn/wrapper/maven-wrapper.properties b/jhipster-6/bookstore-monolith/.mvn/wrapper/maven-wrapper.properties similarity index 100% rename from jhipster-5/bookstore-monolith/.mvn/wrapper/maven-wrapper.properties rename to jhipster-6/bookstore-monolith/.mvn/wrapper/maven-wrapper.properties diff --git a/jhipster-5/bookstore-monolith/.prettierignore b/jhipster-6/bookstore-monolith/.prettierignore similarity index 100% rename from jhipster-5/bookstore-monolith/.prettierignore rename to jhipster-6/bookstore-monolith/.prettierignore diff --git a/jhipster-5/bookstore-monolith/.prettierrc b/jhipster-6/bookstore-monolith/.prettierrc similarity index 100% rename from jhipster-5/bookstore-monolith/.prettierrc rename to jhipster-6/bookstore-monolith/.prettierrc diff --git a/jhipster-6/bookstore-monolith/.yo-rc.json b/jhipster-6/bookstore-monolith/.yo-rc.json new file mode 100644 index 0000000000..3ec14d8ada --- /dev/null +++ b/jhipster-6/bookstore-monolith/.yo-rc.json @@ -0,0 +1,36 @@ +{ + "generator-jhipster": { + "promptValues": { + "packageName": "com.baeldung.jhipster5" + }, + "jhipsterVersion": "6.0.0", + "applicationType": "monolith", + "baseName": "Bookstore", + "packageName": "com.baeldung.jhipster5", + "packageFolder": "com/baeldung/jhipster5", + "serverPort": "8080", + "authenticationType": "jwt", + "cacheProvider": "no", + "websocket": false, + "databaseType": "sql", + "devDatabaseType": "h2Memory", + "prodDatabaseType": "mysql", + "searchEngine": false, + "messageBroker": false, + "serviceDiscoveryType": false, + "buildTool": "maven", + "enableSwaggerCodegen": false, + "jwtSecretKey": "NDJmOTVlZjI2NzhlZDRjNmVkNTM1NDE2NjkyNDljZDJiNzBlMjI5YmZjMjY3MzdjZmZlMjI3NjE4OTRkNzc5MWYzNDNlYWMzYmJjOWRmMjc5ZWQyZTZmOWZkOTMxZWZhNWE1MTVmM2U2NjFmYjhlNDc2Y2Q3NzliMGY0YzFkNmI=", + "clientFramework": "angularX", + "useSass": true, + "clientPackageManager": "npm", + "testFrameworks": [], + "jhiPrefix": "jhi", + "entitySuffix": "", + "dtoSuffix": "DTO", + "otherModules": [], + "enableTranslation": false, + "enableHibernateCache": false, + "clientTheme": "none" + } +} \ No newline at end of file diff --git a/jhipster-5/bookstore-monolith/README.md b/jhipster-6/bookstore-monolith/README.md similarity index 100% rename from jhipster-5/bookstore-monolith/README.md rename to jhipster-6/bookstore-monolith/README.md diff --git a/jhipster-5/bookstore-monolith/angular.json b/jhipster-6/bookstore-monolith/angular.json similarity index 100% rename from jhipster-5/bookstore-monolith/angular.json rename to jhipster-6/bookstore-monolith/angular.json diff --git a/jhipster-5/bookstore-monolith/mvnw b/jhipster-6/bookstore-monolith/mvnw old mode 100755 new mode 100644 similarity index 100% rename from jhipster-5/bookstore-monolith/mvnw rename to jhipster-6/bookstore-monolith/mvnw diff --git a/jhipster-5/bookstore-monolith/mvnw.cmd b/jhipster-6/bookstore-monolith/mvnw.cmd similarity index 100% rename from jhipster-5/bookstore-monolith/mvnw.cmd rename to jhipster-6/bookstore-monolith/mvnw.cmd diff --git a/jhipster-5/bookstore-monolith/package.json b/jhipster-6/bookstore-monolith/package.json similarity index 99% rename from jhipster-5/bookstore-monolith/package.json rename to jhipster-6/bookstore-monolith/package.json index 46b920edb3..76b74a4312 100644 --- a/jhipster-5/bookstore-monolith/package.json +++ b/jhipster-6/bookstore-monolith/package.json @@ -51,7 +51,7 @@ "file-loader": "3.0.1", "fork-ts-checker-webpack-plugin": "0.5.2", "friendly-errors-webpack-plugin": "1.7.0", - "generator-jhipster": "5.8.2", + "generator-jhipster": "6.0.0", "html-loader": "0.5.5", "html-webpack-plugin": "3.2.0", "husky": "1.3.1", diff --git a/jhipster-5/bookstore-monolith/pom.xml b/jhipster-6/bookstore-monolith/pom.xml similarity index 89% rename from jhipster-5/bookstore-monolith/pom.xml rename to jhipster-6/bookstore-monolith/pom.xml index ccaa802a39..f719baab8b 100644 --- a/jhipster-5/bookstore-monolith/pom.xml +++ b/jhipster-6/bookstore-monolith/pom.xml @@ -2,14 +2,14 @@ 4.0.0 - com.baeldung.jhipster5 + com.baeldung.jhipster6 bookstore-monolith 0.0.1-SNAPSHOT war bookstore-monolith - jhipster-5 + jhipster-6 com.baeldung.jhipster 1.0.0-SNAPSHOT @@ -41,8 +41,25 @@ io.github.jhipster jhipster-framework + 3.0.1 + + + jakarta.xml.bind + jakarta.xml.bind-api + 4.0.0 + + + + org.glassfish.jaxb + jaxb-runtime + 4.0.0 + + + + + com.fasterxml.jackson.datatype jackson-datatype-hibernate5 @@ -78,10 +95,10 @@ io.springfox springfox-bean-validators - - com.mattbertolini - liquibase-slf4j - + + + + com.zaxxer HikariCP @@ -94,6 +111,10 @@ org.apache.commons commons-lang3 + + mysql + mysql-connector-java + org.assertj assertj-core @@ -120,9 +141,13 @@ net.logstash.logback logstash-logback-encoder + + + + org.mapstruct - mapstruct-jdk8 + mapstruct org.mapstruct @@ -269,6 +294,11 @@ hibernate-jpamodelgen ${hibernate.version} + + org.glassfish.jaxb + jaxb-runtime + ${jaxb-runtime.version} + @@ -492,9 +522,8 @@ [${maven.version},) - - You are running an incompatible version of Java. JHipster requires JDK ${java.version} - [1.8,1.9) + You are running an incompatible version of Java. JHipster supports JDK 11. + [${java.version},) @@ -681,6 +710,9 @@ npm + + install --legacy-peer-deps + webpack build dev @@ -1023,135 +1055,12 @@ - - - default-first - - - - - com.github.eirslett - frontend-maven-plugin - - - - install node and npm - none - - - npm install - none - - - webpack build dev - none - - - webpack build test - none - - - - - - - - default-second - - - - - com.github.eirslett - frontend-maven-plugin - - - - install node and npm - none - - - npm install - none - - - webpack build dev - none - - - webpack build test - none - - - - - - - - integration-lite-first - - - - com.github.eirslett - frontend-maven-plugin - - - - install node and npm - none - - - npm install - none - - - webpack build dev - none - - - webpack build test - none - - - - - - - - integration-lite-second - - - - com.github.eirslett - frontend-maven-plugin - - - - install node and npm - none - - - npm install - none - - - webpack build dev - none - - - webpack build test - none - - - - - - 3.0.0 - 1.8 + 11 2.12.6 v10.15.0 6.4.1 @@ -1168,34 +1077,36 @@ - 2.1.1 + 3.0.1 - 2.7.8 + 2.7.5 - 5.2.17.Final + 5.3.9.Final - 3.22.0-GA + 3.23.1-GA - 3.5.5 + 3.6.3 3.6 + 5.1.5.RELEASE 2.0.1.Final - 1.2.0.Final + 2.3.2 + 1.3.0.Final 3.1.0 3.8.0 2.10 - 3.0.0-M2 + 3.0.0-M1 2.2.1 3.1.0 - 2.22.2 + 3.0.0-M3 3.2.2 0.9.11 - 1.6 + 1.7.6 0.8.2 1.0.0 3.4.2 diff --git a/jhipster-5/bookstore-monolith/postcss.config.js b/jhipster-6/bookstore-monolith/postcss.config.js similarity index 100% rename from jhipster-5/bookstore-monolith/postcss.config.js rename to jhipster-6/bookstore-monolith/postcss.config.js diff --git a/jhipster-5/bookstore-monolith/proxy.conf.json b/jhipster-6/bookstore-monolith/proxy.conf.json similarity index 100% rename from jhipster-5/bookstore-monolith/proxy.conf.json rename to jhipster-6/bookstore-monolith/proxy.conf.json diff --git a/jhipster-5/bookstore-monolith/src/main/docker/.dockerignore b/jhipster-6/bookstore-monolith/src/main/docker/.dockerignore similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/docker/.dockerignore rename to jhipster-6/bookstore-monolith/src/main/docker/.dockerignore diff --git a/jhipster-5/bookstore-monolith/src/main/docker/Dockerfile b/jhipster-6/bookstore-monolith/src/main/docker/Dockerfile similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/docker/Dockerfile rename to jhipster-6/bookstore-monolith/src/main/docker/Dockerfile diff --git a/jhipster-5/bookstore-monolith/src/main/docker/app.yml b/jhipster-6/bookstore-monolith/src/main/docker/app.yml similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/docker/app.yml rename to jhipster-6/bookstore-monolith/src/main/docker/app.yml diff --git a/jhipster-5/bookstore-monolith/src/main/docker/entrypoint.sh b/jhipster-6/bookstore-monolith/src/main/docker/entrypoint.sh similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/docker/entrypoint.sh rename to jhipster-6/bookstore-monolith/src/main/docker/entrypoint.sh diff --git a/jhipster-6/bookstore-monolith/src/main/docker/grafana/provisioning/dashboards/JVM.json b/jhipster-6/bookstore-monolith/src/main/docker/grafana/provisioning/dashboards/JVM.json new file mode 100644 index 0000000000..b299032c99 --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/main/docker/grafana/provisioning/dashboards/JVM.json @@ -0,0 +1,3778 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "limit": 100, + "name": "Annotations & Alerts", + "showIn": 0, + "type": "dashboard" + }, + { + "datasource": "Prometheus", + "enable": true, + "expr": "resets(process_uptime_seconds{application=\"$application\", instance=\"$instance\"}[1m]) > 0", + "iconColor": "rgba(255, 96, 96, 1)", + "name": "Restart Detection", + "showIn": 0, + "step": "1m", + "tagKeys": "restart-tag", + "textFormat": "uptime reset", + "titleFormat": "Restart" + } + ] + }, + "description": "Dashboard for Micrometer instrumented applications (Java, Spring Boot, Micronaut)", + "editable": true, + "gnetId": 4701, + "graphTooltip": 1, + "iteration": 1553765841423, + "links": [], + "panels": [ + { + "content": "\n# Acknowledgments\n\nThank you to [Michael Weirauch](https://twitter.com/emwexx) for creating this dashboard: see original JVM (Micrometer) dashboard at [https://grafana.com/dashboards/4701](https://grafana.com/dashboards/4701)\n\n\n\n", + "gridPos": { + "h": 3, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 141, + "links": [], + "mode": "markdown", + "timeFrom": null, + "timeShift": null, + "title": "Acknowledgments", + "type": "text" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 3 + }, + "id": 125, + "panels": [], + "repeat": null, + "title": "Quick Facts", + "type": "row" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": ["rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)"], + "datasource": "Prometheus", + "decimals": 1, + "editable": true, + "error": false, + "format": "s", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 0, + "y": 4 + }, + "height": "", + "id": 63, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "70%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "process_uptime_seconds{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 14400 + } + ], + "thresholds": "", + "title": "Uptime", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": ["rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)"], + "datasource": "Prometheus", + "decimals": null, + "editable": true, + "error": false, + "format": "dateTimeAsIso", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 6, + "y": 4 + }, + "height": "", + "id": 92, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "70%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "process_start_time_seconds{application=\"$application\", instance=\"$instance\"}*1000", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 14400 + } + ], + "thresholds": "", + "title": "Start time", + "type": "singlestat", + "valueFontSize": "70%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": ["rgba(50, 172, 45, 0.97)", "rgba(237, 129, 40, 0.89)", "rgba(245, 54, 54, 0.9)"], + "datasource": "Prometheus", + "decimals": 2, + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 12, + "y": 4 + }, + "id": 65, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "70%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})*100/sum(jvm_memory_max_bytes{application=\"$application\",instance=\"$instance\", area=\"heap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 14400 + } + ], + "thresholds": "70,90", + "title": "Heap used", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": ["rgba(50, 172, 45, 0.97)", "rgba(237, 129, 40, 0.89)", "rgba(245, 54, 54, 0.9)"], + "datasource": "Prometheus", + "decimals": 2, + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 18, + "y": 4 + }, + "id": 75, + "interval": null, + "links": [], + "mappingType": 2, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "70%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + }, + { + "from": "-99999999999999999999999999999999", + "text": "N/A", + "to": "0" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})*100/sum(jvm_memory_max_bytes{application=\"$application\",instance=\"$instance\", area=\"nonheap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 14400 + } + ], + "thresholds": "70,90", + "title": "Non-Heap used", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + }, + { + "op": "=", + "text": "x", + "value": "" + } + ], + "valueName": "current" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 7 + }, + "id": 126, + "panels": [], + "repeat": null, + "title": "I/O Overview", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 8 + }, + "id": 111, + "legend": { + "avg": false, + "current": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(http_server_requests_seconds_count{application=\"$application\", instance=\"$instance\"}[1m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "HTTP", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Rate", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "ops", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "HTTP": "#890f02", + "HTTP - 5xx": "#bf1b00" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 8 + }, + "id": 112, + "legend": { + "avg": false, + "current": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(http_server_requests_seconds_count{application=\"$application\", instance=\"$instance\", status=~\"5..\"}[1m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "HTTP - 5xx", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Errors", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "ops", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 8 + }, + "id": 113, + "legend": { + "avg": false, + "current": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(http_server_requests_seconds_sum{application=\"$application\", instance=\"$instance\", status!~\"5..\"}[1m]))/sum(rate(http_server_requests_seconds_count{application=\"$application\", instance=\"$instance\", status!~\"5..\"}[1m]))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "HTTP - AVG", + "refId": "A" + }, + { + "expr": "max(http_server_requests_seconds_max{application=\"$application\", instance=\"$instance\", status!~\"5..\"})", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "HTTP - MAX", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Duration", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 15 + }, + "id": 127, + "panels": [], + "repeat": null, + "title": "JVM Memory", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 16 + }, + "id": 24, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "committed", + "refId": "B", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "max", + "refId": "C", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "JVM Heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 16 + }, + "id": 25, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "committed", + "refId": "B", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "max", + "refId": "C", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "JVM Non-Heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 16 + }, + "id": 26, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "committed", + "refId": "B", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "max", + "refId": "C", + "step": 2400 + }, + { + "expr": "process_memory_vss_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": true, + "intervalFactor": 2, + "legendFormat": "vss", + "metric": "", + "refId": "D", + "step": 2400 + }, + { + "expr": "process_memory_rss_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "rss", + "refId": "E", + "step": 2400 + }, + { + "expr": "process_memory_pss_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "pss", + "refId": "F", + "step": 2400 + }, + { + "expr": "process_memory_swap_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "swap", + "refId": "G", + "step": 2400 + }, + { + "expr": "process_memory_swappss_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "swappss", + "refId": "H", + "step": 2400 + }, + { + "expr": "process_memory_pss_bytes{application=\"$application\", instance=\"$instance\"} + process_memory_swap_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "phys (pss+swap)", + "refId": "I", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "JVM Total", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": "", + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 23 + }, + "id": 128, + "panels": [], + "repeat": null, + "title": "JVM Misc", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 24 + }, + "id": 106, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "system_cpu_usage{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "system", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "process_cpu_usage{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "process", + "refId": "B" + }, + { + "expr": "avg_over_time(process_cpu_usage{application=\"$application\", instance=\"$instance\"}[1h])", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "process-1h", + "refId": "C" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "CPU", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 1, + "format": "percentunit", + "label": "", + "logBase": 1, + "max": "1", + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 24 + }, + "id": 93, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "system_load_average_1m{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "system-1m", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "", + "format": "time_series", + "intervalFactor": 2, + "refId": "B" + }, + { + "expr": "system_cpu_count{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "cpu", + "refId": "C" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Load", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 1, + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 12, + "y": 24 + }, + "id": 32, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_threads_live{application=\"$application\", instance=\"$instance\"} or jvm_threads_live_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "live", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "jvm_threads_daemon{application=\"$application\", instance=\"$instance\"} or jvm_threads_daemon_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "daemon", + "metric": "", + "refId": "B", + "step": 2400 + }, + { + "expr": "jvm_threads_peak{application=\"$application\", instance=\"$instance\"} or jvm_threads_peak_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "peak", + "refId": "C", + "step": 2400 + }, + { + "expr": "process_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "process", + "refId": "D", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Threads", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "blocked": "#bf1b00", + "new": "#fce2de", + "runnable": "#7eb26d", + "terminated": "#511749", + "timed-waiting": "#c15c17", + "waiting": "#eab839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 24 + }, + "id": 124, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_threads_states_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{state}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Thread States", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "debug": "#1F78C1", + "error": "#BF1B00", + "info": "#508642", + "trace": "#6ED0E0", + "warn": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 18, + "x": 0, + "y": 31 + }, + "height": "", + "id": 91, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": true, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "error", + "yaxis": 1 + }, + { + "alias": "warn", + "yaxis": 1 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "increase(logback_events_total{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{level}}", + "metric": "", + "refId": "A", + "step": 1200 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Log Events (1m)", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 31 + }, + "id": 61, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "process_open_fds{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "open", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "process_max_fds{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "B", + "step": 2400 + }, + { + "expr": "process_files_open{application=\"$application\", instance=\"$instance\"} or process_files_open_files{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "open", + "refId": "C" + }, + { + "expr": "process_files_max{application=\"$application\", instance=\"$instance\"} or process_files_max_files{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "max", + "refId": "D" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "File Descriptors", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 10, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 38 + }, + "id": 129, + "panels": [], + "repeat": "persistence_counts", + "title": "JVM Memory Pools (Heap)", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 39 + }, + "id": 3, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": "jvm_memory_pool_heap", + "scopedVars": { + "jvm_memory_pool_heap": { + "selected": false, + "text": "PS Eden Space", + "value": "PS Eden Space" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 39 + }, + "id": 134, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatIteration": 1553765841423, + "repeatPanelId": 3, + "scopedVars": { + "jvm_memory_pool_heap": { + "selected": false, + "text": "PS Old Gen", + "value": "PS Old Gen" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 39 + }, + "id": 135, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatIteration": 1553765841423, + "repeatPanelId": 3, + "scopedVars": { + "jvm_memory_pool_heap": { + "selected": false, + "text": "PS Survivor Space", + "value": "PS Survivor Space" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 46 + }, + "id": 130, + "panels": [], + "repeat": null, + "title": "JVM Memory Pools (Non-Heap)", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 47 + }, + "id": 78, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": "jvm_memory_pool_nonheap", + "scopedVars": { + "jvm_memory_pool_nonheap": { + "selected": false, + "text": "Metaspace", + "value": "Metaspace" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_nonheap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 47 + }, + "id": 136, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatIteration": 1553765841423, + "repeatPanelId": 78, + "scopedVars": { + "jvm_memory_pool_nonheap": { + "selected": false, + "text": "Compressed Class Space", + "value": "Compressed Class Space" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_nonheap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 47 + }, + "id": 137, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatIteration": 1553765841423, + "repeatPanelId": 78, + "scopedVars": { + "jvm_memory_pool_nonheap": { + "selected": false, + "text": "Code Cache", + "value": "Code Cache" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_nonheap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 54 + }, + "id": 131, + "panels": [], + "repeat": null, + "title": "Garbage Collection", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 55 + }, + "id": 98, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(jvm_gc_pause_seconds_count{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{action}} ({{cause}})", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Collections", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ops", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 55 + }, + "id": 101, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(jvm_gc_pause_seconds_sum{application=\"$application\", instance=\"$instance\"}[1m])/rate(jvm_gc_pause_seconds_count{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "avg {{action}} ({{cause}})", + "refId": "A" + }, + { + "expr": "jvm_gc_pause_seconds_max{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "max {{action}} ({{cause}})", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Pause Durations", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 55 + }, + "id": 99, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(jvm_gc_memory_allocated_bytes_total{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "allocated", + "refId": "A" + }, + { + "expr": "rate(jvm_gc_memory_promoted_bytes_total{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "promoted", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Allocated/Promoted", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 62 + }, + "id": 132, + "panels": [], + "repeat": null, + "title": "Classloading", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 63 + }, + "id": 37, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_classes_loaded{application=\"$application\", instance=\"$instance\"} or jvm_classes_loaded_classes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "loaded", + "metric": "", + "refId": "A", + "step": 1200 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Classes loaded", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 63 + }, + "id": 38, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "delta(jvm_classes_loaded{application=\"$application\",instance=\"$instance\"}[5m]) or delta(jvm_classes_loaded_classes{application=\"$application\",instance=\"$instance\"}[5m])", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "delta", + "metric": "", + "refId": "A", + "step": 1200 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Class delta (5m)", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["ops", "short"], + "yaxes": [ + { + "decimals": null, + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 70 + }, + "id": 133, + "panels": [], + "repeat": null, + "title": "Buffer Pools", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 71 + }, + "id": 33, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_buffer_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"direct\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "jvm_buffer_total_capacity_bytes{application=\"$application\", instance=\"$instance\", id=\"direct\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "capacity", + "metric": "", + "refId": "B", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Direct Buffers", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 71 + }, + "id": 83, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_buffer_count{application=\"$application\", instance=\"$instance\", id=\"direct\"} or jvm_buffer_count_buffers{application=\"$application\", instance=\"$instance\", id=\"direct\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "count", + "metric": "", + "refId": "A", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Direct Buffers", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 12, + "y": 71 + }, + "id": 85, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_buffer_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"mapped\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "jvm_buffer_total_capacity_bytes{application=\"$application\", instance=\"$instance\", id=\"mapped\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "capacity", + "metric": "", + "refId": "B", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Mapped Buffers", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 71 + }, + "id": 84, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_buffer_count{application=\"$application\", instance=\"$instance\", id=\"mapped\"} or jvm_buffer_count_buffers{application=\"$application\", instance=\"$instance\", id=\"mapped\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "count", + "metric": "", + "refId": "A", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Mapped Buffers", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": "10s", + "schemaVersion": 18, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "allValue": null, + "current": { + "text": "test", + "value": "test" + }, + "datasource": "Prometheus", + "definition": "", + "hide": 0, + "includeAll": false, + "label": "Application", + "multi": false, + "name": "application", + "options": [], + "query": "label_values(application)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allFormat": "glob", + "allValue": null, + "current": { + "text": "localhost:8080", + "value": "localhost:8080" + }, + "datasource": "Prometheus", + "definition": "", + "hide": 0, + "includeAll": false, + "label": "Instance", + "multi": false, + "multiFormat": "glob", + "name": "instance", + "options": [], + "query": "label_values(jvm_memory_used_bytes{application=\"$application\"}, instance)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allFormat": "glob", + "allValue": null, + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": "Prometheus", + "definition": "", + "hide": 0, + "includeAll": true, + "label": "JVM Memory Pools Heap", + "multi": false, + "multiFormat": "glob", + "name": "jvm_memory_pool_heap", + "options": [], + "query": "label_values(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"},id)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allFormat": "glob", + "allValue": null, + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": "Prometheus", + "definition": "", + "hide": 0, + "includeAll": true, + "label": "JVM Memory Pools Non-Heap", + "multi": false, + "multiFormat": "glob", + "name": "jvm_memory_pool_nonheap", + "options": [], + "query": "label_values(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"},id)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 2, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timepicker": { + "now": true, + "refresh_intervals": ["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"], + "time_options": ["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"] + }, + "timezone": "browser", + "title": "JVM (Micrometer)", + "uid": "Ud1CFe3iz", + "version": 1 +} diff --git a/jhipster-6/bookstore-monolith/src/main/docker/grafana/provisioning/dashboards/dashboard.yml b/jhipster-6/bookstore-monolith/src/main/docker/grafana/provisioning/dashboards/dashboard.yml new file mode 100644 index 0000000000..5b46e1f4ca --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/main/docker/grafana/provisioning/dashboards/dashboard.yml @@ -0,0 +1,11 @@ +apiVersion: 1 + +providers: + - name: 'Prometheus' + orgId: 1 + folder: '' + type: file + disableDeletion: false + editable: true + options: + path: /etc/grafana/provisioning/dashboards diff --git a/jhipster-6/bookstore-monolith/src/main/docker/grafana/provisioning/datasources/datasource.yml b/jhipster-6/bookstore-monolith/src/main/docker/grafana/provisioning/datasources/datasource.yml new file mode 100644 index 0000000000..20506dab30 --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/main/docker/grafana/provisioning/datasources/datasource.yml @@ -0,0 +1,50 @@ +apiVersion: 1 + +# list of datasources that should be deleted from the database +deleteDatasources: + - name: Prometheus + orgId: 1 + +# list of datasources to insert/update depending +# whats available in the database +datasources: + # name of the datasource. Required + - name: Prometheus + # datasource type. Required + type: prometheus + # access mode. direct or proxy. Required + access: proxy + # org id. will default to orgId 1 if not specified + orgId: 1 + # url + # On MacOS, replace localhost by host.docker.internal + url: http://localhost:9090 + # database password, if used + password: + # database user, if used + user: + # database name, if used + database: + # enable/disable basic auth + basicAuth: false + # basic auth username + basicAuthUser: admin + # basic auth password + basicAuthPassword: admin + # enable/disable with credentials headers + withCredentials: + # mark as default datasource. Max one per org + isDefault: true + # fields that will be converted to json and stored in json_data + jsonData: + graphiteVersion: '1.1' + tlsAuth: false + tlsAuthWithCACert: false + # json object of data that will be encrypted. + secureJsonData: + tlsCACert: '...' + tlsClientCert: '...' + tlsClientKey: '...' + version: 1 + # allow users to edit datasources from the UI. + editable: true diff --git a/jhipster-6/bookstore-monolith/src/main/docker/monitoring.yml b/jhipster-6/bookstore-monolith/src/main/docker/monitoring.yml new file mode 100644 index 0000000000..fa75668445 --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/main/docker/monitoring.yml @@ -0,0 +1,26 @@ +version: '3' +services: + bookstore-prometheus: + image: prom/prometheus:v2.9.2 + volumes: + - ./prometheus/:/etc/prometheus/ + command: + - '--config.file=/etc/prometheus/prometheus.yml' + ports: + - 9090:9090 + # On MacOS, remove next line and replace localhost by host.docker.internal in prometheus/prometheus.yml and + # grafana/provisioning/datasources/datasource.yml + network_mode: 'host' # to test locally running service + bookstore-grafana: + image: grafana/grafana:6.1.4 + volumes: + - ./grafana/provisioning/:/etc/grafana/provisioning/ + environment: + - GF_SECURITY_ADMIN_PASSWORD=admin + - GF_USERS_ALLOW_SIGN_UP=false + - GF_INSTALL_PLUGINS=grafana-piechart-panel + ports: + - 3000:3000 + # On MacOS, remove next line and replace localhost by host.docker.internal in prometheus/prometheus.yml and + # grafana/provisioning/datasources/datasource.yml + network_mode: 'host' # to test locally running service diff --git a/jhipster-5/bookstore-monolith/src/main/docker/mysql.yml b/jhipster-6/bookstore-monolith/src/main/docker/mysql.yml similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/docker/mysql.yml rename to jhipster-6/bookstore-monolith/src/main/docker/mysql.yml diff --git a/jhipster-6/bookstore-monolith/src/main/docker/prometheus/prometheus.yml b/jhipster-6/bookstore-monolith/src/main/docker/prometheus/prometheus.yml new file mode 100644 index 0000000000..73f4c959da --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/main/docker/prometheus/prometheus.yml @@ -0,0 +1,26 @@ +# Sample global config for monitoring JHipster applications +global: + scrape_interval: 15s # By default, scrape targets every 15 seconds. + evaluation_interval: 15s # By default, scrape targets every 15 seconds. + # scrape_timeout is set to the global default (10s). + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'jhipster' + +# A scrape configuration containing exactly one endpoint to scrape: +# Here it's Prometheus itself. +scrape_configs: + # The job name is added as a label `job=` to any timeseries scraped from this config. + - job_name: 'prometheus' + + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + + # scheme defaults to 'http'. + metrics_path: /management/prometheus + static_configs: + - targets: + # On MacOS, replace localhost by host.docker.internal + - localhost:8080 diff --git a/jhipster-5/bookstore-monolith/src/main/docker/sonar.yml b/jhipster-6/bookstore-monolith/src/main/docker/sonar.yml similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/docker/sonar.yml rename to jhipster-6/bookstore-monolith/src/main/docker/sonar.yml diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/ApplicationWebXml.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/ApplicationWebXml.java similarity index 89% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/ApplicationWebXml.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/ApplicationWebXml.java index ca65727e77..32f28a8e9e 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/ApplicationWebXml.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/ApplicationWebXml.java @@ -1,6 +1,6 @@ -package com.baeldung.jhipster5; +package com.baeldung.jhipster6; -import com.baeldung.jhipster5.config.DefaultProfileUtil; +import com.baeldung.jhipster6.config.DefaultProfileUtil; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/BookstoreApp.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/BookstoreApp.java similarity index 96% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/BookstoreApp.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/BookstoreApp.java index e7ca925228..278efb9270 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/BookstoreApp.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/BookstoreApp.java @@ -1,7 +1,7 @@ -package com.baeldung.jhipster5; +package com.baeldung.jhipster6; -import com.baeldung.jhipster5.config.ApplicationProperties; -import com.baeldung.jhipster5.config.DefaultProfileUtil; +import com.baeldung.jhipster6.config.ApplicationProperties; +import com.baeldung.jhipster6.config.DefaultProfileUtil; import io.github.jhipster.config.JHipsterConstants; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/aop/logging/LoggingAspect.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/aop/logging/LoggingAspect.java similarity index 98% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/aop/logging/LoggingAspect.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/aop/logging/LoggingAspect.java index 0379637061..1e5a47c12a 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/aop/logging/LoggingAspect.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/aop/logging/LoggingAspect.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.aop.logging; +package com.baeldung.jhipster6.aop.logging; import io.github.jhipster.config.JHipsterConstants; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/ApplicationProperties.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/ApplicationProperties.java similarity index 90% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/ApplicationProperties.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/ApplicationProperties.java index 4ca3e9bd85..e9bf8bd1a8 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/ApplicationProperties.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/ApplicationProperties.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.config; +package com.baeldung.jhipster6.config; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/AsyncConfiguration.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/AsyncConfiguration.java similarity index 98% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/AsyncConfiguration.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/AsyncConfiguration.java index 414fe152bf..a245402175 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/AsyncConfiguration.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/AsyncConfiguration.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.config; +package com.baeldung.jhipster6.config; import io.github.jhipster.async.ExceptionHandlingAsyncTaskExecutor; import io.github.jhipster.config.JHipsterProperties; @@ -46,7 +46,7 @@ public class AsyncConfiguration implements AsyncConfigurer, SchedulingConfigurer public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return new SimpleAsyncUncaughtExceptionHandler(); } - + @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.setScheduler(scheduledTaskExecutor()); diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/CloudDatabaseConfiguration.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/CloudDatabaseConfiguration.java similarity index 95% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/CloudDatabaseConfiguration.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/CloudDatabaseConfiguration.java index 887a1bae89..3d57db6559 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/CloudDatabaseConfiguration.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/CloudDatabaseConfiguration.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.config; +package com.baeldung.jhipster6.config; import io.github.jhipster.config.JHipsterConstants; @@ -16,7 +16,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; public class CloudDatabaseConfiguration extends AbstractCloudConfig { private final Logger log = LoggerFactory.getLogger(CloudDatabaseConfiguration.class); - + private static final String CLOUD_CONFIGURATION_HIKARI_PREFIX = "spring.datasource.hikari"; @Bean diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/Constants.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/Constants.java similarity index 89% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/Constants.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/Constants.java index dd8f717f98..b5d6eba051 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/Constants.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/Constants.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.config; +package com.baeldung.jhipster6.config; /** * Application constants. @@ -11,7 +11,7 @@ public final class Constants { public static final String SYSTEM_ACCOUNT = "system"; public static final String ANONYMOUS_USER = "anonymoususer"; public static final String DEFAULT_LANGUAGE = "en"; - + private Constants() { } } diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/DatabaseConfiguration.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/DatabaseConfiguration.java similarity index 97% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/DatabaseConfiguration.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/DatabaseConfiguration.java index 007b1d6431..2aa8ae2e82 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/DatabaseConfiguration.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/DatabaseConfiguration.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.config; +package com.baeldung.jhipster6.config; import io.github.jhipster.config.JHipsterConstants; import io.github.jhipster.config.h2.H2ConfigurationHelper; @@ -42,7 +42,7 @@ public class DatabaseConfiguration { log.debug("H2 database is available on port {}", port); return H2ConfigurationHelper.createServer(port); } - + private String getValidPortForH2() { int port = Integer.parseInt(env.getProperty("server.port")); if (port < 10000) { diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/DateTimeFormatConfiguration.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/DateTimeFormatConfiguration.java similarity index 94% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/DateTimeFormatConfiguration.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/DateTimeFormatConfiguration.java index 4415ce0b1e..eeb4b55491 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/DateTimeFormatConfiguration.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/DateTimeFormatConfiguration.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.config; +package com.baeldung.jhipster6.config; import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/DefaultProfileUtil.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/DefaultProfileUtil.java similarity index 97% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/DefaultProfileUtil.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/DefaultProfileUtil.java index 2cfe16a1ae..02b3ce9db0 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/DefaultProfileUtil.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/DefaultProfileUtil.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.config; +package com.baeldung.jhipster6.config; import io.github.jhipster.config.JHipsterConstants; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/JacksonConfiguration.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/JacksonConfiguration.java similarity index 97% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/JacksonConfiguration.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/JacksonConfiguration.java index 119cd5f0c6..68fb92ef2e 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/JacksonConfiguration.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/JacksonConfiguration.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.config; +package com.baeldung.jhipster6.config; import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LiquibaseConfiguration.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/LiquibaseConfiguration.java similarity index 98% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LiquibaseConfiguration.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/LiquibaseConfiguration.java index 4b2a7b1e66..2f82a1f447 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LiquibaseConfiguration.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/LiquibaseConfiguration.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.config; +package com.baeldung.jhipster6.config; import javax.sql.DataSource; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LocaleConfiguration.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/LocaleConfiguration.java similarity index 96% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LocaleConfiguration.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/LocaleConfiguration.java index 256c6b77b9..d73198e5bb 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LocaleConfiguration.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/LocaleConfiguration.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.config; +package com.baeldung.jhipster6.config; import io.github.jhipster.config.locale.AngularCookieLocaleResolver; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LoggingAspectConfiguration.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/LoggingAspectConfiguration.java similarity index 81% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LoggingAspectConfiguration.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/LoggingAspectConfiguration.java index 25d7ba3792..1638234a89 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LoggingAspectConfiguration.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/LoggingAspectConfiguration.java @@ -1,6 +1,6 @@ -package com.baeldung.jhipster5.config; +package com.baeldung.jhipster6.config; -import com.baeldung.jhipster5.aop.logging.LoggingAspect; +import com.baeldung.jhipster6.aop.logging.LoggingAspect; import io.github.jhipster.config.JHipsterConstants; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LoggingConfiguration.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/LoggingConfiguration.java similarity index 99% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LoggingConfiguration.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/LoggingConfiguration.java index 9402a1bc36..893a16876f 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LoggingConfiguration.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/LoggingConfiguration.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.config; +package com.baeldung.jhipster6.config; import java.net.InetSocketAddress; import java.util.Iterator; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/SecurityConfiguration.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/SecurityConfiguration.java similarity index 94% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/SecurityConfiguration.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/SecurityConfiguration.java index f07944271e..f42ba55c20 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/SecurityConfiguration.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/SecurityConfiguration.java @@ -1,7 +1,10 @@ -package com.baeldung.jhipster5.config; +package com.baeldung.jhipster6.config; -import com.baeldung.jhipster5.security.*; -import com.baeldung.jhipster5.security.jwt.*; +import com.baeldung.jhipster6.security.*; +import com.baeldung.jhipster6.security.jwt.*; +import com.baeldung.jhipster6.security.AuthoritiesConstants; +import com.baeldung.jhipster6.security.jwt.JWTConfigurer; +import com.baeldung.jhipster6.security.jwt.TokenProvider; import org.springframework.beans.factory.BeanInitializationException; import org.springframework.context.annotation.Bean; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/WebConfigurer.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/WebConfigurer.java similarity index 79% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/WebConfigurer.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/WebConfigurer.java index 26cfc92487..8bed192c9f 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/WebConfigurer.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/WebConfigurer.java @@ -1,20 +1,18 @@ -package com.baeldung.jhipster5.config; +package com.baeldung.jhipster6.config; import io.github.jhipster.config.JHipsterConstants; import io.github.jhipster.config.JHipsterProperties; -import io.github.jhipster.config.h2.H2ConfigurationHelper; import io.github.jhipster.web.filter.CachingHttpHeadersFilter; -import io.undertow.UndertowOptions; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; import org.springframework.boot.web.server.*; import org.springframework.boot.web.servlet.ServletContextInitializer; import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; +import org.springframework.core.env.Profiles; import org.springframework.http.MediaType; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; @@ -42,7 +40,6 @@ public class WebConfigurer implements ServletContextInitializer, WebServerFactor private final JHipsterProperties jHipsterProperties; public WebConfigurer(Environment env, JHipsterProperties jHipsterProperties) { - this.env = env; this.jHipsterProperties = jHipsterProperties; } @@ -53,12 +50,9 @@ public class WebConfigurer implements ServletContextInitializer, WebServerFactor log.info("Web application configuration, using profiles: {}", (Object[]) env.getActiveProfiles()); } EnumSet disps = EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.ASYNC); - if (env.acceptsProfiles(JHipsterConstants.SPRING_PROFILE_PRODUCTION)) { + if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_PRODUCTION))) { initCachingHttpHeadersFilter(servletContext, disps); } - if (env.acceptsProfiles(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT)) { - initH2Console(servletContext); - } log.info("Web application fully configured"); } @@ -70,20 +64,6 @@ public class WebConfigurer implements ServletContextInitializer, WebServerFactor setMimeMappings(server); // When running in an IDE or with ./mvnw spring-boot:run, set location of the static web assets. setLocationForStaticAssets(server); - - /* - * Enable HTTP/2 for Undertow - https://twitter.com/ankinson/status/829256167700492288 - * HTTP/2 requires HTTPS, so HTTP requests will fallback to HTTP/1.1. - * See the JHipsterProperties class and your application-*.yml configuration files - * for more information. - */ - if (jHipsterProperties.getHttp().getVersion().equals(JHipsterProperties.Http.Version.V_2_0) && - server instanceof UndertowServletWebServerFactory) { - - ((UndertowServletWebServerFactory) server) - .addBuilderCustomizers(builder -> - builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true)); - } } private void setMimeMappings(WebServerFactory server) { @@ -103,7 +83,7 @@ public class WebConfigurer implements ServletContextInitializer, WebServerFactor ConfigurableServletWebServerFactory servletWebServer = (ConfigurableServletWebServerFactory) server; File root; String prefixPath = resolvePathPrefix(); - root = new File(prefixPath + "target/www/"); + root = new File(prefixPath + "target/classes/static/"); if (root.exists() && root.isDirectory()) { servletWebServer.setDocumentRoot(root); } @@ -134,7 +114,7 @@ public class WebConfigurer implements ServletContextInitializer, WebServerFactor * Initializes the caching HTTP Headers Filter. */ private void initCachingHttpHeadersFilter(ServletContext servletContext, - EnumSet disps) { + EnumSet disps) { log.debug("Registering Caching HTTP Headers Filter"); FilterRegistration.Dynamic cachingHttpHeadersFilter = servletContext.addFilter("cachingHttpHeadersFilter", @@ -159,12 +139,4 @@ public class WebConfigurer implements ServletContextInitializer, WebServerFactor return new CorsFilter(source); } - /** - * Initializes H2 console. - */ - private void initH2Console(ServletContext servletContext) { - log.debug("Initialize H2 console"); - H2ConfigurationHelper.initH2Console(servletContext); - } - } diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/audit/AuditEventConverter.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/audit/AuditEventConverter.java similarity index 96% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/audit/AuditEventConverter.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/audit/AuditEventConverter.java index 6dd87bb82d..fee87ffb96 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/audit/AuditEventConverter.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/audit/AuditEventConverter.java @@ -1,6 +1,6 @@ -package com.baeldung.jhipster5.config.audit; +package com.baeldung.jhipster6.config.audit; -import com.baeldung.jhipster5.domain.PersistentAuditEvent; +import com.baeldung.jhipster6.domain.PersistentAuditEvent; import org.springframework.boot.actuate.audit.AuditEvent; import org.springframework.security.web.authentication.WebAuthenticationDetails; diff --git a/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/audit/package-info.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/audit/package-info.java new file mode 100644 index 0000000000..ce7911db40 --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/audit/package-info.java @@ -0,0 +1,4 @@ +/** + * Audit specific code. + */ +package com.baeldung.jhipster6.config.audit; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/package-info.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/package-info.java similarity index 55% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/package-info.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/package-info.java index 868155ce9f..2f6261950a 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/package-info.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/config/package-info.java @@ -1,4 +1,4 @@ /** * Spring Framework configuration files. */ -package com.baeldung.jhipster5.config; +package com.baeldung.jhipster6.config; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/AbstractAuditingEntity.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/domain/AbstractAuditingEntity.java similarity index 98% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/AbstractAuditingEntity.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/domain/AbstractAuditingEntity.java index 861674ccc9..b3881af03b 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/AbstractAuditingEntity.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/domain/AbstractAuditingEntity.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.domain; +package com.baeldung.jhipster6.domain; import com.fasterxml.jackson.annotation.JsonIgnore; import org.hibernate.envers.Audited; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/Authority.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/domain/Authority.java similarity index 96% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/Authority.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/domain/Authority.java index fbd4596fc7..81d2b930cb 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/Authority.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/domain/Authority.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.domain; +package com.baeldung.jhipster6.domain; import javax.persistence.Entity; import javax.persistence.Id; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/Book.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/domain/Book.java similarity index 98% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/Book.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/domain/Book.java index 16771d9e09..14c5ec3396 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/Book.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/domain/Book.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.domain; +package com.baeldung.jhipster6.domain; @@ -17,7 +17,7 @@ import java.util.Objects; public class Book implements Serializable { private static final long serialVersionUID = 1L; - + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/PersistentAuditEvent.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/domain/PersistentAuditEvent.java similarity index 98% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/PersistentAuditEvent.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/domain/PersistentAuditEvent.java index 15e2eeda5a..f953eeded9 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/PersistentAuditEvent.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/domain/PersistentAuditEvent.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.domain; +package com.baeldung.jhipster6.domain; import javax.persistence.*; import javax.validation.constraints.NotNull; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/User.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/domain/User.java similarity index 98% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/User.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/domain/User.java index ff12d1ca9c..d1ff6c33fa 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/User.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/domain/User.java @@ -1,6 +1,6 @@ -package com.baeldung.jhipster5.domain; +package com.baeldung.jhipster6.domain; -import com.baeldung.jhipster5.config.Constants; +import com.baeldung.jhipster6.config.Constants; import com.fasterxml.jackson.annotation.JsonIgnore; import org.apache.commons.lang3.StringUtils; diff --git a/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/domain/package-info.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/domain/package-info.java new file mode 100644 index 0000000000..9063a204d5 --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/domain/package-info.java @@ -0,0 +1,4 @@ +/** + * JPA domain objects. + */ +package com.baeldung.jhipster6.domain; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/AuthorityRepository.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/repository/AuthorityRepository.java similarity index 69% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/AuthorityRepository.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/repository/AuthorityRepository.java index 310735eb57..335631195d 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/AuthorityRepository.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/repository/AuthorityRepository.java @@ -1,6 +1,6 @@ -package com.baeldung.jhipster5.repository; +package com.baeldung.jhipster6.repository; -import com.baeldung.jhipster5.domain.Authority; +import com.baeldung.jhipster6.domain.Authority; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/BookRepository.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/repository/BookRepository.java similarity index 75% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/BookRepository.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/repository/BookRepository.java index ebd3117e65..0863d1b89b 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/BookRepository.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/repository/BookRepository.java @@ -1,6 +1,6 @@ -package com.baeldung.jhipster5.repository; +package com.baeldung.jhipster6.repository; -import com.baeldung.jhipster5.domain.Book; +import com.baeldung.jhipster6.domain.Book; import org.springframework.data.jpa.repository.*; import org.springframework.stereotype.Repository; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/CustomAuditEventRepository.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/repository/CustomAuditEventRepository.java similarity index 94% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/CustomAuditEventRepository.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/repository/CustomAuditEventRepository.java index faa788ff5f..4e17cfff2b 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/CustomAuditEventRepository.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/repository/CustomAuditEventRepository.java @@ -1,8 +1,8 @@ -package com.baeldung.jhipster5.repository; +package com.baeldung.jhipster6.repository; -import com.baeldung.jhipster5.config.Constants; -import com.baeldung.jhipster5.config.audit.AuditEventConverter; -import com.baeldung.jhipster5.domain.PersistentAuditEvent; +import com.baeldung.jhipster6.config.Constants; +import com.baeldung.jhipster6.config.audit.AuditEventConverter; +import com.baeldung.jhipster6.domain.PersistentAuditEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/PersistenceAuditEventRepository.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/repository/PersistenceAuditEventRepository.java similarity index 89% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/PersistenceAuditEventRepository.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/repository/PersistenceAuditEventRepository.java index 2eb6f3b847..ca0025321e 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/PersistenceAuditEventRepository.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/repository/PersistenceAuditEventRepository.java @@ -1,6 +1,6 @@ -package com.baeldung.jhipster5.repository; +package com.baeldung.jhipster6.repository; -import com.baeldung.jhipster5.domain.PersistentAuditEvent; +import com.baeldung.jhipster6.domain.PersistentAuditEvent; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/UserRepository.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/repository/UserRepository.java similarity index 93% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/UserRepository.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/repository/UserRepository.java index 42a5588b22..27fd5fc359 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/UserRepository.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/repository/UserRepository.java @@ -1,6 +1,6 @@ -package com.baeldung.jhipster5.repository; +package com.baeldung.jhipster6.repository; -import com.baeldung.jhipster5.domain.User; +import com.baeldung.jhipster6.domain.User; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; diff --git a/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/repository/package-info.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/repository/package-info.java new file mode 100644 index 0000000000..949ee586b7 --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/repository/package-info.java @@ -0,0 +1,4 @@ +/** + * Spring Data JPA repositories. + */ +package com.baeldung.jhipster6.repository; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/AuthoritiesConstants.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/AuthoritiesConstants.java similarity index 88% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/AuthoritiesConstants.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/AuthoritiesConstants.java index 6ecf44394f..3f1709a6d9 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/AuthoritiesConstants.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/AuthoritiesConstants.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.security; +package com.baeldung.jhipster6.security; /** * Constants for Spring Security authorities. diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/CustomAuthenticationManager.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/CustomAuthenticationManager.java similarity index 93% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/CustomAuthenticationManager.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/CustomAuthenticationManager.java index 0a7dd66b24..092adf1b06 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/CustomAuthenticationManager.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/CustomAuthenticationManager.java @@ -1,10 +1,10 @@ -package com.baeldung.jhipster5.security; +package com.baeldung.jhipster6.security; -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.security.dto.LoginRequest; -import com.baeldung.jhipster5.security.dto.LoginResponse; -import com.baeldung.jhipster5.service.UserService; -import com.baeldung.jhipster5.service.dto.UserDTO; +import com.baeldung.jhipster6.domain.User; +import com.baeldung.jhipster6.security.dto.LoginRequest; +import com.baeldung.jhipster6.security.dto.LoginResponse; +import com.baeldung.jhipster6.service.UserService; +import com.baeldung.jhipster6.service.dto.UserDTO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/DomainUserDetailsService.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/DomainUserDetailsService.java similarity index 94% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/DomainUserDetailsService.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/DomainUserDetailsService.java index d0014096df..3102604ee4 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/DomainUserDetailsService.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/DomainUserDetailsService.java @@ -1,7 +1,8 @@ -package com.baeldung.jhipster5.security; +package com.baeldung.jhipster6.security; + +import com.baeldung.jhipster6.domain.User; +import com.baeldung.jhipster6.repository.UserRepository; -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.repository.UserRepository; import org.hibernate.validator.internal.constraintvalidators.hv.EmailValidator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/SecurityUtils.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/SecurityUtils.java similarity index 98% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/SecurityUtils.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/SecurityUtils.java index 462bb8abc9..a4a1982b3c 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/SecurityUtils.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/SecurityUtils.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.security; +package com.baeldung.jhipster6.security; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/SpringSecurityAuditorAware.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/SpringSecurityAuditorAware.java similarity index 83% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/SpringSecurityAuditorAware.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/SpringSecurityAuditorAware.java index c1d6405ae3..aff636c13c 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/SpringSecurityAuditorAware.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/SpringSecurityAuditorAware.java @@ -1,6 +1,6 @@ -package com.baeldung.jhipster5.security; +package com.baeldung.jhipster6.security; -import com.baeldung.jhipster5.config.Constants; +import com.baeldung.jhipster6.config.Constants; import java.util.Optional; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/UserNotActivatedException.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/UserNotActivatedException.java similarity index 92% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/UserNotActivatedException.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/UserNotActivatedException.java index 4b2d91983c..a1f71f5408 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/UserNotActivatedException.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/UserNotActivatedException.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.security; +package com.baeldung.jhipster6.security; import org.springframework.security.core.AuthenticationException; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginRequest.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/dto/LoginRequest.java similarity index 91% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginRequest.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/dto/LoginRequest.java index f45c23fa39..1de2638577 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginRequest.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/dto/LoginRequest.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.security.dto; +package com.baeldung.jhipster6.security.dto; /** * Simple DTO representing a login request to a remote service. diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginResponse.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/dto/LoginResponse.java similarity index 95% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginResponse.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/dto/LoginResponse.java index ad1fe37a2f..6063180569 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginResponse.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/dto/LoginResponse.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.security.dto; +package com.baeldung.jhipster6.security.dto; /** * Simple DTO representing the response of logging in using a remote service. diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/jwt/JWTConfigurer.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/jwt/JWTConfigurer.java similarity index 94% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/jwt/JWTConfigurer.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/jwt/JWTConfigurer.java index 944255e37d..570f6c8d9d 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/jwt/JWTConfigurer.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/jwt/JWTConfigurer.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.security.jwt; +package com.baeldung.jhipster6.security.jwt; import org.springframework.security.config.annotation.SecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.builders.HttpSecurity; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/jwt/JWTFilter.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/jwt/JWTFilter.java similarity index 97% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/jwt/JWTFilter.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/jwt/JWTFilter.java index cf1060282c..4e921a2f6e 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/jwt/JWTFilter.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/jwt/JWTFilter.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.security.jwt; +package com.baeldung.jhipster6.security.jwt; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/jwt/TokenProvider.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/jwt/TokenProvider.java similarity index 99% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/jwt/TokenProvider.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/jwt/TokenProvider.java index 248d45e050..20f46c06e9 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/jwt/TokenProvider.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/jwt/TokenProvider.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.security.jwt; +package com.baeldung.jhipster6.security.jwt; import java.nio.charset.StandardCharsets; import java.security.Key; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/package-info.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/package-info.java similarity index 50% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/package-info.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/package-info.java index 4759050c56..3fc05c27e7 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/package-info.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/security/package-info.java @@ -1,4 +1,4 @@ /** * Spring Security configuration. */ -package com.baeldung.jhipster5.security; +package com.baeldung.jhipster6.security; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/AuditEventService.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/AuditEventService.java similarity index 90% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/AuditEventService.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/AuditEventService.java index 852eb951c9..4d008e096e 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/AuditEventService.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/AuditEventService.java @@ -1,7 +1,8 @@ -package com.baeldung.jhipster5.service; +package com.baeldung.jhipster6.service; + +import com.baeldung.jhipster6.config.audit.AuditEventConverter; +import com.baeldung.jhipster6.repository.PersistenceAuditEventRepository; -import com.baeldung.jhipster5.config.audit.AuditEventConverter; -import com.baeldung.jhipster5.repository.PersistenceAuditEventRepository; import org.springframework.boot.actuate.audit.AuditEvent; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/BookService.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/BookService.java similarity index 91% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/BookService.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/BookService.java index 6422d1a424..00fe847527 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/BookService.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/BookService.java @@ -1,6 +1,6 @@ -package com.baeldung.jhipster5.service; +package com.baeldung.jhipster6.service; -import com.baeldung.jhipster5.service.dto.BookDTO; +import com.baeldung.jhipster6.service.dto.BookDTO; import java.util.List; import java.util.Optional; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/MailService.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/MailService.java similarity index 97% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/MailService.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/MailService.java index b15a7faff2..807cf8b5d6 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/MailService.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/MailService.java @@ -1,6 +1,6 @@ -package com.baeldung.jhipster5.service; +package com.baeldung.jhipster6.service; -import com.baeldung.jhipster5.domain.User; +import com.baeldung.jhipster6.domain.User; import io.github.jhipster.config.JHipsterProperties; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/UserService.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/UserService.java similarity index 92% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/UserService.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/UserService.java index 82d028f3ca..9c43332070 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/UserService.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/UserService.java @@ -1,15 +1,18 @@ -package com.baeldung.jhipster5.service; +package com.baeldung.jhipster6.service; -import com.baeldung.jhipster5.config.Constants; -import com.baeldung.jhipster5.domain.Authority; -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.repository.AuthorityRepository; -import com.baeldung.jhipster5.repository.UserRepository; -import com.baeldung.jhipster5.security.AuthoritiesConstants; -import com.baeldung.jhipster5.security.SecurityUtils; -import com.baeldung.jhipster5.service.dto.UserDTO; -import com.baeldung.jhipster5.service.util.RandomUtil; -import com.baeldung.jhipster5.web.rest.errors.*; +import com.baeldung.jhipster6.config.Constants; +import com.baeldung.jhipster6.domain.Authority; +import com.baeldung.jhipster6.domain.User; +import com.baeldung.jhipster6.repository.AuthorityRepository; +import com.baeldung.jhipster6.repository.UserRepository; +import com.baeldung.jhipster6.security.AuthoritiesConstants; +import com.baeldung.jhipster6.security.SecurityUtils; +import com.baeldung.jhipster6.service.dto.UserDTO; +import com.baeldung.jhipster6.service.util.RandomUtil; +import com.baeldung.jhipster6.web.rest.errors.*; +import com.baeldung.jhipster6.web.rest.errors.EmailAlreadyUsedException; +import com.baeldung.jhipster6.web.rest.errors.InvalidPasswordException; +import com.baeldung.jhipster6.web.rest.errors.LoginAlreadyUsedException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/BookDTO.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/dto/BookDTO.java similarity index 98% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/BookDTO.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/dto/BookDTO.java index 5aa550e989..6334af6c21 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/BookDTO.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/dto/BookDTO.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.service.dto; +package com.baeldung.jhipster6.service.dto; import java.time.LocalDate; import javax.validation.constraints.*; import java.io.Serializable; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/PasswordChangeDTO.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/dto/PasswordChangeDTO.java similarity index 94% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/PasswordChangeDTO.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/dto/PasswordChangeDTO.java index 0711c97f44..1439b6e58d 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/PasswordChangeDTO.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/dto/PasswordChangeDTO.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.service.dto; +package com.baeldung.jhipster6.service.dto; /** * A DTO representing a password change required data - current and new password. diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/UserDTO.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/dto/UserDTO.java similarity index 96% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/UserDTO.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/dto/UserDTO.java index 9142b3825e..2dd38f9c0f 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/UserDTO.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/dto/UserDTO.java @@ -1,9 +1,9 @@ -package com.baeldung.jhipster5.service.dto; +package com.baeldung.jhipster6.service.dto; -import com.baeldung.jhipster5.config.Constants; +import com.baeldung.jhipster6.config.Constants; -import com.baeldung.jhipster5.domain.Authority; -import com.baeldung.jhipster5.domain.User; +import com.baeldung.jhipster6.domain.Authority; +import com.baeldung.jhipster6.domain.User; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; diff --git a/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/dto/package-info.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/dto/package-info.java new file mode 100644 index 0000000000..c536320584 --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/dto/package-info.java @@ -0,0 +1,4 @@ +/** + * Data Transfer Objects. + */ +package com.baeldung.jhipster6.service.dto; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/impl/BookServiceImpl.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/impl/BookServiceImpl.java similarity index 88% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/impl/BookServiceImpl.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/impl/BookServiceImpl.java index 23cd59584c..0012489c5e 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/impl/BookServiceImpl.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/impl/BookServiceImpl.java @@ -1,11 +1,12 @@ -package com.baeldung.jhipster5.service.impl; +package com.baeldung.jhipster6.service.impl; + +import com.baeldung.jhipster6.service.BookService; +import com.baeldung.jhipster6.domain.Book; +import com.baeldung.jhipster6.repository.BookRepository; +import com.baeldung.jhipster6.service.dto.BookDTO; +import com.baeldung.jhipster6.service.mapper.BookMapper; +import com.baeldung.jhipster6.web.rest.errors.BadRequestAlertException; -import com.baeldung.jhipster5.service.BookService; -import com.baeldung.jhipster5.domain.Book; -import com.baeldung.jhipster5.repository.BookRepository; -import com.baeldung.jhipster5.service.dto.BookDTO; -import com.baeldung.jhipster5.service.mapper.BookMapper; -import com.baeldung.jhipster5.web.rest.errors.BadRequestAlertException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/BookMapper.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/mapper/BookMapper.java similarity index 67% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/BookMapper.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/mapper/BookMapper.java index cd24c7088e..64350fb4ed 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/BookMapper.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/mapper/BookMapper.java @@ -1,7 +1,8 @@ -package com.baeldung.jhipster5.service.mapper; +package com.baeldung.jhipster6.service.mapper; -import com.baeldung.jhipster5.domain.*; -import com.baeldung.jhipster5.service.dto.BookDTO; +import com.baeldung.jhipster6.domain.*; +import com.baeldung.jhipster6.service.dto.BookDTO; +import com.baeldung.jhipster6.domain.Book; import org.mapstruct.*; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/EntityMapper.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/mapper/EntityMapper.java similarity index 87% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/EntityMapper.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/mapper/EntityMapper.java index 68af78179d..6ca8d89480 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/EntityMapper.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/mapper/EntityMapper.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.service.mapper; +package com.baeldung.jhipster6.service.mapper; import java.util.List; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/UserMapper.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/mapper/UserMapper.java similarity index 92% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/UserMapper.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/mapper/UserMapper.java index 485c03813e..8b2b4cfba0 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/UserMapper.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/mapper/UserMapper.java @@ -1,8 +1,8 @@ -package com.baeldung.jhipster5.service.mapper; +package com.baeldung.jhipster6.service.mapper; -import com.baeldung.jhipster5.domain.Authority; -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.service.dto.UserDTO; +import com.baeldung.jhipster6.domain.Authority; +import com.baeldung.jhipster6.domain.User; +import com.baeldung.jhipster6.service.dto.UserDTO; import org.springframework.stereotype.Service; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/package-info.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/mapper/package-info.java similarity index 63% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/package-info.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/mapper/package-info.java index 7d402321e7..6ce6ec42fb 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/package-info.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/mapper/package-info.java @@ -1,4 +1,4 @@ /** * MapStruct mappers for mapping domain objects and Data Transfer Objects. */ -package com.baeldung.jhipster5.service.mapper; +package com.baeldung.jhipster6.service.mapper; diff --git a/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/package-info.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/package-info.java new file mode 100644 index 0000000000..4f9584c45e --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/package-info.java @@ -0,0 +1,4 @@ +/** + * Service layer beans. + */ +package com.baeldung.jhipster6.service; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/util/RandomUtil.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/util/RandomUtil.java similarity index 94% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/util/RandomUtil.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/util/RandomUtil.java index 97e4d9c672..74b8b178c2 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/util/RandomUtil.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/service/util/RandomUtil.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.service.util; +package com.baeldung.jhipster6.service.util; import org.apache.commons.lang3.RandomStringUtils; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/AccountResource.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/AccountResource.java similarity index 87% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/AccountResource.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/AccountResource.java index 2109e93999..3603df148b 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/AccountResource.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/AccountResource.java @@ -1,16 +1,21 @@ -package com.baeldung.jhipster5.web.rest; +package com.baeldung.jhipster6.web.rest; -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.repository.UserRepository; -import com.baeldung.jhipster5.security.SecurityUtils; -import com.baeldung.jhipster5.service.MailService; -import com.baeldung.jhipster5.service.UserService; -import com.baeldung.jhipster5.service.dto.PasswordChangeDTO; -import com.baeldung.jhipster5.service.dto.UserDTO; -import com.baeldung.jhipster5.web.rest.errors.*; -import com.baeldung.jhipster5.web.rest.vm.KeyAndPasswordVM; -import com.baeldung.jhipster5.web.rest.vm.ManagedUserVM; +import com.baeldung.jhipster6.domain.User; +import com.baeldung.jhipster6.repository.UserRepository; +import com.baeldung.jhipster6.security.SecurityUtils; +import com.baeldung.jhipster6.service.MailService; +import com.baeldung.jhipster6.service.UserService; +import com.baeldung.jhipster6.service.dto.PasswordChangeDTO; +import com.baeldung.jhipster6.service.dto.UserDTO; +import com.baeldung.jhipster6.web.rest.errors.*; +import com.baeldung.jhipster6.web.rest.errors.EmailAlreadyUsedException; +import com.baeldung.jhipster6.web.rest.errors.EmailNotFoundException; +import com.baeldung.jhipster6.web.rest.errors.InternalServerErrorException; +import com.baeldung.jhipster6.web.rest.errors.InvalidPasswordException; +import com.baeldung.jhipster6.web.rest.errors.LoginAlreadyUsedException; +import com.baeldung.jhipster6.web.rest.vm.KeyAndPasswordVM; +import com.baeldung.jhipster6.web.rest.vm.ManagedUserVM; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/AuditResource.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/AuditResource.java similarity index 94% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/AuditResource.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/AuditResource.java index d0182d5d9d..ebcdc42f64 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/AuditResource.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/AuditResource.java @@ -1,7 +1,7 @@ -package com.baeldung.jhipster5.web.rest; +package com.baeldung.jhipster6.web.rest; -import com.baeldung.jhipster5.service.AuditEventService; -import com.baeldung.jhipster5.web.rest.util.PaginationUtil; +import com.baeldung.jhipster6.service.AuditEventService; +import com.baeldung.jhipster6.web.rest.util.PaginationUtil; import io.github.jhipster.web.util.ResponseUtil; import org.springframework.boot.actuate.audit.AuditEvent; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/BookResource.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/BookResource.java similarity index 94% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/BookResource.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/BookResource.java index 0360ea05ed..584216b51d 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/BookResource.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/BookResource.java @@ -1,8 +1,8 @@ -package com.baeldung.jhipster5.web.rest; -import com.baeldung.jhipster5.service.BookService; -import com.baeldung.jhipster5.web.rest.errors.BadRequestAlertException; -import com.baeldung.jhipster5.web.rest.util.HeaderUtil; -import com.baeldung.jhipster5.service.dto.BookDTO; +package com.baeldung.jhipster6.web.rest; +import com.baeldung.jhipster6.service.BookService; +import com.baeldung.jhipster6.web.rest.errors.BadRequestAlertException; +import com.baeldung.jhipster6.web.rest.util.HeaderUtil; +import com.baeldung.jhipster6.service.dto.BookDTO; import io.github.jhipster.web.util.ResponseUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/ClientForwardController.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/ClientForwardController.java new file mode 100644 index 0000000000..a524d90fc0 --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/ClientForwardController.java @@ -0,0 +1,17 @@ +package com.baeldung.jhipster6.web.rest; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class ClientForwardController { + + /** + * Forwards any unmapped paths (except those containing a period) to the client {@code index.html}. + * @return forward to client {@code index.html}. + */ + @GetMapping(value = "/**/{path:[^\\.]*}") + public String forward() { + return "forward:/"; + } +} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/LogsResource.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/LogsResource.java similarity index 91% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/LogsResource.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/LogsResource.java index f35b5f2d5c..76d71d23d0 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/LogsResource.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/LogsResource.java @@ -1,6 +1,6 @@ -package com.baeldung.jhipster5.web.rest; +package com.baeldung.jhipster6.web.rest; -import com.baeldung.jhipster5.web.rest.vm.LoggerVM; +import com.baeldung.jhipster6.web.rest.vm.LoggerVM; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.LoggerContext; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/UserJWTController.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/UserJWTController.java similarity index 91% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/UserJWTController.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/UserJWTController.java index aeea587089..1bb647d2ef 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/UserJWTController.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/UserJWTController.java @@ -1,8 +1,8 @@ -package com.baeldung.jhipster5.web.rest; +package com.baeldung.jhipster6.web.rest; -import com.baeldung.jhipster5.security.jwt.JWTFilter; -import com.baeldung.jhipster5.security.jwt.TokenProvider; -import com.baeldung.jhipster5.web.rest.vm.LoginVM; +import com.baeldung.jhipster6.security.jwt.JWTFilter; +import com.baeldung.jhipster6.security.jwt.TokenProvider; +import com.baeldung.jhipster6.web.rest.vm.LoginVM; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/UserResource.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/UserResource.java similarity index 91% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/UserResource.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/UserResource.java index a95acf6759..36fa8f319c 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/UserResource.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/UserResource.java @@ -1,17 +1,17 @@ -package com.baeldung.jhipster5.web.rest; +package com.baeldung.jhipster6.web.rest; -import com.baeldung.jhipster5.config.Constants; -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.repository.UserRepository; -import com.baeldung.jhipster5.security.AuthoritiesConstants; -import com.baeldung.jhipster5.service.MailService; -import com.baeldung.jhipster5.service.UserService; -import com.baeldung.jhipster5.service.dto.UserDTO; -import com.baeldung.jhipster5.web.rest.errors.BadRequestAlertException; -import com.baeldung.jhipster5.web.rest.errors.EmailAlreadyUsedException; -import com.baeldung.jhipster5.web.rest.errors.LoginAlreadyUsedException; -import com.baeldung.jhipster5.web.rest.util.HeaderUtil; -import com.baeldung.jhipster5.web.rest.util.PaginationUtil; +import com.baeldung.jhipster6.config.Constants; +import com.baeldung.jhipster6.domain.User; +import com.baeldung.jhipster6.repository.UserRepository; +import com.baeldung.jhipster6.security.AuthoritiesConstants; +import com.baeldung.jhipster6.service.MailService; +import com.baeldung.jhipster6.service.UserService; +import com.baeldung.jhipster6.service.dto.UserDTO; +import com.baeldung.jhipster6.web.rest.errors.BadRequestAlertException; +import com.baeldung.jhipster6.web.rest.errors.EmailAlreadyUsedException; +import com.baeldung.jhipster6.web.rest.errors.LoginAlreadyUsedException; +import com.baeldung.jhipster6.web.rest.util.HeaderUtil; +import com.baeldung.jhipster6.web.rest.util.PaginationUtil; import io.github.jhipster.web.util.ResponseUtil; import org.slf4j.Logger; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/BadRequestAlertException.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/BadRequestAlertException.java similarity index 96% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/BadRequestAlertException.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/BadRequestAlertException.java index c4c403351a..a2e71a28bf 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/BadRequestAlertException.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/BadRequestAlertException.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.web.rest.errors; +package com.baeldung.jhipster6.web.rest.errors; import org.zalando.problem.AbstractThrowableProblem; import org.zalando.problem.Status; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/CustomParameterizedException.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/CustomParameterizedException.java similarity index 97% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/CustomParameterizedException.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/CustomParameterizedException.java index 8c3df82b83..31add5c588 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/CustomParameterizedException.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/CustomParameterizedException.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.web.rest.errors; +package com.baeldung.jhipster6.web.rest.errors; import org.zalando.problem.AbstractThrowableProblem; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/EmailAlreadyUsedException.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/EmailAlreadyUsedException.java similarity index 86% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/EmailAlreadyUsedException.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/EmailAlreadyUsedException.java index b3dcc0279e..01e358b76c 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/EmailAlreadyUsedException.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/EmailAlreadyUsedException.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.web.rest.errors; +package com.baeldung.jhipster6.web.rest.errors; public class EmailAlreadyUsedException extends BadRequestAlertException { diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/EmailNotFoundException.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/EmailNotFoundException.java similarity index 88% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/EmailNotFoundException.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/EmailNotFoundException.java index b93081cacb..51a7857f32 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/EmailNotFoundException.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/EmailNotFoundException.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.web.rest.errors; +package com.baeldung.jhipster6.web.rest.errors; import org.zalando.problem.AbstractThrowableProblem; import org.zalando.problem.Status; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/ErrorConstants.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/ErrorConstants.java similarity index 96% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/ErrorConstants.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/ErrorConstants.java index 06be9254a9..b6a256dda0 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/ErrorConstants.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/ErrorConstants.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.web.rest.errors; +package com.baeldung.jhipster6.web.rest.errors; import java.net.URI; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/ExceptionTranslator.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/ExceptionTranslator.java similarity index 97% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/ExceptionTranslator.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/ExceptionTranslator.java index 3f7cc6b565..d9e5697c77 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/ExceptionTranslator.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/ExceptionTranslator.java @@ -1,6 +1,6 @@ -package com.baeldung.jhipster5.web.rest.errors; +package com.baeldung.jhipster6.web.rest.errors; -import com.baeldung.jhipster5.web.rest.util.HeaderUtil; +import com.baeldung.jhipster6.web.rest.util.HeaderUtil; import org.springframework.dao.ConcurrencyFailureException; import org.springframework.http.ResponseEntity; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/FieldErrorVM.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/FieldErrorVM.java similarity index 92% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/FieldErrorVM.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/FieldErrorVM.java index 349f548850..7c2504a3fc 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/FieldErrorVM.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/FieldErrorVM.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.web.rest.errors; +package com.baeldung.jhipster6.web.rest.errors; import java.io.Serializable; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/InternalServerErrorException.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/InternalServerErrorException.java similarity index 90% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/InternalServerErrorException.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/InternalServerErrorException.java index 13e128237b..844f315bfd 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/InternalServerErrorException.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/InternalServerErrorException.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.web.rest.errors; +package com.baeldung.jhipster6.web.rest.errors; import org.zalando.problem.AbstractThrowableProblem; import org.zalando.problem.Status; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/InvalidPasswordException.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/InvalidPasswordException.java similarity index 88% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/InvalidPasswordException.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/InvalidPasswordException.java index 6bb91247ff..02d4b4da01 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/InvalidPasswordException.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/InvalidPasswordException.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.web.rest.errors; +package com.baeldung.jhipster6.web.rest.errors; import org.zalando.problem.AbstractThrowableProblem; import org.zalando.problem.Status; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/LoginAlreadyUsedException.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/LoginAlreadyUsedException.java similarity index 85% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/LoginAlreadyUsedException.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/LoginAlreadyUsedException.java index 987a94193d..fabd4d153d 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/LoginAlreadyUsedException.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/LoginAlreadyUsedException.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.web.rest.errors; +package com.baeldung.jhipster6.web.rest.errors; public class LoginAlreadyUsedException extends BadRequestAlertException { diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/package-info.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/package-info.java similarity index 75% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/package-info.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/package-info.java index 7f57af4429..b791df1268 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/package-info.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/errors/package-info.java @@ -3,4 +3,4 @@ * * More information on https://github.com/zalando/problem-spring-web */ -package com.baeldung.jhipster5.web.rest.errors; +package com.baeldung.jhipster6.web.rest.errors; diff --git a/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/package-info.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/package-info.java new file mode 100644 index 0000000000..f5d106c277 --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/package-info.java @@ -0,0 +1,4 @@ +/** + * Spring MVC REST controllers. + */ +package com.baeldung.jhipster6.web.rest; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/util/HeaderUtil.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/util/HeaderUtil.java similarity index 97% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/util/HeaderUtil.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/util/HeaderUtil.java index 91fdd68261..8546b97956 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/util/HeaderUtil.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/util/HeaderUtil.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.web.rest.util; +package com.baeldung.jhipster6.web.rest.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/util/PaginationUtil.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/util/PaginationUtil.java similarity index 97% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/util/PaginationUtil.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/util/PaginationUtil.java index 9928dbe171..7c28d93486 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/util/PaginationUtil.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/util/PaginationUtil.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.web.rest.util; +package com.baeldung.jhipster6.web.rest.util; import org.springframework.data.domain.Page; import org.springframework.http.HttpHeaders; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/KeyAndPasswordVM.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/vm/KeyAndPasswordVM.java similarity index 91% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/KeyAndPasswordVM.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/vm/KeyAndPasswordVM.java index 840fa02cfc..b2b1f91b0a 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/KeyAndPasswordVM.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/vm/KeyAndPasswordVM.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.web.rest.vm; +package com.baeldung.jhipster6.web.rest.vm; /** * View Model object for storing the user's key and password. diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/LoggerVM.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/vm/LoggerVM.java similarity index 95% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/LoggerVM.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/vm/LoggerVM.java index 952e7df298..d7ca167edf 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/LoggerVM.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/vm/LoggerVM.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.web.rest.vm; +package com.baeldung.jhipster6.web.rest.vm; import ch.qos.logback.classic.Logger; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/LoginVM.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/vm/LoginVM.java similarity index 96% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/LoginVM.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/vm/LoginVM.java index 8fc119ab69..40ede22b3a 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/LoginVM.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/vm/LoginVM.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.web.rest.vm; +package com.baeldung.jhipster6.web.rest.vm; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/ManagedUserVM.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/vm/ManagedUserVM.java similarity index 88% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/ManagedUserVM.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/vm/ManagedUserVM.java index 314577c456..2746ca6de0 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/ManagedUserVM.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/vm/ManagedUserVM.java @@ -1,6 +1,6 @@ -package com.baeldung.jhipster5.web.rest.vm; +package com.baeldung.jhipster6.web.rest.vm; -import com.baeldung.jhipster5.service.dto.UserDTO; +import com.baeldung.jhipster6.service.dto.UserDTO; import javax.validation.constraints.Size; /** diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/package-info.java b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/vm/package-info.java similarity index 57% rename from jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/package-info.java rename to jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/vm/package-info.java index ff58799037..af0defc392 100644 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/package-info.java +++ b/jhipster-6/bookstore-monolith/src/main/java/com/baeldung/jhipster6/web/rest/vm/package-info.java @@ -1,4 +1,4 @@ /** * View Models used by Spring MVC REST controllers. */ -package com.baeldung.jhipster5.web.rest.vm; +package com.baeldung.jhipster6.web.rest.vm; diff --git a/jhipster-5/bookstore-monolith/src/main/jib/entrypoint.sh b/jhipster-6/bookstore-monolith/src/main/jib/entrypoint.sh similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/jib/entrypoint.sh rename to jhipster-6/bookstore-monolith/src/main/jib/entrypoint.sh diff --git a/jhipster-5/bookstore-monolith/src/main/resources/.h2.server.properties b/jhipster-6/bookstore-monolith/src/main/resources/.h2.server.properties similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/resources/.h2.server.properties rename to jhipster-6/bookstore-monolith/src/main/resources/.h2.server.properties diff --git a/jhipster-5/bookstore-monolith/src/main/resources/banner.txt b/jhipster-6/bookstore-monolith/src/main/resources/banner.txt similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/resources/banner.txt rename to jhipster-6/bookstore-monolith/src/main/resources/banner.txt diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/application-dev.yml b/jhipster-6/bookstore-monolith/src/main/resources/config/application-dev.yml similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/resources/config/application-dev.yml rename to jhipster-6/bookstore-monolith/src/main/resources/config/application-dev.yml diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/application-prod.yml b/jhipster-6/bookstore-monolith/src/main/resources/config/application-prod.yml similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/resources/config/application-prod.yml rename to jhipster-6/bookstore-monolith/src/main/resources/config/application-prod.yml diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/application-tls.yml b/jhipster-6/bookstore-monolith/src/main/resources/config/application-tls.yml similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/resources/config/application-tls.yml rename to jhipster-6/bookstore-monolith/src/main/resources/config/application-tls.yml diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/application.yml b/jhipster-6/bookstore-monolith/src/main/resources/config/application.yml similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/resources/config/application.yml rename to jhipster-6/bookstore-monolith/src/main/resources/config/application.yml diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/authorities.csv b/jhipster-6/bookstore-monolith/src/main/resources/config/liquibase/authorities.csv similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/authorities.csv rename to jhipster-6/bookstore-monolith/src/main/resources/config/liquibase/authorities.csv diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml b/jhipster-6/bookstore-monolith/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml rename to jhipster-6/bookstore-monolith/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/changelog/20190319124041_added_entity_Book.xml b/jhipster-6/bookstore-monolith/src/main/resources/config/liquibase/changelog/20190319124041_added_entity_Book.xml similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/changelog/20190319124041_added_entity_Book.xml rename to jhipster-6/bookstore-monolith/src/main/resources/config/liquibase/changelog/20190319124041_added_entity_Book.xml diff --git a/jhipster-6/bookstore-monolith/src/main/resources/config/liquibase/data/authority.csv b/jhipster-6/bookstore-monolith/src/main/resources/config/liquibase/data/authority.csv new file mode 100644 index 0000000000..af5c6dfa18 --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/main/resources/config/liquibase/data/authority.csv @@ -0,0 +1,3 @@ +name +ROLE_ADMIN +ROLE_USER diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/users.csv b/jhipster-6/bookstore-monolith/src/main/resources/config/liquibase/data/user.csv similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/users.csv rename to jhipster-6/bookstore-monolith/src/main/resources/config/liquibase/data/user.csv diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/users_authorities.csv b/jhipster-6/bookstore-monolith/src/main/resources/config/liquibase/data/user_authority.csv similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/users_authorities.csv rename to jhipster-6/bookstore-monolith/src/main/resources/config/liquibase/data/user_authority.csv diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/master.xml b/jhipster-6/bookstore-monolith/src/main/resources/config/liquibase/master.xml similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/master.xml rename to jhipster-6/bookstore-monolith/src/main/resources/config/liquibase/master.xml diff --git a/jhipster-6/bookstore-monolith/src/main/resources/config/liquibase/users.csv b/jhipster-6/bookstore-monolith/src/main/resources/config/liquibase/users.csv new file mode 100644 index 0000000000..b25922b699 --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/main/resources/config/liquibase/users.csv @@ -0,0 +1,5 @@ +id;login;password_hash;first_name;last_name;email;image_url;activated;lang_key;created_by;last_modified_by +1;system;$2a$10$mE.qmcV0mFU5NcKh73TZx.z4ueI/.bDWbj0T1BYyqP481kGGarKLG;System;System;system@localhost;;true;en;system;system +2;anonymoususer;$2a$10$j8S5d7Sr7.8VTOYNviDPOeWX8KcYILUVJBsYV83Y5NtECayypx9lO;Anonymous;User;anonymous@localhost;;true;en;system;system +3;admin;$2a$10$gSAhZrxMllrbgj/kkK9UceBPpChGWJA7SYIb1Mqo.n5aNLq1/oRrC;Administrator;Administrator;admin@localhost;;true;en;system;system +4;user;$2a$10$VEjxo0jq2YG9Rbk2HmX9S.k1uZBGYUHdUcid3g/vfiEl7lwWgOH/K;User;User;user@localhost;;true;en;system;system diff --git a/jhipster-6/bookstore-monolith/src/main/resources/config/liquibase/users_authorities.csv b/jhipster-6/bookstore-monolith/src/main/resources/config/liquibase/users_authorities.csv new file mode 100644 index 0000000000..06c5feeeea --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/main/resources/config/liquibase/users_authorities.csv @@ -0,0 +1,6 @@ +user_id;authority_name +1;ROLE_ADMIN +1;ROLE_USER +3;ROLE_ADMIN +3;ROLE_USER +4;ROLE_USER diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/tls/keystore.p12 b/jhipster-6/bookstore-monolith/src/main/resources/config/tls/keystore.p12 similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/resources/config/tls/keystore.p12 rename to jhipster-6/bookstore-monolith/src/main/resources/config/tls/keystore.p12 diff --git a/jhipster-5/bookstore-monolith/src/main/resources/i18n/messages.properties b/jhipster-6/bookstore-monolith/src/main/resources/i18n/messages.properties similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/resources/i18n/messages.properties rename to jhipster-6/bookstore-monolith/src/main/resources/i18n/messages.properties diff --git a/jhipster-5/bookstore-monolith/src/main/resources/logback-spring.xml b/jhipster-6/bookstore-monolith/src/main/resources/logback-spring.xml similarity index 98% rename from jhipster-5/bookstore-monolith/src/main/resources/logback-spring.xml rename to jhipster-6/bookstore-monolith/src/main/resources/logback-spring.xml index 4aa548af35..b0e2d9aa95 100644 --- a/jhipster-5/bookstore-monolith/src/main/resources/logback-spring.xml +++ b/jhipster-6/bookstore-monolith/src/main/resources/logback-spring.xml @@ -30,9 +30,9 @@ - + - + diff --git a/jhipster-5/bookstore-monolith/src/main/resources/templates/error.html b/jhipster-6/bookstore-monolith/src/main/resources/templates/error.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/resources/templates/error.html rename to jhipster-6/bookstore-monolith/src/main/resources/templates/error.html diff --git a/jhipster-5/bookstore-monolith/src/main/resources/templates/mail/activationEmail.html b/jhipster-6/bookstore-monolith/src/main/resources/templates/mail/activationEmail.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/resources/templates/mail/activationEmail.html rename to jhipster-6/bookstore-monolith/src/main/resources/templates/mail/activationEmail.html diff --git a/jhipster-5/bookstore-monolith/src/main/resources/templates/mail/creationEmail.html b/jhipster-6/bookstore-monolith/src/main/resources/templates/mail/creationEmail.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/resources/templates/mail/creationEmail.html rename to jhipster-6/bookstore-monolith/src/main/resources/templates/mail/creationEmail.html diff --git a/jhipster-5/bookstore-monolith/src/main/resources/templates/mail/passwordResetEmail.html b/jhipster-6/bookstore-monolith/src/main/resources/templates/mail/passwordResetEmail.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/resources/templates/mail/passwordResetEmail.html rename to jhipster-6/bookstore-monolith/src/main/resources/templates/mail/passwordResetEmail.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/404.html b/jhipster-6/bookstore-monolith/src/main/webapp/404.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/404.html rename to jhipster-6/bookstore-monolith/src/main/webapp/404.html diff --git a/jhipster-6/bookstore-monolith/src/main/webapp/WEB-INF/web.xml b/jhipster-6/bookstore-monolith/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..f1611b515a --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,13 @@ + + + + + html + text/html;charset=utf-8 + + + diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/account.module.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/account.module.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/account.module.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/account.module.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/account.route.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/account.route.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/account.route.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/account.route.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/activate/activate.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/activate/activate.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/activate/activate.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/activate/activate.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.route.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/activate/activate.route.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.route.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/activate/activate.route.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.service.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/activate/activate.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.service.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/activate/activate.service.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/index.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/index.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/index.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/index.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password-strength-bar.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/password/password-strength-bar.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password-strength-bar.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/password/password-strength-bar.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password-strength-bar.scss b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/password/password-strength-bar.scss similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password-strength-bar.scss rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/password/password-strength-bar.scss diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/password/password.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/password/password.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/password/password.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/password/password.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.route.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/password/password.route.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.route.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/password/password.route.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.service.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/password/password.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.service.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/password/password.service.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/register/register.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/register/register.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/register/register.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/register/register.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.route.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/register/register.route.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.route.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/register/register.route.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.service.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/register/register.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.service.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/register/register.service.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/settings/settings.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/settings/settings.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/settings/settings.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/settings/settings.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/settings/settings.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/settings/settings.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/settings/settings.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/settings/settings.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/settings/settings.route.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/account/settings/settings.route.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/account/settings/settings.route.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/account/settings/settings.route.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/admin.module.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/admin.module.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/admin.module.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/admin.module.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/admin.route.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/admin.route.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/admin.route.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/admin.route.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audit-data.model.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/audits/audit-data.model.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audit-data.model.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/audits/audit-data.model.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audit.model.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/audits/audit.model.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audit.model.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/audits/audit.model.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/audits/audits.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/audits/audits.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/audits/audits.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/audits/audits.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.route.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/audits/audits.route.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.route.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/audits/audits.route.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.service.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/audits/audits.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.service.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/audits/audits.service.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.route.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.route.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.route.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.route.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.service.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.service.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.service.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/docs/docs.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/docs/docs.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/docs/docs.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/docs/docs.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/docs/docs.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/docs/docs.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/docs/docs.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/docs/docs.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/docs/docs.route.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/docs/docs.route.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/docs/docs.route.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/docs/docs.route.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health-modal.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/health/health-modal.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health-modal.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/health/health-modal.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health-modal.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/health/health-modal.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health-modal.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/health/health-modal.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/health/health.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/health/health.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/health/health.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/health/health.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.route.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/health/health.route.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.route.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/health/health.route.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.service.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/health/health.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.service.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/health/health.service.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/index.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/index.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/index.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/index.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/log.model.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/logs/log.model.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/log.model.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/logs/log.model.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/logs/logs.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/logs/logs.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/logs/logs.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/logs/logs.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.route.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/logs/logs.route.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.route.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/logs/logs.route.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.service.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/logs/logs.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.service.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/logs/logs.service.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.route.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.route.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.route.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.route.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.service.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.service.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.service.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-detail.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-detail.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-detail.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-detail.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-detail.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-detail.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-detail.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-detail.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-update.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-update.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-update.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-update.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-update.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-update.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-update.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-update.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.route.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.route.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.route.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.route.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/app-routing.module.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/app-routing.module.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/app-routing.module.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/app-routing.module.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/app.constants.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/app.constants.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/app.constants.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/app.constants.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/app.main.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/app.main.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/app.main.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/app.main.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/app.module.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/app.module.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/app.module.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/app.module.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/config/prod.config.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/blocks/config/prod.config.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/config/prod.config.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/blocks/config/prod.config.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/config/uib-pagination.config.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/blocks/config/uib-pagination.config.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/config/uib-pagination.config.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/blocks/config/uib-pagination.config.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/auth-expired.interceptor.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/blocks/interceptor/auth-expired.interceptor.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/auth-expired.interceptor.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/blocks/interceptor/auth-expired.interceptor.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/auth.interceptor.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/blocks/interceptor/auth.interceptor.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/auth.interceptor.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/blocks/interceptor/auth.interceptor.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/account.service.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/core/auth/account.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/account.service.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/core/auth/account.service.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/auth-jwt.service.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/core/auth/auth-jwt.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/auth-jwt.service.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/core/auth/auth-jwt.service.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/csrf.service.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/core/auth/csrf.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/csrf.service.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/core/auth/csrf.service.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/state-storage.service.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/core/auth/state-storage.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/state-storage.service.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/core/auth/state-storage.service.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/user-route-access-service.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/core/auth/user-route-access-service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/user-route-access-service.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/core/auth/user-route-access-service.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/core.module.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/core/core.module.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/core/core.module.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/core/core.module.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/index.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/core/index.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/core/index.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/core/index.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/login/login-modal.service.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/core/login/login-modal.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/core/login/login-modal.service.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/core/login/login-modal.service.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/login/login.service.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/core/login/login.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/core/login/login.service.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/core/login/login.service.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/user/account.model.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/core/user/account.model.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/core/user/account.model.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/core/user/account.model.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/user/user.model.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/core/user/user.model.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/core/user/user.model.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/core/user/user.model.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/user/user.service.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/core/user/user.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/core/user/user.service.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/core/user/user.service.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-delete-dialog.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book-delete-dialog.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-delete-dialog.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book-delete-dialog.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-delete-dialog.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book-delete-dialog.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-delete-dialog.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book-delete-dialog.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-detail.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book-detail.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-detail.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book-detail.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-detail.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book-detail.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-detail.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book-detail.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-update.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book-update.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-update.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book-update.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-update.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book-update.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-update.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book-update.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.module.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book.module.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.module.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book.module.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.route.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book.route.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.route.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book.route.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.service.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.service.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/book.service.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/index.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/index.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/index.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/entities/book/index.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/entity.module.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/entities/entity.module.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/entities/entity.module.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/entities/entity.module.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/home/home.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/home/home.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/home/home.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/home/home.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.module.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/home/home.module.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.module.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/home/home.module.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.route.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/home/home.route.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.route.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/home/home.route.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.scss b/jhipster-6/bookstore-monolith/src/main/webapp/app/home/home.scss similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.scss rename to jhipster-6/bookstore-monolith/src/main/webapp/app/home/home.scss diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/home/index.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/home/index.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/home/index.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/home/index.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/error/error.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/error/error.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/error/error.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/error/error.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/error/error.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/error/error.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/error/error.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/error/error.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/error/error.route.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/error/error.route.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/error/error.route.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/error/error.route.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/footer/footer.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/footer/footer.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/footer/footer.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/footer/footer.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/footer/footer.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/footer/footer.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/footer/footer.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/footer/footer.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/index.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/index.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/index.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/index.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/main/main.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/main/main.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/main/main.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/main/main.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/main/main.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/main/main.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/main/main.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/main/main.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.route.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.route.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.route.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.route.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.scss b/jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.scss similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.scss rename to jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.scss diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/page-ribbon.scss b/jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/profiles/page-ribbon.scss similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/page-ribbon.scss rename to jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/profiles/page-ribbon.scss diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/profile-info.model.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/profiles/profile-info.model.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/profile-info.model.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/profiles/profile-info.model.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/profile.service.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/profiles/profile.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/profile.service.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/layouts/profiles/profile.service.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/polyfills.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/polyfills.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/polyfills.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/polyfills.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/alert/alert-error.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/shared/alert/alert-error.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/shared/alert/alert-error.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/shared/alert/alert-error.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/alert/alert.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/shared/alert/alert.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/shared/alert/alert.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/shared/alert/alert.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/auth/has-any-authority.directive.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/shared/auth/has-any-authority.directive.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/shared/auth/has-any-authority.directive.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/shared/auth/has-any-authority.directive.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/constants/error.constants.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/shared/constants/error.constants.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/shared/constants/error.constants.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/shared/constants/error.constants.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/constants/input.constants.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/shared/constants/input.constants.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/shared/constants/input.constants.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/shared/constants/input.constants.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/constants/pagination.constants.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/shared/constants/pagination.constants.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/shared/constants/pagination.constants.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/shared/constants/pagination.constants.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/index.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/shared/index.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/shared/index.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/shared/index.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/login/login.component.html b/jhipster-6/bookstore-monolith/src/main/webapp/app/shared/login/login.component.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/shared/login/login.component.html rename to jhipster-6/bookstore-monolith/src/main/webapp/app/shared/login/login.component.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/login/login.component.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/shared/login/login.component.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/shared/login/login.component.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/shared/login/login.component.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/model/book.model.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/shared/model/book.model.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/shared/model/book.model.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/shared/model/book.model.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/shared-common.module.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/shared/shared-common.module.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/shared/shared-common.module.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/shared/shared-common.module.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/shared-libs.module.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/shared/shared-libs.module.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/shared/shared-libs.module.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/shared/shared-libs.module.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/shared.module.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/shared/shared.module.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/shared/shared.module.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/shared/shared.module.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/util/datepicker-adapter.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/shared/util/datepicker-adapter.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/shared/util/datepicker-adapter.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/shared/util/datepicker-adapter.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/util/request-util.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/shared/util/request-util.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/shared/util/request-util.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/shared/util/request-util.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/vendor.ts b/jhipster-6/bookstore-monolith/src/main/webapp/app/vendor.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/app/vendor.ts rename to jhipster-6/bookstore-monolith/src/main/webapp/app/vendor.ts diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/css/loading.css b/jhipster-6/bookstore-monolith/src/main/webapp/content/css/loading.css similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/css/loading.css rename to jhipster-6/bookstore-monolith/src/main/webapp/content/css/loading.css diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0.svg b/jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0.svg old mode 100755 new mode 100644 similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0.svg rename to jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0.svg diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-192.png b/jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-192.png similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-192.png rename to jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-192.png diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-256.png b/jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-256.png similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-256.png rename to jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-256.png diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-384.png b/jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-384.png similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-384.png rename to jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-384.png diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-512.png b/jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-512.png similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-512.png rename to jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-512.png diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1.svg b/jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1.svg old mode 100755 new mode 100644 similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1.svg rename to jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1.svg diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-192.png b/jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-192.png similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-192.png rename to jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-192.png diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-256.png b/jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-256.png similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-256.png rename to jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-256.png diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-384.png b/jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-384.png similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-384.png rename to jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-384.png diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-512.png b/jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-512.png similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-512.png rename to jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-512.png diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2.svg b/jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2.svg old mode 100755 new mode 100644 similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2.svg rename to jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2.svg diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-192.png b/jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-192.png similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-192.png rename to jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-192.png diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-256.png b/jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-256.png similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-256.png rename to jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-256.png diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-384.png b/jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-384.png similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-384.png rename to jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-384.png diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-512.png b/jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-512.png similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-512.png rename to jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-512.png diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3.svg b/jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3.svg old mode 100755 new mode 100644 similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3.svg rename to jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3.svg diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-192.png b/jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-192.png similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-192.png rename to jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-192.png diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-256.png b/jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-256.png similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-256.png rename to jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-256.png diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-384.png b/jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-384.png similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-384.png rename to jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-384.png diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-512.png b/jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-512.png similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-512.png rename to jhipster-6/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-512.png diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/logo-jhipster.png b/jhipster-6/bookstore-monolith/src/main/webapp/content/images/logo-jhipster.png old mode 100755 new mode 100644 similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/images/logo-jhipster.png rename to jhipster-6/bookstore-monolith/src/main/webapp/content/images/logo-jhipster.png diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/scss/_bootstrap-variables.scss b/jhipster-6/bookstore-monolith/src/main/webapp/content/scss/_bootstrap-variables.scss similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/scss/_bootstrap-variables.scss rename to jhipster-6/bookstore-monolith/src/main/webapp/content/scss/_bootstrap-variables.scss diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/scss/global.scss b/jhipster-6/bookstore-monolith/src/main/webapp/content/scss/global.scss similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/scss/global.scss rename to jhipster-6/bookstore-monolith/src/main/webapp/content/scss/global.scss diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/scss/vendor.scss b/jhipster-6/bookstore-monolith/src/main/webapp/content/scss/vendor.scss similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/content/scss/vendor.scss rename to jhipster-6/bookstore-monolith/src/main/webapp/content/scss/vendor.scss diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/favicon.ico b/jhipster-6/bookstore-monolith/src/main/webapp/favicon.ico old mode 100755 new mode 100644 similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/favicon.ico rename to jhipster-6/bookstore-monolith/src/main/webapp/favicon.ico diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/index.html b/jhipster-6/bookstore-monolith/src/main/webapp/index.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/index.html rename to jhipster-6/bookstore-monolith/src/main/webapp/index.html diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/manifest.webapp b/jhipster-6/bookstore-monolith/src/main/webapp/manifest.webapp similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/manifest.webapp rename to jhipster-6/bookstore-monolith/src/main/webapp/manifest.webapp diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/robots.txt b/jhipster-6/bookstore-monolith/src/main/webapp/robots.txt similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/robots.txt rename to jhipster-6/bookstore-monolith/src/main/webapp/robots.txt diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/swagger-ui/index.html b/jhipster-6/bookstore-monolith/src/main/webapp/swagger-ui/index.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/main/webapp/swagger-ui/index.html rename to jhipster-6/bookstore-monolith/src/main/webapp/swagger-ui/index.html diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/config/WebConfigurerUnitTest.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/config/WebConfigurerUnitTest.java similarity index 73% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/config/WebConfigurerUnitTest.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/config/WebConfigurerUnitTest.java index 764d6b3587..44452caac9 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/config/WebConfigurerUnitTest.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/config/WebConfigurerUnitTest.java @@ -1,26 +1,19 @@ -package com.baeldung.jhipster5.config; +package com.baeldung.jhipster6.config; import io.github.jhipster.config.JHipsterConstants; import io.github.jhipster.config.JHipsterProperties; import io.github.jhipster.web.filter.CachingHttpHeadersFilter; -import io.undertow.Undertow; -import io.undertow.Undertow.Builder; -import io.undertow.UndertowOptions; -import org.apache.commons.io.FilenameUtils; - import org.h2.server.web.WebServlet; -import org.junit.Before; -import org.junit.Test; -import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.http.HttpHeaders; import org.springframework.mock.env.MockEnvironment; import org.springframework.mock.web.MockServletContext; -import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.xnio.OptionMap; import javax.servlet.*; + import java.util.*; import static org.assertj.core.api.Assertions.assertThat; @@ -33,9 +26,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** - * Unit tests for the WebConfigurer class. - * - * @see WebConfigurer + * Unit tests for the {@link WebConfigurer} class. */ public class WebConfigurerUnitTest { @@ -47,7 +38,7 @@ public class WebConfigurerUnitTest { private JHipsterProperties props; - @Before + @BeforeEach public void setup() { servletContext = spy(new MockServletContext()); doReturn(mock(FilterRegistration.Dynamic.class)) @@ -78,35 +69,19 @@ public class WebConfigurerUnitTest { verify(servletContext, never()).addFilter(eq("cachingHttpHeadersFilter"), any(CachingHttpHeadersFilter.class)); verify(servletContext).addServlet(eq("H2Console"), any(WebServlet.class)); } - - @Test - public void testCustomizeServletContainer() { - env.setActiveProfiles(JHipsterConstants.SPRING_PROFILE_PRODUCTION); - UndertowServletWebServerFactory container = new UndertowServletWebServerFactory(); - webConfigurer.customize(container); - assertThat(container.getMimeMappings().get("abs")).isEqualTo("audio/x-mpeg"); - assertThat(container.getMimeMappings().get("html")).isEqualTo("text/html;charset=utf-8"); - assertThat(container.getMimeMappings().get("json")).isEqualTo("text/html;charset=utf-8"); - if (container.getDocumentRoot() != null) { - assertThat(container.getDocumentRoot().getPath()).isEqualTo(FilenameUtils.separatorsToSystem("target/www")); - } - - Builder builder = Undertow.builder(); - container.getBuilderCustomizers().forEach(c -> c.customize(builder)); - OptionMap.Builder serverOptions = (OptionMap.Builder) ReflectionTestUtils.getField(builder, "serverOptions"); - assertThat(serverOptions.getMap().get(UndertowOptions.ENABLE_HTTP2)).isNull(); - } - - @Test - public void testUndertowHttp2Enabled() { - props.getHttp().setVersion(JHipsterProperties.Http.Version.V_2_0); - UndertowServletWebServerFactory container = new UndertowServletWebServerFactory(); - webConfigurer.customize(container); - Builder builder = Undertow.builder(); - container.getBuilderCustomizers().forEach(c -> c.customize(builder)); - OptionMap.Builder serverOptions = (OptionMap.Builder) ReflectionTestUtils.getField(builder, "serverOptions"); - assertThat(serverOptions.getMap().get(UndertowOptions.ENABLE_HTTP2)).isTrue(); - } +// +// @Test +// public void testCustomizeServletContainer() { +// env.setActiveProfiles(JHipsterConstants.SPRING_PROFILE_PRODUCTION); +// UndertowServletWebServerFactory container = new UndertowServletWebServerFactory(); +// webConfigurer.customize(container); +// assertThat(container.getMimeMappings().get("abs")).isEqualTo("audio/x-mpeg"); +// assertThat(container.getMimeMappings().get("html")).isEqualTo("text/html;charset=utf-8"); +// assertThat(container.getMimeMappings().get("json")).isEqualTo("text/html;charset=utf-8"); +// if (container.getDocumentRoot() != null) { +// assertThat(container.getDocumentRoot()).isEqualTo(new File("target/classes/static/")); +// } +// } @Test public void testCorsFilterOnApiPath() throws Exception { diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/config/WebConfigurerUnitTestController.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/config/WebConfigurerUnitTestController.java similarity index 89% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/config/WebConfigurerUnitTestController.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/config/WebConfigurerUnitTestController.java index ee72e1c80e..271d18278e 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/config/WebConfigurerUnitTestController.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/config/WebConfigurerUnitTestController.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.config; +package com.baeldung.jhipster6.config; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/config/timezone/HibernateTimeZoneIT.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/config/timezone/HibernateTimeZoneIT.java new file mode 100644 index 0000000000..2e506edab4 --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/config/timezone/HibernateTimeZoneIT.java @@ -0,0 +1,174 @@ +package com.baeldung.jhipster6.config.timezone; + +import com.baeldung.jhipster6.BookstoreApp; +import com.baeldung.jhipster6.repository.timezone.DateTimeWrapper; +import com.baeldung.jhipster6.repository.timezone.DateTimeWrapperRepository; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.support.rowset.SqlRowSet; +import org.springframework.transaction.annotation.Transactional; + +import java.time.*; +import java.time.format.DateTimeFormatter; + +import static java.lang.String.format; +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Integration tests for the UTC Hibernate configuration. + */ +@SpringBootTest(classes = BookstoreApp.class) +public class HibernateTimeZoneIT { + + @Autowired + private DateTimeWrapperRepository dateTimeWrapperRepository; + @Autowired + private JdbcTemplate jdbcTemplate; + + private DateTimeWrapper dateTimeWrapper; + private DateTimeFormatter dateTimeFormatter; + private DateTimeFormatter timeFormatter; + private DateTimeFormatter dateFormatter; + + @BeforeEach + public void setup() { + dateTimeWrapper = new DateTimeWrapper(); + dateTimeWrapper.setInstant(Instant.parse("2014-11-12T05:50:00.0Z")); + dateTimeWrapper.setLocalDateTime(LocalDateTime.parse("2014-11-12T07:50:00.0")); + dateTimeWrapper.setOffsetDateTime(OffsetDateTime.parse("2011-12-14T08:30:00.0Z")); + dateTimeWrapper.setZonedDateTime(ZonedDateTime.parse("2011-12-14T08:30:00.0Z")); + dateTimeWrapper.setLocalTime(LocalTime.parse("14:30:00")); + dateTimeWrapper.setOffsetTime(OffsetTime.parse("14:30:00+02:00")); + dateTimeWrapper.setLocalDate(LocalDate.parse("2016-09-10")); + + dateTimeFormatter = DateTimeFormatter + .ofPattern("yyyy-MM-dd HH:mm:ss.S") + .withZone(ZoneId.of("UTC")); + + timeFormatter = DateTimeFormatter + .ofPattern("HH:mm:ss") + .withZone(ZoneId.of("UTC")); + + dateFormatter = DateTimeFormatter + .ofPattern("yyyy-MM-dd"); + } + + @Test + @Transactional + public void storeInstantWithUtcConfigShouldBeStoredOnGMTTimeZone() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("instant", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeFormatter.format(dateTimeWrapper.getInstant()); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + public void storeLocalDateTimeWithUtcConfigShouldBeStoredOnGMTTimeZone() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("local_date_time", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper + .getLocalDateTime() + .atZone(ZoneId.systemDefault()) + .format(dateTimeFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + public void storeOffsetDateTimeWithUtcConfigShouldBeStoredOnGMTTimeZone() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("offset_date_time", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper + .getOffsetDateTime() + .format(dateTimeFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + public void storeZoneDateTimeWithUtcConfigShouldBeStoredOnGMTTimeZone() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("zoned_date_time", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper + .getZonedDateTime() + .format(dateTimeFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + public void storeLocalTimeWithUtcConfigShouldBeStoredOnGMTTimeZoneAccordingToHis1stJan1970Value() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("local_time", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper + .getLocalTime() + .atDate(LocalDate.of(1970, Month.JANUARY, 1)) + .atZone(ZoneId.systemDefault()) + .format(timeFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + public void storeOffsetTimeWithUtcConfigShouldBeStoredOnGMTTimeZoneAccordingToHis1stJan1970Value() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("offset_time", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper + .getOffsetTime() + .toLocalTime() + .atDate(LocalDate.of(1970, Month.JANUARY, 1)) + .atZone(ZoneId.systemDefault()) + .format(timeFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + public void storeLocalDateWithUtcConfigShouldBeStoredWithoutTransformation() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("local_date", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper + .getLocalDate() + .format(dateFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + private String generateSqlRequest(String fieldName, long id) { + return format("SELECT %s FROM jhi_date_time_wrapper where id=%d", fieldName, id); + } + + private void assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(SqlRowSet sqlRowSet, String expectedValue) { + while (sqlRowSet.next()) { + String dbValue = sqlRowSet.getString(1); + + assertThat(dbValue).isNotNull(); + assertThat(dbValue).isEqualTo(expectedValue); + } + } +} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/config/timezone/HibernateTimeZoneIntegrationTest.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/config/timezone/HibernateTimeZoneIntegrationTest.java similarity index 96% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/config/timezone/HibernateTimeZoneIntegrationTest.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/config/timezone/HibernateTimeZoneIntegrationTest.java index fba77e037e..f0bf619ae4 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/config/timezone/HibernateTimeZoneIntegrationTest.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/config/timezone/HibernateTimeZoneIntegrationTest.java @@ -1,8 +1,9 @@ -package com.baeldung.jhipster5.config.timezone; +package com.baeldung.jhipster6.config.timezone; + +import com.baeldung.jhipster6.BookstoreApp; +import com.baeldung.jhipster6.repository.timezone.DateTimeWrapper; +import com.baeldung.jhipster6.repository.timezone.DateTimeWrapperRepository; -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.repository.timezone.DateTimeWrapper; -import com.baeldung.jhipster5.repository.timezone.DateTimeWrapperRepository; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/repository/CustomAuditEventRepositoryIT.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/repository/CustomAuditEventRepositoryIT.java new file mode 100644 index 0000000000..a1f27a21da --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/repository/CustomAuditEventRepositoryIT.java @@ -0,0 +1,163 @@ +package com.baeldung.jhipster6.repository; + +import com.baeldung.jhipster6.BookstoreApp; +import com.baeldung.jhipster6.config.Constants; +import com.baeldung.jhipster6.config.audit.AuditEventConverter; +import com.baeldung.jhipster6.domain.PersistentAuditEvent; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.actuate.audit.AuditEvent; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.security.web.authentication.WebAuthenticationDetails; +import org.springframework.transaction.annotation.Transactional; + +import javax.servlet.http.HttpSession; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Integration tests for {@link CustomAuditEventRepository}. + */ +@SpringBootTest(classes = BookstoreApp.class) +@Transactional +public class CustomAuditEventRepositoryIT { + + @Autowired + private PersistenceAuditEventRepository persistenceAuditEventRepository; + + @Autowired + private AuditEventConverter auditEventConverter; + + private CustomAuditEventRepository customAuditEventRepository; + + private PersistentAuditEvent testUserEvent; + + private PersistentAuditEvent testOtherUserEvent; + + private PersistentAuditEvent testOldUserEvent; + + @BeforeEach + public void setup() { + customAuditEventRepository = new CustomAuditEventRepository(persistenceAuditEventRepository, auditEventConverter); + persistenceAuditEventRepository.deleteAll(); + Instant oneHourAgo = Instant.now().minusSeconds(3600); + + testUserEvent = new PersistentAuditEvent(); + testUserEvent.setPrincipal("test-user"); + testUserEvent.setAuditEventType("test-type"); + testUserEvent.setAuditEventDate(oneHourAgo); + Map data = new HashMap<>(); + data.put("test-key", "test-value"); + testUserEvent.setData(data); + + testOldUserEvent = new PersistentAuditEvent(); + testOldUserEvent.setPrincipal("test-user"); + testOldUserEvent.setAuditEventType("test-type"); + testOldUserEvent.setAuditEventDate(oneHourAgo.minusSeconds(10000)); + + testOtherUserEvent = new PersistentAuditEvent(); + testOtherUserEvent.setPrincipal("other-test-user"); + testOtherUserEvent.setAuditEventType("test-type"); + testOtherUserEvent.setAuditEventDate(oneHourAgo); + } + + @Test + public void addAuditEvent() { + Map data = new HashMap<>(); + data.put("test-key", "test-value"); + AuditEvent event = new AuditEvent("test-user", "test-type", data); + customAuditEventRepository.add(event); + List persistentAuditEvents = persistenceAuditEventRepository.findAll(); + assertThat(persistentAuditEvents).hasSize(1); + PersistentAuditEvent persistentAuditEvent = persistentAuditEvents.get(0); + assertThat(persistentAuditEvent.getPrincipal()).isEqualTo(event.getPrincipal()); + assertThat(persistentAuditEvent.getAuditEventType()).isEqualTo(event.getType()); + assertThat(persistentAuditEvent.getData()).containsKey("test-key"); + assertThat(persistentAuditEvent.getData().get("test-key")).isEqualTo("test-value"); + assertThat(persistentAuditEvent.getAuditEventDate().truncatedTo(ChronoUnit.MILLIS)) + .isEqualTo(event.getTimestamp().truncatedTo(ChronoUnit.MILLIS)); + } + + @Test + public void addAuditEventTruncateLargeData() { + Map data = new HashMap<>(); + StringBuilder largeData = new StringBuilder(); + for (int i = 0; i < CustomAuditEventRepository.EVENT_DATA_COLUMN_MAX_LENGTH + 10; i++) { + largeData.append("a"); + } + data.put("test-key", largeData); + AuditEvent event = new AuditEvent("test-user", "test-type", data); + customAuditEventRepository.add(event); + List persistentAuditEvents = persistenceAuditEventRepository.findAll(); + assertThat(persistentAuditEvents).hasSize(1); + PersistentAuditEvent persistentAuditEvent = persistentAuditEvents.get(0); + assertThat(persistentAuditEvent.getPrincipal()).isEqualTo(event.getPrincipal()); + assertThat(persistentAuditEvent.getAuditEventType()).isEqualTo(event.getType()); + assertThat(persistentAuditEvent.getData()).containsKey("test-key"); + String actualData = persistentAuditEvent.getData().get("test-key"); + assertThat(actualData.length()).isEqualTo(CustomAuditEventRepository.EVENT_DATA_COLUMN_MAX_LENGTH); + assertThat(actualData).isSubstringOf(largeData); + assertThat(persistentAuditEvent.getAuditEventDate().truncatedTo(ChronoUnit.MILLIS)) + .isEqualTo(event.getTimestamp().truncatedTo(ChronoUnit.MILLIS)); + } + + @Test + public void testAddEventWithWebAuthenticationDetails() { + HttpSession session = new MockHttpSession(null, "test-session-id"); + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setSession(session); + request.setRemoteAddr("1.2.3.4"); + WebAuthenticationDetails details = new WebAuthenticationDetails(request); + Map data = new HashMap<>(); + data.put("test-key", details); + AuditEvent event = new AuditEvent("test-user", "test-type", data); + customAuditEventRepository.add(event); + List persistentAuditEvents = persistenceAuditEventRepository.findAll(); + assertThat(persistentAuditEvents).hasSize(1); + PersistentAuditEvent persistentAuditEvent = persistentAuditEvents.get(0); + assertThat(persistentAuditEvent.getData().get("remoteAddress")).isEqualTo("1.2.3.4"); + assertThat(persistentAuditEvent.getData().get("sessionId")).isEqualTo("test-session-id"); + } + + @Test + public void testAddEventWithNullData() { + Map data = new HashMap<>(); + data.put("test-key", null); + AuditEvent event = new AuditEvent("test-user", "test-type", data); + customAuditEventRepository.add(event); + List persistentAuditEvents = persistenceAuditEventRepository.findAll(); + assertThat(persistentAuditEvents).hasSize(1); + PersistentAuditEvent persistentAuditEvent = persistentAuditEvents.get(0); + assertThat(persistentAuditEvent.getData().get("test-key")).isEqualTo("null"); + } + + @Test + public void addAuditEventWithAnonymousUser() { + Map data = new HashMap<>(); + data.put("test-key", "test-value"); + AuditEvent event = new AuditEvent(Constants.ANONYMOUS_USER, "test-type", data); + customAuditEventRepository.add(event); + List persistentAuditEvents = persistenceAuditEventRepository.findAll(); + assertThat(persistentAuditEvents).hasSize(0); + } + + @Test + public void addAuditEventWithAuthorizationFailureType() { + Map data = new HashMap<>(); + data.put("test-key", "test-value"); + AuditEvent event = new AuditEvent("test-user", "AUTHORIZATION_FAILURE", data); + customAuditEventRepository.add(event); + List persistentAuditEvents = persistenceAuditEventRepository.findAll(); + assertThat(persistentAuditEvents).hasSize(0); + } + +} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/repository/CustomAuditEventRepositoryIntegrationTest.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/repository/CustomAuditEventRepositoryIntegrationTest.java similarity index 93% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/repository/CustomAuditEventRepositoryIntegrationTest.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/repository/CustomAuditEventRepositoryIntegrationTest.java index 948bf43f87..89ed2d4649 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/repository/CustomAuditEventRepositoryIntegrationTest.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/repository/CustomAuditEventRepositoryIntegrationTest.java @@ -1,9 +1,10 @@ -package com.baeldung.jhipster5.repository; +package com.baeldung.jhipster6.repository; + +import com.baeldung.jhipster6.BookstoreApp; +import com.baeldung.jhipster6.config.Constants; +import com.baeldung.jhipster6.config.audit.AuditEventConverter; +import com.baeldung.jhipster6.domain.PersistentAuditEvent; -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.config.Constants; -import com.baeldung.jhipster5.config.audit.AuditEventConverter; -import com.baeldung.jhipster5.domain.PersistentAuditEvent; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -23,7 +24,6 @@ import java.util.List; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; -import static com.baeldung.jhipster5.repository.CustomAuditEventRepository.EVENT_DATA_COLUMN_MAX_LENGTH; /** * Test class for the CustomAuditEventRepository class. @@ -94,7 +94,7 @@ public class CustomAuditEventRepositoryIntegrationTest { public void addAuditEventTruncateLargeData() { Map data = new HashMap<>(); StringBuilder largeData = new StringBuilder(); - for (int i = 0; i < EVENT_DATA_COLUMN_MAX_LENGTH + 10; i++) { + for (int i = 0; i < CustomAuditEventRepository.EVENT_DATA_COLUMN_MAX_LENGTH + 10; i++) { largeData.append("a"); } data.put("test-key", largeData); @@ -107,7 +107,7 @@ public class CustomAuditEventRepositoryIntegrationTest { assertThat(persistentAuditEvent.getAuditEventType()).isEqualTo(event.getType()); assertThat(persistentAuditEvent.getData()).containsKey("test-key"); String actualData = persistentAuditEvent.getData().get("test-key"); - assertThat(actualData.length()).isEqualTo(EVENT_DATA_COLUMN_MAX_LENGTH); + assertThat(actualData.length()).isEqualTo(CustomAuditEventRepository.EVENT_DATA_COLUMN_MAX_LENGTH); assertThat(actualData).isSubstringOf(largeData); assertThat(persistentAuditEvent.getAuditEventDate()).isEqualTo(event.getTimestamp()); } diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/repository/timezone/DateTimeWrapper.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/repository/timezone/DateTimeWrapper.java similarity index 98% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/repository/timezone/DateTimeWrapper.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/repository/timezone/DateTimeWrapper.java index 473a8e782e..0d03a44cf8 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/repository/timezone/DateTimeWrapper.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/repository/timezone/DateTimeWrapper.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.repository.timezone; +package com.baeldung.jhipster6.repository.timezone; import javax.persistence.*; import java.io.Serializable; diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/repository/timezone/DateTimeWrapperRepository.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/repository/timezone/DateTimeWrapperRepository.java similarity index 84% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/repository/timezone/DateTimeWrapperRepository.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/repository/timezone/DateTimeWrapperRepository.java index 9c3831879f..5923db6ca0 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/repository/timezone/DateTimeWrapperRepository.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/repository/timezone/DateTimeWrapperRepository.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.repository.timezone; +package com.baeldung.jhipster6.repository.timezone; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/DomainUserDetailsServiceIT.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/DomainUserDetailsServiceIT.java new file mode 100644 index 0000000000..3e641dfad7 --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/DomainUserDetailsServiceIT.java @@ -0,0 +1,125 @@ +package com.baeldung.jhipster6.security; + +import com.baeldung.jhipster6.BookstoreApp; +import com.baeldung.jhipster6.domain.User; +import com.baeldung.jhipster6.repository.UserRepository; + +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Locale; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +/** + * Integrations tests for {@link DomainUserDetailsService}. + */ +@SpringBootTest(classes = BookstoreApp.class) +@Transactional +public class DomainUserDetailsServiceIT { + + private static final String USER_ONE_LOGIN = "test-user-one"; + private static final String USER_ONE_EMAIL = "test-user-one@localhost"; + private static final String USER_TWO_LOGIN = "test-user-two"; + private static final String USER_TWO_EMAIL = "test-user-two@localhost"; + private static final String USER_THREE_LOGIN = "test-user-three"; + private static final String USER_THREE_EMAIL = "test-user-three@localhost"; + + @Autowired + private UserRepository userRepository; + + @Autowired + private UserDetailsService domainUserDetailsService; + + private User userOne; + private User userTwo; + private User userThree; + + @BeforeEach + public void init() { + userOne = new User(); + userOne.setLogin(USER_ONE_LOGIN); + userOne.setPassword(RandomStringUtils.random(60)); + userOne.setActivated(true); + userOne.setEmail(USER_ONE_EMAIL); + userOne.setFirstName("userOne"); + userOne.setLastName("doe"); + userOne.setLangKey("en"); + userRepository.save(userOne); + + userTwo = new User(); + userTwo.setLogin(USER_TWO_LOGIN); + userTwo.setPassword(RandomStringUtils.random(60)); + userTwo.setActivated(true); + userTwo.setEmail(USER_TWO_EMAIL); + userTwo.setFirstName("userTwo"); + userTwo.setLastName("doe"); + userTwo.setLangKey("en"); + userRepository.save(userTwo); + + userThree = new User(); + userThree.setLogin(USER_THREE_LOGIN); + userThree.setPassword(RandomStringUtils.random(60)); + userThree.setActivated(false); + userThree.setEmail(USER_THREE_EMAIL); + userThree.setFirstName("userThree"); + userThree.setLastName("doe"); + userThree.setLangKey("en"); + userRepository.save(userThree); + } + + @Test + @Transactional + public void assertThatUserCanBeFoundByLogin() { + UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_LOGIN); + assertThat(userDetails).isNotNull(); + assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN); + } + + @Test + @Transactional + public void assertThatUserCanBeFoundByLoginIgnoreCase() { + UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_LOGIN.toUpperCase(Locale.ENGLISH)); + assertThat(userDetails).isNotNull(); + assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN); + } + + @Test + @Transactional + public void assertThatUserCanBeFoundByEmail() { + UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_TWO_EMAIL); + assertThat(userDetails).isNotNull(); + assertThat(userDetails.getUsername()).isEqualTo(USER_TWO_LOGIN); + } + + @Test + @Transactional + public void assertThatUserCanNotBeFoundByEmailIgnoreCase() { + assertThatExceptionOfType(UsernameNotFoundException.class).isThrownBy( + () -> domainUserDetailsService.loadUserByUsername(USER_TWO_EMAIL.toUpperCase(Locale.ENGLISH))); + } + + @Test + @Transactional + public void assertThatEmailIsPrioritizedOverLogin() { + UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_EMAIL); + assertThat(userDetails).isNotNull(); + assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN); + } + + @Test + @Transactional + public void assertThatUserNotActivatedExceptionIsThrownForNotActivatedUsers() { + assertThatExceptionOfType(UserNotActivatedException.class).isThrownBy( + () -> domainUserDetailsService.loadUserByUsername(USER_THREE_LOGIN)); + } + +} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/DomainUserDetailsServiceIntegrationTest.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/DomainUserDetailsServiceIntegrationTest.java similarity index 95% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/DomainUserDetailsServiceIntegrationTest.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/DomainUserDetailsServiceIntegrationTest.java index 11757f6516..bf30067406 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/DomainUserDetailsServiceIntegrationTest.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/DomainUserDetailsServiceIntegrationTest.java @@ -1,8 +1,8 @@ -package com.baeldung.jhipster5.security; +package com.baeldung.jhipster6.security; -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.repository.UserRepository; +import com.baeldung.jhipster6.BookstoreApp; +import com.baeldung.jhipster6.domain.User; +import com.baeldung.jhipster6.repository.UserRepository; import org.apache.commons.lang3.RandomStringUtils; import org.junit.Before; diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/MockAuthenticationManager.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/MockAuthenticationManager.java similarity index 98% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/MockAuthenticationManager.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/MockAuthenticationManager.java index bdcdba7644..0b32072010 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/MockAuthenticationManager.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/MockAuthenticationManager.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.security; +package com.baeldung.jhipster6.security; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Primary; diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/SecurityUtilsUnitTest.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/SecurityUtilsUnitTest.java similarity index 98% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/SecurityUtilsUnitTest.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/SecurityUtilsUnitTest.java index b2736badd6..b017acd022 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/SecurityUtilsUnitTest.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/SecurityUtilsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.security; +package com.baeldung.jhipster6.security; import org.junit.Test; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; diff --git a/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/jwt/JWTFilter2UnitTest.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/jwt/JWTFilter2UnitTest.java new file mode 100644 index 0000000000..11a64993e9 --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/jwt/JWTFilter2UnitTest.java @@ -0,0 +1,116 @@ +package com.baeldung.jhipster6.security.jwt; + +import com.baeldung.jhipster6.security.AuthoritiesConstants; + +import io.github.jhipster.config.JHipsterProperties; +import io.jsonwebtoken.io.Decoders; +import io.jsonwebtoken.security.Keys; + +import org.junit.Before; +import org.junit.Test; +import org.springframework.http.HttpStatus; +import org.springframework.mock.web.MockFilterChain; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.test.util.ReflectionTestUtils; + +import java.util.Collections; + +import static org.assertj.core.api.Assertions.assertThat; + +public class JWTFilter2UnitTest { + + private TokenProvider tokenProvider; + + private JWTFilter jwtFilter; + + @Before + public void setup() { + JHipsterProperties jHipsterProperties = new JHipsterProperties(); + tokenProvider = new TokenProvider(jHipsterProperties); + ReflectionTestUtils.setField(tokenProvider, "key", + Keys.hmacShaKeyFor(Decoders.BASE64 + .decode("fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8"))); + + ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", 60000); + jwtFilter = new JWTFilter(tokenProvider); + SecurityContextHolder.getContext().setAuthentication(null); + } + + @Test + public void testJWTFilter() throws Exception { + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( + "test-user", + "test-password", + Collections.singletonList(new SimpleGrantedAuthority(AuthoritiesConstants.USER)) + ); + String jwt = tokenProvider.createToken(authentication, false); + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt); + request.setRequestURI("/api/test"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain filterChain = new MockFilterChain(); + jwtFilter.doFilter(request, response, filterChain); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(SecurityContextHolder.getContext().getAuthentication().getName()).isEqualTo("test-user"); + assertThat(SecurityContextHolder.getContext().getAuthentication().getCredentials().toString()).isEqualTo(jwt); + } + + @Test + public void testJWTFilterInvalidToken() throws Exception { + String jwt = "wrong_jwt"; + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt); + request.setRequestURI("/api/test"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain filterChain = new MockFilterChain(); + jwtFilter.doFilter(request, response, filterChain); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); + } + + @Test + public void testJWTFilterMissingAuthorization() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setRequestURI("/api/test"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain filterChain = new MockFilterChain(); + jwtFilter.doFilter(request, response, filterChain); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); + } + + @Test + public void testJWTFilterMissingToken() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Bearer "); + request.setRequestURI("/api/test"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain filterChain = new MockFilterChain(); + jwtFilter.doFilter(request, response, filterChain); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); + } + + @Test + public void testJWTFilterWrongScheme() throws Exception { + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( + "test-user", + "test-password", + Collections.singletonList(new SimpleGrantedAuthority(AuthoritiesConstants.USER)) + ); + String jwt = tokenProvider.createToken(authentication, false); + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Basic " + jwt); + request.setRequestURI("/api/test"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain filterChain = new MockFilterChain(); + jwtFilter.doFilter(request, response, filterChain); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); + } + +} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/jwt/JWTFilterUnitTest.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/jwt/JWTFilterUnitTest.java similarity index 96% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/jwt/JWTFilterUnitTest.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/jwt/JWTFilterUnitTest.java index 2be8e6809a..13633c901c 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/jwt/JWTFilterUnitTest.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/jwt/JWTFilterUnitTest.java @@ -1,12 +1,13 @@ -package com.baeldung.jhipster5.security.jwt; +package com.baeldung.jhipster6.security.jwt; + +import com.baeldung.jhipster6.security.AuthoritiesConstants; -import com.baeldung.jhipster5.security.AuthoritiesConstants; import io.github.jhipster.config.JHipsterProperties; import io.jsonwebtoken.io.Decoders; import io.jsonwebtoken.security.Keys; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.http.HttpStatus; import org.springframework.mock.web.MockFilterChain; import org.springframework.mock.web.MockHttpServletRequest; @@ -26,7 +27,7 @@ public class JWTFilterUnitTest { private JWTFilter jwtFilter; - @Before + @BeforeEach public void setup() { JHipsterProperties jHipsterProperties = new JHipsterProperties(); tokenProvider = new TokenProvider(jHipsterProperties); diff --git a/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/jwt/TokenProvider2UnitTest.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/jwt/TokenProvider2UnitTest.java new file mode 100644 index 0000000000..311deb3fd7 --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/jwt/TokenProvider2UnitTest.java @@ -0,0 +1,111 @@ +package com.baeldung.jhipster6.security.jwt; + +import com.baeldung.jhipster6.security.AuthoritiesConstants; + +import java.security.Key; +import java.util.*; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.test.util.ReflectionTestUtils; + +import io.github.jhipster.config.JHipsterProperties; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.io.Decoders; +import io.jsonwebtoken.security.Keys; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TokenProvider2UnitTest { + + private final long ONE_MINUTE = 60000; + private Key key; + private JHipsterProperties jHipsterProperties; + private TokenProvider tokenProvider; + + @Before + public void setup() { + jHipsterProperties = Mockito.mock(JHipsterProperties.class); + tokenProvider = new TokenProvider(jHipsterProperties); + key = Keys.hmacShaKeyFor(Decoders.BASE64 + .decode("fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8")); + + ReflectionTestUtils.setField(tokenProvider, "key", key); + ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", ONE_MINUTE); + } + + @Test + public void testReturnFalseWhenJWThasInvalidSignature() { + boolean isTokenValid = tokenProvider.validateToken(createTokenWithDifferentSignature()); + + assertThat(isTokenValid).isEqualTo(false); + } + + @Test + public void testReturnFalseWhenJWTisMalformed() { + Authentication authentication = createAuthentication(); + String token = tokenProvider.createToken(authentication, false); + String invalidToken = token.substring(1); + boolean isTokenValid = tokenProvider.validateToken(invalidToken); + + assertThat(isTokenValid).isEqualTo(false); + } + + @Test + public void testReturnFalseWhenJWTisExpired() { + ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", -ONE_MINUTE); + + Authentication authentication = createAuthentication(); + String token = tokenProvider.createToken(authentication, false); + + boolean isTokenValid = tokenProvider.validateToken(token); + + assertThat(isTokenValid).isEqualTo(false); + } + + @Test + public void testReturnFalseWhenJWTisUnsupported() { + String unsupportedToken = createUnsupportedToken(); + + boolean isTokenValid = tokenProvider.validateToken(unsupportedToken); + + assertThat(isTokenValid).isEqualTo(false); + } + + @Test + public void testReturnFalseWhenJWTisInvalid() { + boolean isTokenValid = tokenProvider.validateToken(""); + + assertThat(isTokenValid).isEqualTo(false); + } + + private Authentication createAuthentication() { + Collection authorities = new ArrayList<>(); + authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.ANONYMOUS)); + return new UsernamePasswordAuthenticationToken("anonymous", "anonymous", authorities); + } + + private String createUnsupportedToken() { + return Jwts.builder() + .setPayload("payload") + .signWith(key, SignatureAlgorithm.HS512) + .compact(); + } + + private String createTokenWithDifferentSignature() { + Key otherKey = Keys.hmacShaKeyFor(Decoders.BASE64 + .decode("Xfd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8")); + + return Jwts.builder() + .setSubject("anonymous") + .signWith(otherKey, SignatureAlgorithm.HS512) + .setExpiration(new Date(new Date().getTime() + ONE_MINUTE)) + .compact(); + } +} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/jwt/TokenProviderUnitTest.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/jwt/TokenProviderUnitTest.java similarity index 89% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/jwt/TokenProviderUnitTest.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/jwt/TokenProviderUnitTest.java index 18da2eb875..3d14352c79 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/jwt/TokenProviderUnitTest.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/security/jwt/TokenProviderUnitTest.java @@ -1,13 +1,12 @@ -package com.baeldung.jhipster5.security.jwt; +package com.baeldung.jhipster6.security.jwt; -import com.baeldung.jhipster5.security.AuthoritiesConstants; +import com.baeldung.jhipster6.security.AuthoritiesConstants; import java.security.Key; import java.util.*; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; @@ -24,15 +23,14 @@ import static org.assertj.core.api.Assertions.assertThat; public class TokenProviderUnitTest { - private final long ONE_MINUTE = 60000; + private static final long ONE_MINUTE = 60000; + private Key key; - private JHipsterProperties jHipsterProperties; private TokenProvider tokenProvider; - @Before + @BeforeEach public void setup() { - jHipsterProperties = Mockito.mock(JHipsterProperties.class); - tokenProvider = new TokenProvider(jHipsterProperties); + tokenProvider = new TokenProvider( new JHipsterProperties()); key = Keys.hmacShaKeyFor(Decoders.BASE64 .decode("fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8")); diff --git a/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/service/MailServiceIT.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/service/MailServiceIT.java new file mode 100644 index 0000000000..602ff4319d --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/service/MailServiceIT.java @@ -0,0 +1,189 @@ +package com.baeldung.jhipster6.service; + +import com.baeldung.jhipster6.config.Constants; + +import com.baeldung.jhipster6.BookstoreApp; +import com.baeldung.jhipster6.domain.User; + +import io.github.jhipster.config.JHipsterProperties; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.MessageSource; +import org.springframework.mail.MailSendException; +import org.springframework.mail.javamail.JavaMailSenderImpl; +import org.thymeleaf.spring5.SpringTemplateEngine; + +import javax.mail.Multipart; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; +import java.io.ByteArrayOutputStream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +/** + * Integration tests for {@link MailService}. + */ +@SpringBootTest(classes = BookstoreApp.class) +public class MailServiceIT { + + @Autowired + private JHipsterProperties jHipsterProperties; + + @Autowired + private MessageSource messageSource; + + @Autowired + private SpringTemplateEngine templateEngine; + + @Spy + private JavaMailSenderImpl javaMailSender; + + @Captor + private ArgumentCaptor messageCaptor; + + private MailService mailService; + + @BeforeEach + public void setup() { + MockitoAnnotations.initMocks(this); + doNothing().when(javaMailSender).send(any(MimeMessage.class)); + mailService = new MailService(jHipsterProperties, javaMailSender, messageSource, templateEngine); + } + + @Test + public void testSendEmail() throws Exception { + mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, false); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getSubject()).isEqualTo("testSubject"); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo("john.doe@example.com"); + assertThat(message.getFrom()[0].toString()).isEqualTo("test@localhost"); + assertThat(message.getContent()).isInstanceOf(String.class); + assertThat(message.getContent().toString()).isEqualTo("testContent"); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/plain; charset=UTF-8"); + } + + @Test + public void testSendHtmlEmail() throws Exception { + mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, true); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getSubject()).isEqualTo("testSubject"); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo("john.doe@example.com"); + assertThat(message.getFrom()[0].toString()).isEqualTo("test@localhost"); + assertThat(message.getContent()).isInstanceOf(String.class); + assertThat(message.getContent().toString()).isEqualTo("testContent"); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + public void testSendMultipartEmail() throws Exception { + mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", true, false); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + MimeMultipart mp = (MimeMultipart) message.getContent(); + MimeBodyPart part = (MimeBodyPart) ((MimeMultipart) mp.getBodyPart(0).getContent()).getBodyPart(0); + ByteArrayOutputStream aos = new ByteArrayOutputStream(); + part.writeTo(aos); + assertThat(message.getSubject()).isEqualTo("testSubject"); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo("john.doe@example.com"); + assertThat(message.getFrom()[0].toString()).isEqualTo("test@localhost"); + assertThat(message.getContent()).isInstanceOf(Multipart.class); + assertThat(aos.toString()).isEqualTo("\r\ntestContent"); + assertThat(part.getDataHandler().getContentType()).isEqualTo("text/plain; charset=UTF-8"); + } + + @Test + public void testSendMultipartHtmlEmail() throws Exception { + mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", true, true); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + MimeMultipart mp = (MimeMultipart) message.getContent(); + MimeBodyPart part = (MimeBodyPart) ((MimeMultipart) mp.getBodyPart(0).getContent()).getBodyPart(0); + ByteArrayOutputStream aos = new ByteArrayOutputStream(); + part.writeTo(aos); + assertThat(message.getSubject()).isEqualTo("testSubject"); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo("john.doe@example.com"); + assertThat(message.getFrom()[0].toString()).isEqualTo("test@localhost"); + assertThat(message.getContent()).isInstanceOf(Multipart.class); + assertThat(aos.toString()).isEqualTo("\r\ntestContent"); + assertThat(part.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + public void testSendEmailFromTemplate() throws Exception { + User user = new User(); + user.setLogin("john"); + user.setEmail("john.doe@example.com"); + user.setLangKey("en"); + mailService.sendEmailFromTemplate(user, "mail/testEmail", "email.test.title"); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getSubject()).isEqualTo("test title"); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo(user.getEmail()); + assertThat(message.getFrom()[0].toString()).isEqualTo("test@localhost"); + assertThat(message.getContent().toString()).isEqualToNormalizingNewlines("test title, http://127.0.0.1:8080, john\n"); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + public void testSendActivationEmail() throws Exception { + User user = new User(); + user.setLangKey(Constants.DEFAULT_LANGUAGE); + user.setLogin("john"); + user.setEmail("john.doe@example.com"); + mailService.sendActivationEmail(user); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo(user.getEmail()); + assertThat(message.getFrom()[0].toString()).isEqualTo("test@localhost"); + assertThat(message.getContent().toString()).isNotEmpty(); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + public void testCreationEmail() throws Exception { + User user = new User(); + user.setLangKey(Constants.DEFAULT_LANGUAGE); + user.setLogin("john"); + user.setEmail("john.doe@example.com"); + mailService.sendCreationEmail(user); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo(user.getEmail()); + assertThat(message.getFrom()[0].toString()).isEqualTo("test@localhost"); + assertThat(message.getContent().toString()).isNotEmpty(); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + public void testSendPasswordResetMail() throws Exception { + User user = new User(); + user.setLangKey(Constants.DEFAULT_LANGUAGE); + user.setLogin("john"); + user.setEmail("john.doe@example.com"); + mailService.sendPasswordResetMail(user); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo(user.getEmail()); + assertThat(message.getFrom()[0].toString()).isEqualTo("test@localhost"); + assertThat(message.getContent().toString()).isNotEmpty(); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + public void testSendEmailWithException() throws Exception { + doThrow(MailSendException.class).when(javaMailSender).send(any(MimeMessage.class)); + mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, false); + } + +} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/MailServiceIntegrationTest.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/service/MailServiceIntegrationTest.java similarity index 98% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/MailServiceIntegrationTest.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/service/MailServiceIntegrationTest.java index 72592e1239..af04430ee7 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/MailServiceIntegrationTest.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/service/MailServiceIntegrationTest.java @@ -1,8 +1,9 @@ -package com.baeldung.jhipster5.service; -import com.baeldung.jhipster5.config.Constants; +package com.baeldung.jhipster6.service; +import com.baeldung.jhipster6.config.Constants; + +import com.baeldung.jhipster6.BookstoreApp; +import com.baeldung.jhipster6.domain.User; -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.domain.User; import io.github.jhipster.config.JHipsterProperties; import org.junit.Before; import org.junit.Test; diff --git a/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/service/UserServiceIT.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/service/UserServiceIT.java new file mode 100644 index 0000000000..5c624b166d --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/service/UserServiceIT.java @@ -0,0 +1,200 @@ +package com.baeldung.jhipster6.service; + +import com.baeldung.jhipster6.BookstoreApp; +import com.baeldung.jhipster6.config.Constants; +import com.baeldung.jhipster6.domain.User; +import com.baeldung.jhipster6.repository.UserRepository; +import com.baeldung.jhipster6.service.dto.UserDTO; +import com.baeldung.jhipster6.service.util.RandomUtil; + +import org.apache.commons.lang3.RandomStringUtils; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.auditing.AuditingHandler; +import org.springframework.data.auditing.DateTimeProvider; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.transaction.annotation.Transactional; + +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.time.LocalDateTime; +import java.util.Optional; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +/** + * Integration tests for {@link UserService}. + */ +@SpringBootTest(classes = BookstoreApp.class) +@Transactional +public class UserServiceIT { + + private static final String DEFAULT_LOGIN = "johndoe"; + + private static final String DEFAULT_EMAIL = "johndoe@localhost"; + + private static final String DEFAULT_FIRSTNAME = "john"; + + private static final String DEFAULT_LASTNAME = "doe"; + + private static final String DEFAULT_IMAGEURL = "http://placehold.it/50x50"; + + private static final String DEFAULT_LANGKEY = "en"; + + @Autowired + private UserRepository userRepository; + + @Autowired + private UserService userService; + + @Autowired + private AuditingHandler auditingHandler; + + @Mock + private DateTimeProvider dateTimeProvider; + + private User user; + + @BeforeEach + public void init() { + user = new User(); + user.setLogin(DEFAULT_LOGIN); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + user.setEmail(DEFAULT_EMAIL); + user.setFirstName(DEFAULT_FIRSTNAME); + user.setLastName(DEFAULT_LASTNAME); + user.setImageUrl(DEFAULT_IMAGEURL); + user.setLangKey(DEFAULT_LANGKEY); + + when(dateTimeProvider.getNow()).thenReturn(Optional.of(LocalDateTime.now())); + auditingHandler.setDateTimeProvider(dateTimeProvider); + } + + @Test + @Transactional + public void assertThatUserMustExistToResetPassword() { + userRepository.saveAndFlush(user); + Optional maybeUser = userService.requestPasswordReset("invalid.login@localhost"); + assertThat(maybeUser).isNotPresent(); + + maybeUser = userService.requestPasswordReset(user.getEmail()); + assertThat(maybeUser).isPresent(); + assertThat(maybeUser.orElse(null).getEmail()).isEqualTo(user.getEmail()); + assertThat(maybeUser.orElse(null).getResetDate()).isNotNull(); + assertThat(maybeUser.orElse(null).getResetKey()).isNotNull(); + } + + @Test + @Transactional + public void assertThatOnlyActivatedUserCanRequestPasswordReset() { + user.setActivated(false); + userRepository.saveAndFlush(user); + + Optional maybeUser = userService.requestPasswordReset(user.getLogin()); + assertThat(maybeUser).isNotPresent(); + userRepository.delete(user); + } + + @Test + @Transactional + public void assertThatResetKeyMustNotBeOlderThan24Hours() { + Instant daysAgo = Instant.now().minus(25, ChronoUnit.HOURS); + String resetKey = RandomUtil.generateResetKey(); + user.setActivated(true); + user.setResetDate(daysAgo); + user.setResetKey(resetKey); + userRepository.saveAndFlush(user); + + Optional maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey()); + assertThat(maybeUser).isNotPresent(); + userRepository.delete(user); + } + + @Test + @Transactional + public void assertThatResetKeyMustBeValid() { + Instant daysAgo = Instant.now().minus(25, ChronoUnit.HOURS); + user.setActivated(true); + user.setResetDate(daysAgo); + user.setResetKey("1234"); + userRepository.saveAndFlush(user); + + Optional maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey()); + assertThat(maybeUser).isNotPresent(); + userRepository.delete(user); + } + + @Test + @Transactional + public void assertThatUserCanResetPassword() { + String oldPassword = user.getPassword(); + Instant daysAgo = Instant.now().minus(2, ChronoUnit.HOURS); + String resetKey = RandomUtil.generateResetKey(); + user.setActivated(true); + user.setResetDate(daysAgo); + user.setResetKey(resetKey); + userRepository.saveAndFlush(user); + + Optional maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey()); + assertThat(maybeUser).isPresent(); + assertThat(maybeUser.orElse(null).getResetDate()).isNull(); + assertThat(maybeUser.orElse(null).getResetKey()).isNull(); + assertThat(maybeUser.orElse(null).getPassword()).isNotEqualTo(oldPassword); + + userRepository.delete(user); + } + + @Test + @Transactional + public void testFindNotActivatedUsersByCreationDateBefore() { + Instant now = Instant.now(); + when(dateTimeProvider.getNow()).thenReturn(Optional.of(now.minus(4, ChronoUnit.DAYS))); + user.setActivated(false); + User dbUser = userRepository.saveAndFlush(user); + dbUser.setCreatedDate(now.minus(4, ChronoUnit.DAYS)); + userRepository.saveAndFlush(user); + List users = userRepository.findAllByActivatedIsFalseAndCreatedDateBefore(now.minus(3, ChronoUnit.DAYS)); + assertThat(users).isNotEmpty(); + userService.removeNotActivatedUsers(); + users = userRepository.findAllByActivatedIsFalseAndCreatedDateBefore(now.minus(3, ChronoUnit.DAYS)); + assertThat(users).isEmpty(); + } + + @Test + @Transactional + public void assertThatAnonymousUserIsNotGet() { + user.setLogin(Constants.ANONYMOUS_USER); + if (!userRepository.findOneByLogin(Constants.ANONYMOUS_USER).isPresent()) { + userRepository.saveAndFlush(user); + } + final PageRequest pageable = PageRequest.of(0, (int) userRepository.count()); + final Page allManagedUsers = userService.getAllManagedUsers(pageable); + assertThat(allManagedUsers.getContent().stream() + .noneMatch(user -> Constants.ANONYMOUS_USER.equals(user.getLogin()))) + .isTrue(); + } + + + @Test + @Transactional + public void testRemoveNotActivatedUsers() { + // custom "now" for audit to use as creation date + when(dateTimeProvider.getNow()).thenReturn(Optional.of(Instant.now().minus(30, ChronoUnit.DAYS))); + + user.setActivated(false); + userRepository.saveAndFlush(user); + + Assertions.assertThat(userRepository.findOneByLogin(DEFAULT_LOGIN)).isPresent(); + userService.removeNotActivatedUsers(); + Assertions.assertThat(userRepository.findOneByLogin(DEFAULT_LOGIN)).isNotPresent(); + } + +} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/UserServiceIntegrationTest.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/service/UserServiceIntegrationTest.java similarity index 92% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/UserServiceIntegrationTest.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/service/UserServiceIntegrationTest.java index ca3608462d..b8e8a9e1aa 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/UserServiceIntegrationTest.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/service/UserServiceIntegrationTest.java @@ -1,13 +1,14 @@ -package com.baeldung.jhipster5.service; +package com.baeldung.jhipster6.service; -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.config.Constants; -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.repository.UserRepository; -import com.baeldung.jhipster5.service.dto.UserDTO; -import com.baeldung.jhipster5.service.util.RandomUtil; +import com.baeldung.jhipster6.BookstoreApp; +import com.baeldung.jhipster6.config.Constants; +import com.baeldung.jhipster6.domain.User; +import com.baeldung.jhipster6.repository.UserRepository; +import com.baeldung.jhipster6.service.dto.UserDTO; +import com.baeldung.jhipster6.service.util.RandomUtil; import org.apache.commons.lang3.RandomStringUtils; +import org.assertj.core.api.Assertions; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -184,9 +185,9 @@ public class UserServiceIntegrationTest { user.setActivated(false); userRepository.saveAndFlush(user); - assertThat(userRepository.findOneByLogin("johndoe")).isPresent(); + Assertions.assertThat(userRepository.findOneByLogin("johndoe")).isPresent(); userService.removeNotActivatedUsers(); - assertThat(userRepository.findOneByLogin("johndoe")).isNotPresent(); + Assertions.assertThat(userRepository.findOneByLogin("johndoe")).isNotPresent(); } } diff --git a/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/service/mapper/UserMapperIT.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/service/mapper/UserMapperIT.java new file mode 100644 index 0000000000..cca2dc7d92 --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/service/mapper/UserMapperIT.java @@ -0,0 +1,143 @@ +package com.baeldung.jhipster6.service.mapper; + + +import com.baeldung.jhipster6.BookstoreApp; +import com.baeldung.jhipster6.domain.User; +import com.baeldung.jhipster6.service.dto.UserDTO; + +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Integration tests for {@link UserMapper}. + */ +@SpringBootTest(classes = BookstoreApp.class) +public class UserMapperIT { + + private static final String DEFAULT_LOGIN = "johndoe"; + private static final Long DEFAULT_ID = 1L; + + @Autowired + private UserMapper userMapper; + + private User user; + private UserDTO userDto; + + @BeforeEach + public void init() { + user = new User(); + user.setLogin(DEFAULT_LOGIN); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + user.setEmail("johndoe@localhost"); + user.setFirstName("john"); + user.setLastName("doe"); + user.setImageUrl("image_url"); + user.setLangKey("en"); + + userDto = new UserDTO(user); + } + + @Test + public void usersToUserDTOsShouldMapOnlyNonNullUsers() { + List users = new ArrayList<>(); + users.add(user); + users.add(null); + + List userDTOS = userMapper.usersToUserDTOs(users); + + assertThat(userDTOS).isNotEmpty(); + assertThat(userDTOS).size().isEqualTo(1); + } + + @Test + public void userDTOsToUsersShouldMapOnlyNonNullUsers() { + List usersDto = new ArrayList<>(); + usersDto.add(userDto); + usersDto.add(null); + + List users = userMapper.userDTOsToUsers(usersDto); + + assertThat(users).isNotEmpty(); + assertThat(users).size().isEqualTo(1); + } + + @Test + public void userDTOsToUsersWithAuthoritiesStringShouldMapToUsersWithAuthoritiesDomain() { + Set authoritiesAsString = new HashSet<>(); + authoritiesAsString.add("ADMIN"); + userDto.setAuthorities(authoritiesAsString); + + List usersDto = new ArrayList<>(); + usersDto.add(userDto); + + List users = userMapper.userDTOsToUsers(usersDto); + + assertThat(users).isNotEmpty(); + assertThat(users).size().isEqualTo(1); + assertThat(users.get(0).getAuthorities()).isNotNull(); + assertThat(users.get(0).getAuthorities()).isNotEmpty(); + assertThat(users.get(0).getAuthorities().iterator().next().getName()).isEqualTo("ADMIN"); + } + + @Test + public void userDTOsToUsersMapWithNullAuthoritiesStringShouldReturnUserWithEmptyAuthorities() { + userDto.setAuthorities(null); + + List usersDto = new ArrayList<>(); + usersDto.add(userDto); + + List users = userMapper.userDTOsToUsers(usersDto); + + assertThat(users).isNotEmpty(); + assertThat(users).size().isEqualTo(1); + assertThat(users.get(0).getAuthorities()).isNotNull(); + assertThat(users.get(0).getAuthorities()).isEmpty(); + } + + @Test + public void userDTOToUserMapWithAuthoritiesStringShouldReturnUserWithAuthorities() { + Set authoritiesAsString = new HashSet<>(); + authoritiesAsString.add("ADMIN"); + userDto.setAuthorities(authoritiesAsString); + + User user = userMapper.userDTOToUser(userDto); + + assertThat(user).isNotNull(); + assertThat(user.getAuthorities()).isNotNull(); + assertThat(user.getAuthorities()).isNotEmpty(); + assertThat(user.getAuthorities().iterator().next().getName()).isEqualTo("ADMIN"); + } + + @Test + public void userDTOToUserMapWithNullAuthoritiesStringShouldReturnUserWithEmptyAuthorities() { + userDto.setAuthorities(null); + + User user = userMapper.userDTOToUser(userDto); + + assertThat(user).isNotNull(); + assertThat(user.getAuthorities()).isNotNull(); + assertThat(user.getAuthorities()).isEmpty(); + } + + @Test + public void userDTOToUserMapWithNullUserShouldReturnNull() { + assertThat(userMapper.userDTOToUser(null)).isNull(); + } + + @Test + public void testUserFromId() { + assertThat(userMapper.userFromId(DEFAULT_ID).getId()).isEqualTo(DEFAULT_ID); + assertThat(userMapper.userFromId(null)).isNull(); + } +} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/mapper/UserMapperIntegrationTest.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/service/mapper/UserMapperIntegrationTest.java similarity index 96% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/mapper/UserMapperIntegrationTest.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/service/mapper/UserMapperIntegrationTest.java index cd49135d63..d143caccf6 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/mapper/UserMapperIntegrationTest.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/service/mapper/UserMapperIntegrationTest.java @@ -1,9 +1,10 @@ -package com.baeldung.jhipster5.service.mapper; +package com.baeldung.jhipster6.service.mapper; -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.service.dto.UserDTO; +import com.baeldung.jhipster6.BookstoreApp; +import com.baeldung.jhipster6.domain.User; +import com.baeldung.jhipster6.service.dto.UserDTO; + import org.apache.commons.lang3.RandomStringUtils; import org.junit.Before; import org.junit.Test; diff --git a/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/AccountResourceIT.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/AccountResourceIT.java new file mode 100644 index 0000000000..4655526bb0 --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/AccountResourceIT.java @@ -0,0 +1,815 @@ +package com.baeldung.jhipster6.web.rest; + +import com.baeldung.jhipster6.BookstoreApp; +import com.baeldung.jhipster6.config.Constants; +import com.baeldung.jhipster6.domain.Authority; +import com.baeldung.jhipster6.domain.User; +import com.baeldung.jhipster6.repository.AuthorityRepository; +import com.baeldung.jhipster6.repository.UserRepository; +import com.baeldung.jhipster6.security.AuthoritiesConstants; +import com.baeldung.jhipster6.service.MailService; +import com.baeldung.jhipster6.service.UserService; +import com.baeldung.jhipster6.service.dto.PasswordChangeDTO; +import com.baeldung.jhipster6.service.dto.UserDTO; +import com.baeldung.jhipster6.web.rest.errors.ExceptionTranslator; +import com.baeldung.jhipster6.web.rest.vm.KeyAndPasswordVM; +import com.baeldung.jhipster6.web.rest.vm.ManagedUserVM; + +import org.apache.commons.lang3.RandomStringUtils; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.transaction.annotation.Transactional; + +import java.time.Instant; +import java.util.*; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +/** + * Integration tests for the {@link AccountResource} REST controller. + */ +@SpringBootTest(classes = BookstoreApp.class) +public class AccountResourceIT { + + @Autowired + private UserRepository userRepository; + + @Autowired + private AuthorityRepository authorityRepository; + + @Autowired + private UserService userService; + + @Autowired + private PasswordEncoder passwordEncoder; + + @Autowired + private HttpMessageConverter[] httpMessageConverters; + + @Autowired + private ExceptionTranslator exceptionTranslator; + + @Mock + private UserService mockUserService; + + @Mock + private MailService mockMailService; + + private MockMvc restMvc; + + private MockMvc restUserMockMvc; + + @BeforeEach + public void setup() { + MockitoAnnotations.initMocks(this); + doNothing().when(mockMailService).sendActivationEmail(any()); + AccountResource accountResource = + new AccountResource(userRepository, userService, mockMailService); + + AccountResource accountUserMockResource = + new AccountResource(userRepository, mockUserService, mockMailService); + this.restMvc = MockMvcBuilders.standaloneSetup(accountResource) + .setMessageConverters(httpMessageConverters) + .setControllerAdvice(exceptionTranslator) + .build(); + this.restUserMockMvc = MockMvcBuilders.standaloneSetup(accountUserMockResource) + .setControllerAdvice(exceptionTranslator) + .build(); + } + + @Test + public void testNonAuthenticatedUser() throws Exception { + restUserMockMvc.perform(get("/api/authenticate") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string("")); + } + + @Test + public void testAuthenticatedUser() throws Exception { + restUserMockMvc.perform(get("/api/authenticate") + .with(request -> { + request.setRemoteUser("test"); + return request; + }) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string("test")); + } + + @Test + public void testGetExistingAccount() throws Exception { + Set authorities = new HashSet<>(); + Authority authority = new Authority(); + authority.setName(AuthoritiesConstants.ADMIN); + authorities.add(authority); + + User user = new User(); + user.setLogin("test"); + user.setFirstName("john"); + user.setLastName("doe"); + user.setEmail("john.doe@jhipster.com"); + user.setImageUrl("http://placehold.it/50x50"); + user.setLangKey("en"); + user.setAuthorities(authorities); + when(mockUserService.getUserWithAuthorities()).thenReturn(Optional.of(user)); + + restUserMockMvc.perform(get("/api/account") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) + .andExpect(jsonPath("$.login").value("test")) + .andExpect(jsonPath("$.firstName").value("john")) + .andExpect(jsonPath("$.lastName").value("doe")) + .andExpect(jsonPath("$.email").value("john.doe@jhipster.com")) + .andExpect(jsonPath("$.imageUrl").value("http://placehold.it/50x50")) + .andExpect(jsonPath("$.langKey").value("en")) + .andExpect(jsonPath("$.authorities").value(AuthoritiesConstants.ADMIN)); + } + + @Test + public void testGetUnknownAccount() throws Exception { + when(mockUserService.getUserWithAuthorities()).thenReturn(Optional.empty()); + + restUserMockMvc.perform(get("/api/account") + .accept(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(status().isInternalServerError()); + } + + @Test + @Transactional + public void testRegisterValid() throws Exception { + ManagedUserVM validUser = new ManagedUserVM(); + validUser.setLogin("test-register-valid"); + validUser.setPassword("password"); + validUser.setFirstName("Alice"); + validUser.setLastName("Test"); + validUser.setEmail("test-register-valid@example.com"); + validUser.setImageUrl("http://placehold.it/50x50"); + validUser.setLangKey(Constants.DEFAULT_LANGUAGE); + validUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + assertThat(userRepository.findOneByLogin("test-register-valid").isPresent()).isFalse(); + + restMvc.perform( + post("/api/register") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(validUser))) + .andExpect(status().isCreated()); + + assertThat(userRepository.findOneByLogin("test-register-valid").isPresent()).isTrue(); + } + + @Test + @Transactional + public void testRegisterInvalidLogin() throws Exception { + ManagedUserVM invalidUser = new ManagedUserVM(); + invalidUser.setLogin("funky-log!n");// <-- invalid + invalidUser.setPassword("password"); + invalidUser.setFirstName("Funky"); + invalidUser.setLastName("One"); + invalidUser.setEmail("funky@example.com"); + invalidUser.setActivated(true); + invalidUser.setImageUrl("http://placehold.it/50x50"); + invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE); + invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc.perform( + post("/api/register") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(invalidUser))) + .andExpect(status().isBadRequest()); + + Optional user = userRepository.findOneByEmailIgnoreCase("funky@example.com"); + assertThat(user.isPresent()).isFalse(); + } + + @Test + @Transactional + public void testRegisterInvalidEmail() throws Exception { + ManagedUserVM invalidUser = new ManagedUserVM(); + invalidUser.setLogin("bob"); + invalidUser.setPassword("password"); + invalidUser.setFirstName("Bob"); + invalidUser.setLastName("Green"); + invalidUser.setEmail("invalid");// <-- invalid + invalidUser.setActivated(true); + invalidUser.setImageUrl("http://placehold.it/50x50"); + invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE); + invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc.perform( + post("/api/register") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(invalidUser))) + .andExpect(status().isBadRequest()); + + Optional user = userRepository.findOneByLogin("bob"); + assertThat(user.isPresent()).isFalse(); + } + + @Test + @Transactional + public void testRegisterInvalidPassword() throws Exception { + ManagedUserVM invalidUser = new ManagedUserVM(); + invalidUser.setLogin("bob"); + invalidUser.setPassword("123");// password with only 3 digits + invalidUser.setFirstName("Bob"); + invalidUser.setLastName("Green"); + invalidUser.setEmail("bob@example.com"); + invalidUser.setActivated(true); + invalidUser.setImageUrl("http://placehold.it/50x50"); + invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE); + invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc.perform( + post("/api/register") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(invalidUser))) + .andExpect(status().isBadRequest()); + + Optional user = userRepository.findOneByLogin("bob"); + assertThat(user.isPresent()).isFalse(); + } + + @Test + @Transactional + public void testRegisterNullPassword() throws Exception { + ManagedUserVM invalidUser = new ManagedUserVM(); + invalidUser.setLogin("bob"); + invalidUser.setPassword(null);// invalid null password + invalidUser.setFirstName("Bob"); + invalidUser.setLastName("Green"); + invalidUser.setEmail("bob@example.com"); + invalidUser.setActivated(true); + invalidUser.setImageUrl("http://placehold.it/50x50"); + invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE); + invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc.perform( + post("/api/register") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(invalidUser))) + .andExpect(status().isBadRequest()); + + Optional user = userRepository.findOneByLogin("bob"); + assertThat(user.isPresent()).isFalse(); + } + + @Test + @Transactional + public void testRegisterDuplicateLogin() throws Exception { + // First registration + ManagedUserVM firstUser = new ManagedUserVM(); + firstUser.setLogin("alice"); + firstUser.setPassword("password"); + firstUser.setFirstName("Alice"); + firstUser.setLastName("Something"); + firstUser.setEmail("alice@example.com"); + firstUser.setImageUrl("http://placehold.it/50x50"); + firstUser.setLangKey(Constants.DEFAULT_LANGUAGE); + firstUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + // Duplicate login, different email + ManagedUserVM secondUser = new ManagedUserVM(); + secondUser.setLogin(firstUser.getLogin()); + secondUser.setPassword(firstUser.getPassword()); + secondUser.setFirstName(firstUser.getFirstName()); + secondUser.setLastName(firstUser.getLastName()); + secondUser.setEmail("alice2@example.com"); + secondUser.setImageUrl(firstUser.getImageUrl()); + secondUser.setLangKey(firstUser.getLangKey()); + secondUser.setCreatedBy(firstUser.getCreatedBy()); + secondUser.setCreatedDate(firstUser.getCreatedDate()); + secondUser.setLastModifiedBy(firstUser.getLastModifiedBy()); + secondUser.setLastModifiedDate(firstUser.getLastModifiedDate()); + secondUser.setAuthorities(new HashSet<>(firstUser.getAuthorities())); + + // First user + restMvc.perform( + post("/api/register") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(firstUser))) + .andExpect(status().isCreated()); + + // Second (non activated) user + restMvc.perform( + post("/api/register") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(secondUser))) + .andExpect(status().isCreated()); + + Optional testUser = userRepository.findOneByEmailIgnoreCase("alice2@example.com"); + assertThat(testUser.isPresent()).isTrue(); + testUser.get().setActivated(true); + userRepository.save(testUser.get()); + + // Second (already activated) user + restMvc.perform( + post("/api/register") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(secondUser))) + .andExpect(status().is4xxClientError()); + } + + @Test + @Transactional + public void testRegisterDuplicateEmail() throws Exception { + // First user + ManagedUserVM firstUser = new ManagedUserVM(); + firstUser.setLogin("test-register-duplicate-email"); + firstUser.setPassword("password"); + firstUser.setFirstName("Alice"); + firstUser.setLastName("Test"); + firstUser.setEmail("test-register-duplicate-email@example.com"); + firstUser.setImageUrl("http://placehold.it/50x50"); + firstUser.setLangKey(Constants.DEFAULT_LANGUAGE); + firstUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + // Register first user + restMvc.perform( + post("/api/register") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(firstUser))) + .andExpect(status().isCreated()); + + Optional testUser1 = userRepository.findOneByLogin("test-register-duplicate-email"); + assertThat(testUser1.isPresent()).isTrue(); + + // Duplicate email, different login + ManagedUserVM secondUser = new ManagedUserVM(); + secondUser.setLogin("test-register-duplicate-email-2"); + secondUser.setPassword(firstUser.getPassword()); + secondUser.setFirstName(firstUser.getFirstName()); + secondUser.setLastName(firstUser.getLastName()); + secondUser.setEmail(firstUser.getEmail()); + secondUser.setImageUrl(firstUser.getImageUrl()); + secondUser.setLangKey(firstUser.getLangKey()); + secondUser.setAuthorities(new HashSet<>(firstUser.getAuthorities())); + + // Register second (non activated) user + restMvc.perform( + post("/api/register") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(secondUser))) + .andExpect(status().isCreated()); + + Optional testUser2 = userRepository.findOneByLogin("test-register-duplicate-email"); + assertThat(testUser2.isPresent()).isFalse(); + + Optional testUser3 = userRepository.findOneByLogin("test-register-duplicate-email-2"); + assertThat(testUser3.isPresent()).isTrue(); + + // Duplicate email - with uppercase email address + ManagedUserVM userWithUpperCaseEmail = new ManagedUserVM(); + userWithUpperCaseEmail.setId(firstUser.getId()); + userWithUpperCaseEmail.setLogin("test-register-duplicate-email-3"); + userWithUpperCaseEmail.setPassword(firstUser.getPassword()); + userWithUpperCaseEmail.setFirstName(firstUser.getFirstName()); + userWithUpperCaseEmail.setLastName(firstUser.getLastName()); + userWithUpperCaseEmail.setEmail("TEST-register-duplicate-email@example.com"); + userWithUpperCaseEmail.setImageUrl(firstUser.getImageUrl()); + userWithUpperCaseEmail.setLangKey(firstUser.getLangKey()); + userWithUpperCaseEmail.setAuthorities(new HashSet<>(firstUser.getAuthorities())); + + // Register third (not activated) user + restMvc.perform( + post("/api/register") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(userWithUpperCaseEmail))) + .andExpect(status().isCreated()); + + Optional testUser4 = userRepository.findOneByLogin("test-register-duplicate-email-3"); + assertThat(testUser4.isPresent()).isTrue(); + assertThat(testUser4.get().getEmail()).isEqualTo("test-register-duplicate-email@example.com"); + + testUser4.get().setActivated(true); + userService.updateUser((new UserDTO(testUser4.get()))); + + // Register 4th (already activated) user + restMvc.perform( + post("/api/register") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(secondUser))) + .andExpect(status().is4xxClientError()); + } + + @Test + @Transactional + public void testRegisterAdminIsIgnored() throws Exception { + ManagedUserVM validUser = new ManagedUserVM(); + validUser.setLogin("badguy"); + validUser.setPassword("password"); + validUser.setFirstName("Bad"); + validUser.setLastName("Guy"); + validUser.setEmail("badguy@example.com"); + validUser.setActivated(true); + validUser.setImageUrl("http://placehold.it/50x50"); + validUser.setLangKey(Constants.DEFAULT_LANGUAGE); + validUser.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); + + restMvc.perform( + post("/api/register") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(validUser))) + .andExpect(status().isCreated()); + + Optional userDup = userRepository.findOneByLogin("badguy"); + assertThat(userDup.isPresent()).isTrue(); + assertThat(userDup.get().getAuthorities()).hasSize(1) + .containsExactly(authorityRepository.findById(AuthoritiesConstants.USER).get()); + } + + @Test + @Transactional + public void testActivateAccount() throws Exception { + final String activationKey = "some activation key"; + User user = new User(); + user.setLogin("activate-account"); + user.setEmail("activate-account@example.com"); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(false); + user.setActivationKey(activationKey); + + userRepository.saveAndFlush(user); + + restMvc.perform(get("/api/activate?key={activationKey}", activationKey)) + .andExpect(status().isOk()); + + user = userRepository.findOneByLogin(user.getLogin()).orElse(null); + assertThat(user.getActivated()).isTrue(); + } + + @Test + @Transactional + public void testActivateAccountWithWrongKey() throws Exception { + restMvc.perform(get("/api/activate?key=wrongActivationKey")) + .andExpect(status().isInternalServerError()); + } + + @Test + @Transactional + @WithMockUser("save-account") + public void testSaveAccount() throws Exception { + User user = new User(); + user.setLogin("save-account"); + user.setEmail("save-account@example.com"); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + + userRepository.saveAndFlush(user); + + UserDTO userDTO = new UserDTO(); + userDTO.setLogin("not-used"); + userDTO.setFirstName("firstname"); + userDTO.setLastName("lastname"); + userDTO.setEmail("save-account@example.com"); + userDTO.setActivated(false); + userDTO.setImageUrl("http://placehold.it/50x50"); + userDTO.setLangKey(Constants.DEFAULT_LANGUAGE); + userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); + + restMvc.perform( + post("/api/account") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(userDTO))) + .andExpect(status().isOk()); + + User updatedUser = userRepository.findOneByLogin(user.getLogin()).orElse(null); + assertThat(updatedUser.getFirstName()).isEqualTo(userDTO.getFirstName()); + assertThat(updatedUser.getLastName()).isEqualTo(userDTO.getLastName()); + assertThat(updatedUser.getEmail()).isEqualTo(userDTO.getEmail()); + assertThat(updatedUser.getLangKey()).isEqualTo(userDTO.getLangKey()); + assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword()); + assertThat(updatedUser.getImageUrl()).isEqualTo(userDTO.getImageUrl()); + assertThat(updatedUser.getActivated()).isEqualTo(true); + assertThat(updatedUser.getAuthorities()).isEmpty(); + } + + @Test + @Transactional + @WithMockUser("save-invalid-email") + public void testSaveInvalidEmail() throws Exception { + User user = new User(); + user.setLogin("save-invalid-email"); + user.setEmail("save-invalid-email@example.com"); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + + userRepository.saveAndFlush(user); + + UserDTO userDTO = new UserDTO(); + userDTO.setLogin("not-used"); + userDTO.setFirstName("firstname"); + userDTO.setLastName("lastname"); + userDTO.setEmail("invalid email"); + userDTO.setActivated(false); + userDTO.setImageUrl("http://placehold.it/50x50"); + userDTO.setLangKey(Constants.DEFAULT_LANGUAGE); + userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); + + restMvc.perform( + post("/api/account") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(userDTO))) + .andExpect(status().isBadRequest()); + + Assertions.assertThat(userRepository.findOneByEmailIgnoreCase("invalid email")).isNotPresent(); + } + + @Test + @Transactional + @WithMockUser("save-existing-email") + public void testSaveExistingEmail() throws Exception { + User user = new User(); + user.setLogin("save-existing-email"); + user.setEmail("save-existing-email@example.com"); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + + userRepository.saveAndFlush(user); + + User anotherUser = new User(); + anotherUser.setLogin("save-existing-email2"); + anotherUser.setEmail("save-existing-email2@example.com"); + anotherUser.setPassword(RandomStringUtils.random(60)); + anotherUser.setActivated(true); + + userRepository.saveAndFlush(anotherUser); + + UserDTO userDTO = new UserDTO(); + userDTO.setLogin("not-used"); + userDTO.setFirstName("firstname"); + userDTO.setLastName("lastname"); + userDTO.setEmail("save-existing-email2@example.com"); + userDTO.setActivated(false); + userDTO.setImageUrl("http://placehold.it/50x50"); + userDTO.setLangKey(Constants.DEFAULT_LANGUAGE); + userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); + + restMvc.perform( + post("/api/account") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(userDTO))) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin("save-existing-email").orElse(null); + assertThat(updatedUser.getEmail()).isEqualTo("save-existing-email@example.com"); + } + + @Test + @Transactional + @WithMockUser("save-existing-email-and-login") + public void testSaveExistingEmailAndLogin() throws Exception { + User user = new User(); + user.setLogin("save-existing-email-and-login"); + user.setEmail("save-existing-email-and-login@example.com"); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + + userRepository.saveAndFlush(user); + + UserDTO userDTO = new UserDTO(); + userDTO.setLogin("not-used"); + userDTO.setFirstName("firstname"); + userDTO.setLastName("lastname"); + userDTO.setEmail("save-existing-email-and-login@example.com"); + userDTO.setActivated(false); + userDTO.setImageUrl("http://placehold.it/50x50"); + userDTO.setLangKey(Constants.DEFAULT_LANGUAGE); + userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); + + restMvc.perform( + post("/api/account") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(userDTO))) + .andExpect(status().isOk()); + + User updatedUser = userRepository.findOneByLogin("save-existing-email-and-login").orElse(null); + assertThat(updatedUser.getEmail()).isEqualTo("save-existing-email-and-login@example.com"); + } + + @Test + @Transactional + @WithMockUser("change-password-wrong-existing-password") + public void testChangePasswordWrongExistingPassword() throws Exception { + User user = new User(); + String currentPassword = RandomStringUtils.random(60); + user.setPassword(passwordEncoder.encode(currentPassword)); + user.setLogin("change-password-wrong-existing-password"); + user.setEmail("change-password-wrong-existing-password@example.com"); + userRepository.saveAndFlush(user); + + restMvc.perform(post("/api/account/change-password") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO("1"+currentPassword, "new password")))) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin("change-password-wrong-existing-password").orElse(null); + assertThat(passwordEncoder.matches("new password", updatedUser.getPassword())).isFalse(); + assertThat(passwordEncoder.matches(currentPassword, updatedUser.getPassword())).isTrue(); + } + + @Test + @Transactional + @WithMockUser("change-password") + public void testChangePassword() throws Exception { + User user = new User(); + String currentPassword = RandomStringUtils.random(60); + user.setPassword(passwordEncoder.encode(currentPassword)); + user.setLogin("change-password"); + user.setEmail("change-password@example.com"); + userRepository.saveAndFlush(user); + + restMvc.perform(post("/api/account/change-password") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, "new password")))) + .andExpect(status().isOk()); + + User updatedUser = userRepository.findOneByLogin("change-password").orElse(null); + assertThat(passwordEncoder.matches("new password", updatedUser.getPassword())).isTrue(); + } + + @Test + @Transactional + @WithMockUser("change-password-too-small") + public void testChangePasswordTooSmall() throws Exception { + User user = new User(); + String currentPassword = RandomStringUtils.random(60); + user.setPassword(passwordEncoder.encode(currentPassword)); + user.setLogin("change-password-too-small"); + user.setEmail("change-password-too-small@example.com"); + userRepository.saveAndFlush(user); + + String newPassword = RandomStringUtils.random(ManagedUserVM.PASSWORD_MIN_LENGTH - 1); + + restMvc.perform(post("/api/account/change-password") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, newPassword)))) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin("change-password-too-small").orElse(null); + assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword()); + } + + @Test + @Transactional + @WithMockUser("change-password-too-long") + public void testChangePasswordTooLong() throws Exception { + User user = new User(); + String currentPassword = RandomStringUtils.random(60); + user.setPassword(passwordEncoder.encode(currentPassword)); + user.setLogin("change-password-too-long"); + user.setEmail("change-password-too-long@example.com"); + userRepository.saveAndFlush(user); + + String newPassword = RandomStringUtils.random(ManagedUserVM.PASSWORD_MAX_LENGTH + 1); + + restMvc.perform(post("/api/account/change-password") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, newPassword)))) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin("change-password-too-long").orElse(null); + assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword()); + } + + @Test + @Transactional + @WithMockUser("change-password-empty") + public void testChangePasswordEmpty() throws Exception { + User user = new User(); + String currentPassword = RandomStringUtils.random(60); + user.setPassword(passwordEncoder.encode(currentPassword)); + user.setLogin("change-password-empty"); + user.setEmail("change-password-empty@example.com"); + userRepository.saveAndFlush(user); + + restMvc.perform(post("/api/account/change-password") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, "")))) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin("change-password-empty").orElse(null); + assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword()); + } + + @Test + @Transactional + public void testRequestPasswordReset() throws Exception { + User user = new User(); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + user.setLogin("password-reset"); + user.setEmail("password-reset@example.com"); + userRepository.saveAndFlush(user); + + restMvc.perform(post("/api/account/reset-password/init") + .content("password-reset@example.com")) + .andExpect(status().isOk()); + } + + @Test + @Transactional + public void testRequestPasswordResetUpperCaseEmail() throws Exception { + User user = new User(); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + user.setLogin("password-reset"); + user.setEmail("password-reset@example.com"); + userRepository.saveAndFlush(user); + + restMvc.perform(post("/api/account/reset-password/init") + .content("password-reset@EXAMPLE.COM")) + .andExpect(status().isOk()); + } + + @Test + public void testRequestPasswordResetWrongEmail() throws Exception { + restMvc.perform( + post("/api/account/reset-password/init") + .content("password-reset-wrong-email@example.com")) + .andExpect(status().isBadRequest()); + } + + @Test + @Transactional + public void testFinishPasswordReset() throws Exception { + User user = new User(); + user.setPassword(RandomStringUtils.random(60)); + user.setLogin("finish-password-reset"); + user.setEmail("finish-password-reset@example.com"); + user.setResetDate(Instant.now().plusSeconds(60)); + user.setResetKey("reset key"); + userRepository.saveAndFlush(user); + + KeyAndPasswordVM keyAndPassword = new KeyAndPasswordVM(); + keyAndPassword.setKey(user.getResetKey()); + keyAndPassword.setNewPassword("new password"); + + restMvc.perform( + post("/api/account/reset-password/finish") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(keyAndPassword))) + .andExpect(status().isOk()); + + User updatedUser = userRepository.findOneByLogin(user.getLogin()).orElse(null); + assertThat(passwordEncoder.matches(keyAndPassword.getNewPassword(), updatedUser.getPassword())).isTrue(); + } + + @Test + @Transactional + public void testFinishPasswordResetTooSmall() throws Exception { + User user = new User(); + user.setPassword(RandomStringUtils.random(60)); + user.setLogin("finish-password-reset-too-small"); + user.setEmail("finish-password-reset-too-small@example.com"); + user.setResetDate(Instant.now().plusSeconds(60)); + user.setResetKey("reset key too small"); + userRepository.saveAndFlush(user); + + KeyAndPasswordVM keyAndPassword = new KeyAndPasswordVM(); + keyAndPassword.setKey(user.getResetKey()); + keyAndPassword.setNewPassword("foo"); + + restMvc.perform( + post("/api/account/reset-password/finish") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(keyAndPassword))) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin(user.getLogin()).orElse(null); + assertThat(passwordEncoder.matches(keyAndPassword.getNewPassword(), updatedUser.getPassword())).isFalse(); + } + + + @Test + @Transactional + public void testFinishPasswordResetWrongKey() throws Exception { + KeyAndPasswordVM keyAndPassword = new KeyAndPasswordVM(); + keyAndPassword.setKey("wrong reset key"); + keyAndPassword.setNewPassword("new password"); + + restMvc.perform( + post("/api/account/reset-password/finish") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(keyAndPassword))) + .andExpect(status().isInternalServerError()); + } +} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/AccountResourceIntegrationTest.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/AccountResourceIntegrationTest.java similarity index 97% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/AccountResourceIntegrationTest.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/AccountResourceIntegrationTest.java index f591b7ecbf..adc7deec18 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/AccountResourceIntegrationTest.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/AccountResourceIntegrationTest.java @@ -1,21 +1,23 @@ -package com.baeldung.jhipster5.web.rest; +package com.baeldung.jhipster6.web.rest; + +import com.baeldung.jhipster6.BookstoreApp; +import com.baeldung.jhipster6.config.Constants; +import com.baeldung.jhipster6.domain.Authority; +import com.baeldung.jhipster6.domain.User; +import com.baeldung.jhipster6.repository.AuthorityRepository; +import com.baeldung.jhipster6.repository.UserRepository; +import com.baeldung.jhipster6.security.AuthoritiesConstants; +import com.baeldung.jhipster6.service.MailService; +import com.baeldung.jhipster6.service.UserService; +import com.baeldung.jhipster6.service.dto.PasswordChangeDTO; +import com.baeldung.jhipster6.service.dto.UserDTO; +import com.baeldung.jhipster6.web.rest.errors.ExceptionTranslator; +import com.baeldung.jhipster6.web.rest.vm.KeyAndPasswordVM; +import com.baeldung.jhipster6.web.rest.vm.ManagedUserVM; -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.config.Constants; -import com.baeldung.jhipster5.domain.Authority; -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.repository.AuthorityRepository; -import com.baeldung.jhipster5.repository.UserRepository; -import com.baeldung.jhipster5.security.AuthoritiesConstants; -import com.baeldung.jhipster5.service.MailService; -import com.baeldung.jhipster5.service.UserService; -import com.baeldung.jhipster5.service.dto.PasswordChangeDTO; -import com.baeldung.jhipster5.service.dto.UserDTO; -import com.baeldung.jhipster5.web.rest.errors.ExceptionTranslator; -import com.baeldung.jhipster5.web.rest.vm.KeyAndPasswordVM; -import com.baeldung.jhipster5.web.rest.vm.ManagedUserVM; import org.apache.commons.lang3.RandomStringUtils; +import org.assertj.core.api.Assertions; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -533,7 +535,7 @@ public class AccountResourceIntegrationTest { .content(TestUtil.convertObjectToJsonBytes(userDTO))) .andExpect(status().isBadRequest()); - assertThat(userRepository.findOneByEmailIgnoreCase("invalid email")).isNotPresent(); + Assertions.assertThat(userRepository.findOneByEmailIgnoreCase("invalid email")).isNotPresent(); } @Test diff --git a/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/AuditResourceIT.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/AuditResourceIT.java new file mode 100644 index 0000000000..d9c82f48a5 --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/AuditResourceIT.java @@ -0,0 +1,161 @@ +package com.baeldung.jhipster6.web.rest; + +import com.baeldung.jhipster6.BookstoreApp; +import com.baeldung.jhipster6.config.audit.AuditEventConverter; +import com.baeldung.jhipster6.domain.PersistentAuditEvent; +import com.baeldung.jhipster6.repository.PersistenceAuditEventRepository; + +import com.baeldung.jhipster6.service.AuditEventService; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.web.PageableHandlerMethodArgumentResolver; +import org.springframework.format.support.FormattingConversionService; +import org.springframework.http.MediaType; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.transaction.annotation.Transactional; + +import java.time.Instant; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +/** + * Integration tests for the {@link AuditResource} REST controller. + */ +@SpringBootTest(classes = BookstoreApp.class) +@Transactional +public class AuditResourceIT { + + private static final String SAMPLE_PRINCIPAL = "SAMPLE_PRINCIPAL"; + private static final String SAMPLE_TYPE = "SAMPLE_TYPE"; + private static final Instant SAMPLE_TIMESTAMP = Instant.parse("2015-08-04T10:11:30Z"); + private static final long SECONDS_PER_DAY = 60 * 60 * 24; + + @Autowired + private PersistenceAuditEventRepository auditEventRepository; + + @Autowired + private AuditEventConverter auditEventConverter; + + @Autowired + private MappingJackson2HttpMessageConverter jacksonMessageConverter; + + @Autowired + @Qualifier("mvcConversionService") + private FormattingConversionService formattingConversionService; + + @Autowired + private PageableHandlerMethodArgumentResolver pageableArgumentResolver; + + private PersistentAuditEvent auditEvent; + + private MockMvc restAuditMockMvc; + + @BeforeEach + public void setup() { + MockitoAnnotations.initMocks(this); + AuditEventService auditEventService = + new AuditEventService(auditEventRepository, auditEventConverter); + AuditResource auditResource = new AuditResource(auditEventService); + this.restAuditMockMvc = MockMvcBuilders.standaloneSetup(auditResource) + .setCustomArgumentResolvers(pageableArgumentResolver) + .setConversionService(formattingConversionService) + .setMessageConverters(jacksonMessageConverter).build(); + } + + @BeforeEach + public void initTest() { + auditEventRepository.deleteAll(); + auditEvent = new PersistentAuditEvent(); + auditEvent.setAuditEventType(SAMPLE_TYPE); + auditEvent.setPrincipal(SAMPLE_PRINCIPAL); + auditEvent.setAuditEventDate(SAMPLE_TIMESTAMP); + } + + @Test + public void getAllAudits() throws Exception { + // Initialize the database + auditEventRepository.save(auditEvent); + + // Get all the audits + restAuditMockMvc.perform(get("/management/audits")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) + .andExpect(jsonPath("$.[*].principal").value(hasItem(SAMPLE_PRINCIPAL))); + } + + @Test + public void getAudit() throws Exception { + // Initialize the database + auditEventRepository.save(auditEvent); + + // Get the audit + restAuditMockMvc.perform(get("/management/audits/{id}", auditEvent.getId())) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) + .andExpect(jsonPath("$.principal").value(SAMPLE_PRINCIPAL)); + } + + @Test + public void getAuditsByDate() throws Exception { + // Initialize the database + auditEventRepository.save(auditEvent); + + // Generate dates for selecting audits by date, making sure the period will contain the audit + String fromDate = SAMPLE_TIMESTAMP.minusSeconds(SECONDS_PER_DAY).toString().substring(0, 10); + String toDate = SAMPLE_TIMESTAMP.plusSeconds(SECONDS_PER_DAY).toString().substring(0, 10); + + // Get the audit + restAuditMockMvc.perform(get("/management/audits?fromDate="+fromDate+"&toDate="+toDate)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) + .andExpect(jsonPath("$.[*].principal").value(hasItem(SAMPLE_PRINCIPAL))); + } + + @Test + public void getNonExistingAuditsByDate() throws Exception { + // Initialize the database + auditEventRepository.save(auditEvent); + + // Generate dates for selecting audits by date, making sure the period will not contain the sample audit + String fromDate = SAMPLE_TIMESTAMP.minusSeconds(2*SECONDS_PER_DAY).toString().substring(0, 10); + String toDate = SAMPLE_TIMESTAMP.minusSeconds(SECONDS_PER_DAY).toString().substring(0, 10); + + // Query audits but expect no results + restAuditMockMvc.perform(get("/management/audits?fromDate=" + fromDate + "&toDate=" + toDate)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) + .andExpect(header().string("X-Total-Count", "0")); + } + + @Test + public void getNonExistingAudit() throws Exception { + // Get the audit + restAuditMockMvc.perform(get("/management/audits/{id}", Long.MAX_VALUE)) + .andExpect(status().isNotFound()); + } + + @Test + @Transactional + public void testPersistentAuditEventEquals() throws Exception { + TestUtil.equalsVerifier(PersistentAuditEvent.class); + PersistentAuditEvent auditEvent1 = new PersistentAuditEvent(); + auditEvent1.setId(1L); + PersistentAuditEvent auditEvent2 = new PersistentAuditEvent(); + auditEvent2.setId(auditEvent1.getId()); + assertThat(auditEvent1).isEqualTo(auditEvent2); + auditEvent2.setId(2L); + assertThat(auditEvent1).isNotEqualTo(auditEvent2); + auditEvent1.setId(null); + assertThat(auditEvent1).isNotEqualTo(auditEvent2); + } +} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/AuditResourceIntegrationTest.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/AuditResourceIntegrationTest.java similarity index 95% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/AuditResourceIntegrationTest.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/AuditResourceIntegrationTest.java index 05d8f9d503..d7bb995e1c 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/AuditResourceIntegrationTest.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/AuditResourceIntegrationTest.java @@ -1,10 +1,11 @@ -package com.baeldung.jhipster5.web.rest; +package com.baeldung.jhipster6.web.rest; + +import com.baeldung.jhipster6.BookstoreApp; +import com.baeldung.jhipster6.config.audit.AuditEventConverter; +import com.baeldung.jhipster6.domain.PersistentAuditEvent; +import com.baeldung.jhipster6.repository.PersistenceAuditEventRepository; +import com.baeldung.jhipster6.service.AuditEventService; -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.config.audit.AuditEventConverter; -import com.baeldung.jhipster5.domain.PersistentAuditEvent; -import com.baeldung.jhipster5.repository.PersistenceAuditEventRepository; -import com.baeldung.jhipster5.service.AuditEventService; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/BookResourceIntegrationTest.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/BookResourceIntegrationTest.java similarity index 96% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/BookResourceIntegrationTest.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/BookResourceIntegrationTest.java index 4f5cb25cdb..429d937f26 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/BookResourceIntegrationTest.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/BookResourceIntegrationTest.java @@ -1,13 +1,13 @@ -package com.baeldung.jhipster5.web.rest; +package com.baeldung.jhipster6.web.rest; -import com.baeldung.jhipster5.BookstoreApp; +import com.baeldung.jhipster6.BookstoreApp; -import com.baeldung.jhipster5.domain.Book; -import com.baeldung.jhipster5.repository.BookRepository; -import com.baeldung.jhipster5.service.BookService; -import com.baeldung.jhipster5.service.dto.BookDTO; -import com.baeldung.jhipster5.service.mapper.BookMapper; -import com.baeldung.jhipster5.web.rest.errors.ExceptionTranslator; +import com.baeldung.jhipster6.domain.Book; +import com.baeldung.jhipster6.repository.BookRepository; +import com.baeldung.jhipster6.service.BookService; +import com.baeldung.jhipster6.service.dto.BookDTO; +import com.baeldung.jhipster6.service.mapper.BookMapper; +import com.baeldung.jhipster6.web.rest.errors.ExceptionTranslator; import org.junit.Before; import org.junit.Test; @@ -29,8 +29,6 @@ import java.time.LocalDate; import java.time.ZoneId; import java.util.List; - -import static com.baeldung.jhipster5.web.rest.TestUtil.createFormattingConversionService; import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.Matchers.hasItem; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; @@ -95,7 +93,7 @@ public class BookResourceIntegrationTest { this.restBookMockMvc = MockMvcBuilders.standaloneSetup(bookResource) .setCustomArgumentResolvers(pageableArgumentResolver) .setControllerAdvice(exceptionTranslator) - .setConversionService(createFormattingConversionService()) + .setConversionService(TestUtil.createFormattingConversionService()) .setMessageConverters(jacksonMessageConverter) .setValidator(validator).build(); } @@ -276,7 +274,7 @@ public class BookResourceIntegrationTest { .andExpect(jsonPath("$.[*].quantity").value(hasItem(DEFAULT_QUANTITY))) .andExpect(jsonPath("$.[*].price").value(hasItem(DEFAULT_PRICE.doubleValue()))); } - + @Test @Transactional public void getBook() throws Exception { diff --git a/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/ClientForwardControllerIT.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/ClientForwardControllerIT.java new file mode 100644 index 0000000000..9dcc2e6055 --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/ClientForwardControllerIT.java @@ -0,0 +1,67 @@ +package com.baeldung.jhipster6.web.rest; + +import com.baeldung.jhipster6.BookstoreApp; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.forwardedUrl; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +/** + * Integration tests for the {@link ClientForwardController} REST controller. + */ +@SpringBootTest(classes = BookstoreApp.class) +public class ClientForwardControllerIT { + + private MockMvc restMockMvc; + + @BeforeEach + public void setup() { + ClientForwardController clientForwardController = new ClientForwardController(); + this.restMockMvc = MockMvcBuilders + .standaloneSetup(clientForwardController, new TestController()) + .build(); + } + + @Test + public void getBackendEndpoint() throws Exception { + restMockMvc.perform(get("/test")) + .andExpect(status().isOk()) + .andExpect(content().contentTypeCompatibleWith(MediaType.TEXT_PLAIN_VALUE)) + .andExpect(content().string("test")); + } + + @Test + public void getClientEndpoint() throws Exception { + ResultActions perform = restMockMvc.perform(get("/non-existant-mapping")); + perform + .andExpect(status().isOk()) + .andExpect(forwardedUrl("/")); + } + + @Test + public void getNestedClientEndpoint() throws Exception { + restMockMvc.perform(get("/admin/user-management")) + .andExpect(status().isOk()) + .andExpect(forwardedUrl("/")); + } + + @RestController + public static class TestController { + + @RequestMapping(value = "/test") + public String test() { + return "test"; + } + } +} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/LogsResourceIntegrationTest.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/LogsResourceIntegrationTest.java similarity index 94% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/LogsResourceIntegrationTest.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/LogsResourceIntegrationTest.java index b045f52f87..a9aa9b27c1 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/LogsResourceIntegrationTest.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/LogsResourceIntegrationTest.java @@ -1,7 +1,8 @@ -package com.baeldung.jhipster5.web.rest; +package com.baeldung.jhipster6.web.rest; + +import com.baeldung.jhipster6.BookstoreApp; +import com.baeldung.jhipster6.web.rest.vm.LoggerVM; -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.web.rest.vm.LoggerVM; import ch.qos.logback.classic.AsyncAppender; import ch.qos.logback.classic.LoggerContext; import org.junit.Before; diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/TestUtil.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/TestUtil.java similarity index 99% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/TestUtil.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/TestUtil.java index 403bb9c9b0..50c6cc24a6 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/TestUtil.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/TestUtil.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.web.rest; +package com.baeldung.jhipster6.web.rest; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/UserJWTControllerIT.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/UserJWTControllerIT.java new file mode 100644 index 0000000000..3ad59b3166 --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/UserJWTControllerIT.java @@ -0,0 +1,120 @@ +package com.baeldung.jhipster6.web.rest; + +import com.baeldung.jhipster6.BookstoreApp; +import com.baeldung.jhipster6.domain.User; +import com.baeldung.jhipster6.repository.UserRepository; +import com.baeldung.jhipster6.security.jwt.TokenProvider; +import com.baeldung.jhipster6.web.rest.errors.ExceptionTranslator; +import com.baeldung.jhipster6.web.rest.vm.LoginVM; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.transaction.annotation.Transactional; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.hamcrest.Matchers.nullValue; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +/** + * Integration tests for the {@link UserJWTController} REST controller. + */ +@SpringBootTest(classes = BookstoreApp.class) +public class UserJWTControllerIT { + + @Autowired + private TokenProvider tokenProvider; + + @Autowired + private AuthenticationManager authenticationManager; + + @Autowired + private UserRepository userRepository; + + @Autowired + private PasswordEncoder passwordEncoder; + + @Autowired + private ExceptionTranslator exceptionTranslator; + + private MockMvc mockMvc; + + @BeforeEach + public void setup() { + UserJWTController userJWTController = new UserJWTController(tokenProvider, authenticationManager); + this.mockMvc = MockMvcBuilders.standaloneSetup(userJWTController) + .setControllerAdvice(exceptionTranslator) + .build(); + } + + @Test + @Transactional + public void testAuthorize() throws Exception { + User user = new User(); + user.setLogin("user-jwt-controller"); + user.setEmail("user-jwt-controller@example.com"); + user.setActivated(true); + user.setPassword(passwordEncoder.encode("test")); + + userRepository.saveAndFlush(user); + + LoginVM login = new LoginVM(); + login.setUsername("user-jwt-controller"); + login.setPassword("test"); + mockMvc.perform(post("/api/authenticate") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(login))) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id_token").isString()) + .andExpect(jsonPath("$.id_token").isNotEmpty()) + .andExpect(header().string("Authorization", not(nullValue()))) + .andExpect(header().string("Authorization", not(isEmptyString()))); + } + + @Test + @Transactional + public void testAuthorizeWithRememberMe() throws Exception { + User user = new User(); + user.setLogin("user-jwt-controller-remember-me"); + user.setEmail("user-jwt-controller-remember-me@example.com"); + user.setActivated(true); + user.setPassword(passwordEncoder.encode("test")); + + userRepository.saveAndFlush(user); + + LoginVM login = new LoginVM(); + login.setUsername("user-jwt-controller-remember-me"); + login.setPassword("test"); + login.setRememberMe(true); + mockMvc.perform(post("/api/authenticate") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(login))) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id_token").isString()) + .andExpect(jsonPath("$.id_token").isNotEmpty()) + .andExpect(header().string("Authorization", not(nullValue()))) + .andExpect(header().string("Authorization", not(isEmptyString()))); + } + + @Test + public void testAuthorizeFails() throws Exception { + LoginVM login = new LoginVM(); + login.setUsername("wrong-user"); + login.setPassword("wrong password"); + mockMvc.perform(post("/api/authenticate") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(login))) + .andExpect(status().isUnauthorized()) + .andExpect(jsonPath("$.id_token").doesNotExist()) + .andExpect(header().doesNotExist("Authorization")); + } +} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/UserJWTControllerIntegrationTest.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/UserJWTControllerIntegrationTest.java similarity index 92% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/UserJWTControllerIntegrationTest.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/UserJWTControllerIntegrationTest.java index 7cfc0e19fc..bf62d29f1b 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/UserJWTControllerIntegrationTest.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/UserJWTControllerIntegrationTest.java @@ -1,11 +1,12 @@ -package com.baeldung.jhipster5.web.rest; +package com.baeldung.jhipster6.web.rest; + +import com.baeldung.jhipster6.BookstoreApp; +import com.baeldung.jhipster6.domain.User; +import com.baeldung.jhipster6.repository.UserRepository; +import com.baeldung.jhipster6.security.jwt.TokenProvider; +import com.baeldung.jhipster6.web.rest.errors.ExceptionTranslator; +import com.baeldung.jhipster6.web.rest.vm.LoginVM; -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.repository.UserRepository; -import com.baeldung.jhipster5.security.jwt.TokenProvider; -import com.baeldung.jhipster5.web.rest.errors.ExceptionTranslator; -import com.baeldung.jhipster5.web.rest.vm.LoginVM; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/UserResourceIT.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/UserResourceIT.java new file mode 100644 index 0000000000..420dcbbd77 --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/UserResourceIT.java @@ -0,0 +1,592 @@ +package com.baeldung.jhipster6.web.rest; + +import com.baeldung.jhipster6.BookstoreApp; +import com.baeldung.jhipster6.domain.Authority; +import com.baeldung.jhipster6.domain.User; +import com.baeldung.jhipster6.repository.UserRepository; +import com.baeldung.jhipster6.security.AuthoritiesConstants; +import com.baeldung.jhipster6.service.MailService; +import com.baeldung.jhipster6.service.UserService; +import com.baeldung.jhipster6.service.dto.UserDTO; +import com.baeldung.jhipster6.service.mapper.UserMapper; +import com.baeldung.jhipster6.web.rest.errors.ExceptionTranslator; +import com.baeldung.jhipster6.web.rest.vm.ManagedUserVM; + +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.web.PageableHandlerMethodArgumentResolver; +import org.springframework.http.MediaType; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.EntityManager; +import java.time.Instant; +import java.util.*; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.hasItems; +import static org.hamcrest.Matchers.hasItem; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +/** + * Integration tests for the {@link UserResource} REST controller. + */ +@SpringBootTest(classes = BookstoreApp.class) +public class UserResourceIT { + + private static final String DEFAULT_LOGIN = "johndoe"; + private static final String UPDATED_LOGIN = "jhipster"; + + private static final Long DEFAULT_ID = 1L; + + private static final String DEFAULT_PASSWORD = "passjohndoe"; + private static final String UPDATED_PASSWORD = "passjhipster"; + + private static final String DEFAULT_EMAIL = "johndoe@localhost"; + private static final String UPDATED_EMAIL = "jhipster@localhost"; + + private static final String DEFAULT_FIRSTNAME = "john"; + private static final String UPDATED_FIRSTNAME = "jhipsterFirstName"; + + private static final String DEFAULT_LASTNAME = "doe"; + private static final String UPDATED_LASTNAME = "jhipsterLastName"; + + private static final String DEFAULT_IMAGEURL = "http://placehold.it/50x50"; + private static final String UPDATED_IMAGEURL = "http://placehold.it/40x40"; + + private static final String DEFAULT_LANGKEY = "en"; + private static final String UPDATED_LANGKEY = "fr"; + + @Autowired + private UserRepository userRepository; + + @Autowired + private MailService mailService; + + @Autowired + private UserService userService; + + @Autowired + private UserMapper userMapper; + + @Autowired + private MappingJackson2HttpMessageConverter jacksonMessageConverter; + + @Autowired + private PageableHandlerMethodArgumentResolver pageableArgumentResolver; + + @Autowired + private ExceptionTranslator exceptionTranslator; + + @Autowired + private EntityManager em; + + private MockMvc restUserMockMvc; + + private User user; + + @BeforeEach + public void setup() { + UserResource userResource = new UserResource(userService, userRepository, mailService); + + this.restUserMockMvc = MockMvcBuilders.standaloneSetup(userResource) + .setCustomArgumentResolvers(pageableArgumentResolver) + .setControllerAdvice(exceptionTranslator) + .setMessageConverters(jacksonMessageConverter) + .build(); + } + + /** + * Create a User. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which has a required relationship to the User entity. + */ + public static User createEntity(EntityManager em) { + User user = new User(); + user.setLogin(DEFAULT_LOGIN + RandomStringUtils.randomAlphabetic(5)); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + user.setEmail(RandomStringUtils.randomAlphabetic(5) + DEFAULT_EMAIL); + user.setFirstName(DEFAULT_FIRSTNAME); + user.setLastName(DEFAULT_LASTNAME); + user.setImageUrl(DEFAULT_IMAGEURL); + user.setLangKey(DEFAULT_LANGKEY); + return user; + } + + @BeforeEach + public void initTest() { + user = createEntity(em); + user.setLogin(DEFAULT_LOGIN); + user.setEmail(DEFAULT_EMAIL); + } + + @Test + @Transactional + public void createUser() throws Exception { + int databaseSizeBeforeCreate = userRepository.findAll().size(); + + // Create the User + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setLogin(DEFAULT_LOGIN); + managedUserVM.setPassword(DEFAULT_PASSWORD); + managedUserVM.setFirstName(DEFAULT_FIRSTNAME); + managedUserVM.setLastName(DEFAULT_LASTNAME); + managedUserVM.setEmail(DEFAULT_EMAIL); + managedUserVM.setActivated(true); + managedUserVM.setImageUrl(DEFAULT_IMAGEURL); + managedUserVM.setLangKey(DEFAULT_LANGKEY); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc.perform(post("/api/users") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isCreated()); + + // Validate the User in the database + List userList = userRepository.findAll(); + assertThat(userList).hasSize(databaseSizeBeforeCreate + 1); + User testUser = userList.get(userList.size() - 1); + assertThat(testUser.getLogin()).isEqualTo(DEFAULT_LOGIN); + assertThat(testUser.getFirstName()).isEqualTo(DEFAULT_FIRSTNAME); + assertThat(testUser.getLastName()).isEqualTo(DEFAULT_LASTNAME); + assertThat(testUser.getEmail()).isEqualTo(DEFAULT_EMAIL); + assertThat(testUser.getImageUrl()).isEqualTo(DEFAULT_IMAGEURL); + assertThat(testUser.getLangKey()).isEqualTo(DEFAULT_LANGKEY); + } + + @Test + @Transactional + public void createUserWithExistingId() throws Exception { + int databaseSizeBeforeCreate = userRepository.findAll().size(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setId(1L); + managedUserVM.setLogin(DEFAULT_LOGIN); + managedUserVM.setPassword(DEFAULT_PASSWORD); + managedUserVM.setFirstName(DEFAULT_FIRSTNAME); + managedUserVM.setLastName(DEFAULT_LASTNAME); + managedUserVM.setEmail(DEFAULT_EMAIL); + managedUserVM.setActivated(true); + managedUserVM.setImageUrl(DEFAULT_IMAGEURL); + managedUserVM.setLangKey(DEFAULT_LANGKEY); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + // An entity with an existing ID cannot be created, so this API call must fail + restUserMockMvc.perform(post("/api/users") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isBadRequest()); + + // Validate the User in the database + List userList = userRepository.findAll(); + assertThat(userList).hasSize(databaseSizeBeforeCreate); + } + + @Test + @Transactional + public void createUserWithExistingLogin() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + int databaseSizeBeforeCreate = userRepository.findAll().size(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setLogin(DEFAULT_LOGIN);// this login should already be used + managedUserVM.setPassword(DEFAULT_PASSWORD); + managedUserVM.setFirstName(DEFAULT_FIRSTNAME); + managedUserVM.setLastName(DEFAULT_LASTNAME); + managedUserVM.setEmail("anothermail@localhost"); + managedUserVM.setActivated(true); + managedUserVM.setImageUrl(DEFAULT_IMAGEURL); + managedUserVM.setLangKey(DEFAULT_LANGKEY); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + // Create the User + restUserMockMvc.perform(post("/api/users") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isBadRequest()); + + // Validate the User in the database + List userList = userRepository.findAll(); + assertThat(userList).hasSize(databaseSizeBeforeCreate); + } + + @Test + @Transactional + public void createUserWithExistingEmail() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + int databaseSizeBeforeCreate = userRepository.findAll().size(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setLogin("anotherlogin"); + managedUserVM.setPassword(DEFAULT_PASSWORD); + managedUserVM.setFirstName(DEFAULT_FIRSTNAME); + managedUserVM.setLastName(DEFAULT_LASTNAME); + managedUserVM.setEmail(DEFAULT_EMAIL);// this email should already be used + managedUserVM.setActivated(true); + managedUserVM.setImageUrl(DEFAULT_IMAGEURL); + managedUserVM.setLangKey(DEFAULT_LANGKEY); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + // Create the User + restUserMockMvc.perform(post("/api/users") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isBadRequest()); + + // Validate the User in the database + List userList = userRepository.findAll(); + assertThat(userList).hasSize(databaseSizeBeforeCreate); + } + + @Test + @Transactional + public void getAllUsers() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + + // Get all the users + restUserMockMvc.perform(get("/api/users?sort=id,desc") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) + .andExpect(jsonPath("$.[*].login").value(hasItem(DEFAULT_LOGIN))) + .andExpect(jsonPath("$.[*].firstName").value(hasItem(DEFAULT_FIRSTNAME))) + .andExpect(jsonPath("$.[*].lastName").value(hasItem(DEFAULT_LASTNAME))) + .andExpect(jsonPath("$.[*].email").value(hasItem(DEFAULT_EMAIL))) + .andExpect(jsonPath("$.[*].imageUrl").value(hasItem(DEFAULT_IMAGEURL))) + .andExpect(jsonPath("$.[*].langKey").value(hasItem(DEFAULT_LANGKEY))); + } + + @Test + @Transactional + public void getUser() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + + // Get the user + restUserMockMvc.perform(get("/api/users/{login}", user.getLogin())) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) + .andExpect(jsonPath("$.login").value(user.getLogin())) + .andExpect(jsonPath("$.firstName").value(DEFAULT_FIRSTNAME)) + .andExpect(jsonPath("$.lastName").value(DEFAULT_LASTNAME)) + .andExpect(jsonPath("$.email").value(DEFAULT_EMAIL)) + .andExpect(jsonPath("$.imageUrl").value(DEFAULT_IMAGEURL)) + .andExpect(jsonPath("$.langKey").value(DEFAULT_LANGKEY)); + } + + @Test + @Transactional + public void getNonExistingUser() throws Exception { + restUserMockMvc.perform(get("/api/users/unknown")) + .andExpect(status().isNotFound()); + } + + @Test + @Transactional + public void updateUser() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + int databaseSizeBeforeUpdate = userRepository.findAll().size(); + + // Update the user + User updatedUser = userRepository.findById(user.getId()).get(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setId(updatedUser.getId()); + managedUserVM.setLogin(updatedUser.getLogin()); + managedUserVM.setPassword(UPDATED_PASSWORD); + managedUserVM.setFirstName(UPDATED_FIRSTNAME); + managedUserVM.setLastName(UPDATED_LASTNAME); + managedUserVM.setEmail(UPDATED_EMAIL); + managedUserVM.setActivated(updatedUser.getActivated()); + managedUserVM.setImageUrl(UPDATED_IMAGEURL); + managedUserVM.setLangKey(UPDATED_LANGKEY); + managedUserVM.setCreatedBy(updatedUser.getCreatedBy()); + managedUserVM.setCreatedDate(updatedUser.getCreatedDate()); + managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy()); + managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate()); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc.perform(put("/api/users") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isOk()); + + // Validate the User in the database + List userList = userRepository.findAll(); + assertThat(userList).hasSize(databaseSizeBeforeUpdate); + User testUser = userList.get(userList.size() - 1); + assertThat(testUser.getFirstName()).isEqualTo(UPDATED_FIRSTNAME); + assertThat(testUser.getLastName()).isEqualTo(UPDATED_LASTNAME); + assertThat(testUser.getEmail()).isEqualTo(UPDATED_EMAIL); + assertThat(testUser.getImageUrl()).isEqualTo(UPDATED_IMAGEURL); + assertThat(testUser.getLangKey()).isEqualTo(UPDATED_LANGKEY); + } + + @Test + @Transactional + public void updateUserLogin() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + int databaseSizeBeforeUpdate = userRepository.findAll().size(); + + // Update the user + User updatedUser = userRepository.findById(user.getId()).get(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setId(updatedUser.getId()); + managedUserVM.setLogin(UPDATED_LOGIN); + managedUserVM.setPassword(UPDATED_PASSWORD); + managedUserVM.setFirstName(UPDATED_FIRSTNAME); + managedUserVM.setLastName(UPDATED_LASTNAME); + managedUserVM.setEmail(UPDATED_EMAIL); + managedUserVM.setActivated(updatedUser.getActivated()); + managedUserVM.setImageUrl(UPDATED_IMAGEURL); + managedUserVM.setLangKey(UPDATED_LANGKEY); + managedUserVM.setCreatedBy(updatedUser.getCreatedBy()); + managedUserVM.setCreatedDate(updatedUser.getCreatedDate()); + managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy()); + managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate()); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc.perform(put("/api/users") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isOk()); + + // Validate the User in the database + List userList = userRepository.findAll(); + assertThat(userList).hasSize(databaseSizeBeforeUpdate); + User testUser = userList.get(userList.size() - 1); + assertThat(testUser.getLogin()).isEqualTo(UPDATED_LOGIN); + assertThat(testUser.getFirstName()).isEqualTo(UPDATED_FIRSTNAME); + assertThat(testUser.getLastName()).isEqualTo(UPDATED_LASTNAME); + assertThat(testUser.getEmail()).isEqualTo(UPDATED_EMAIL); + assertThat(testUser.getImageUrl()).isEqualTo(UPDATED_IMAGEURL); + assertThat(testUser.getLangKey()).isEqualTo(UPDATED_LANGKEY); + } + + @Test + @Transactional + public void updateUserExistingEmail() throws Exception { + // Initialize the database with 2 users + userRepository.saveAndFlush(user); + + User anotherUser = new User(); + anotherUser.setLogin("jhipster"); + anotherUser.setPassword(RandomStringUtils.random(60)); + anotherUser.setActivated(true); + anotherUser.setEmail("jhipster@localhost"); + anotherUser.setFirstName("java"); + anotherUser.setLastName("hipster"); + anotherUser.setImageUrl(""); + anotherUser.setLangKey("en"); + userRepository.saveAndFlush(anotherUser); + + // Update the user + User updatedUser = userRepository.findById(user.getId()).get(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setId(updatedUser.getId()); + managedUserVM.setLogin(updatedUser.getLogin()); + managedUserVM.setPassword(updatedUser.getPassword()); + managedUserVM.setFirstName(updatedUser.getFirstName()); + managedUserVM.setLastName(updatedUser.getLastName()); + managedUserVM.setEmail("jhipster@localhost");// this email should already be used by anotherUser + managedUserVM.setActivated(updatedUser.getActivated()); + managedUserVM.setImageUrl(updatedUser.getImageUrl()); + managedUserVM.setLangKey(updatedUser.getLangKey()); + managedUserVM.setCreatedBy(updatedUser.getCreatedBy()); + managedUserVM.setCreatedDate(updatedUser.getCreatedDate()); + managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy()); + managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate()); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc.perform(put("/api/users") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isBadRequest()); + } + + @Test + @Transactional + public void updateUserExistingLogin() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + + User anotherUser = new User(); + anotherUser.setLogin("jhipster"); + anotherUser.setPassword(RandomStringUtils.random(60)); + anotherUser.setActivated(true); + anotherUser.setEmail("jhipster@localhost"); + anotherUser.setFirstName("java"); + anotherUser.setLastName("hipster"); + anotherUser.setImageUrl(""); + anotherUser.setLangKey("en"); + userRepository.saveAndFlush(anotherUser); + + // Update the user + User updatedUser = userRepository.findById(user.getId()).get(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setId(updatedUser.getId()); + managedUserVM.setLogin("jhipster");// this login should already be used by anotherUser + managedUserVM.setPassword(updatedUser.getPassword()); + managedUserVM.setFirstName(updatedUser.getFirstName()); + managedUserVM.setLastName(updatedUser.getLastName()); + managedUserVM.setEmail(updatedUser.getEmail()); + managedUserVM.setActivated(updatedUser.getActivated()); + managedUserVM.setImageUrl(updatedUser.getImageUrl()); + managedUserVM.setLangKey(updatedUser.getLangKey()); + managedUserVM.setCreatedBy(updatedUser.getCreatedBy()); + managedUserVM.setCreatedDate(updatedUser.getCreatedDate()); + managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy()); + managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate()); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc.perform(put("/api/users") + .contentType(TestUtil.APPLICATION_JSON_UTF8) + .content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isBadRequest()); + } + + @Test + @Transactional + public void deleteUser() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + int databaseSizeBeforeDelete = userRepository.findAll().size(); + + // Delete the user + restUserMockMvc.perform(delete("/api/users/{login}", user.getLogin()) + .accept(TestUtil.APPLICATION_JSON_UTF8)) + .andExpect(status().isNoContent()); + + // Validate the database is empty + List userList = userRepository.findAll(); + assertThat(userList).hasSize(databaseSizeBeforeDelete - 1); + } + + @Test + @Transactional + public void getAllAuthorities() throws Exception { + restUserMockMvc.perform(get("/api/users/authorities") + .accept(TestUtil.APPLICATION_JSON_UTF8) + .contentType(TestUtil.APPLICATION_JSON_UTF8)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$").value(hasItems(AuthoritiesConstants.USER, AuthoritiesConstants.ADMIN))); + } + + @Test + @Transactional + public void testUserEquals() throws Exception { + TestUtil.equalsVerifier(User.class); + User user1 = new User(); + user1.setId(1L); + User user2 = new User(); + user2.setId(user1.getId()); + assertThat(user1).isEqualTo(user2); + user2.setId(2L); + assertThat(user1).isNotEqualTo(user2); + user1.setId(null); + assertThat(user1).isNotEqualTo(user2); + } + + @Test + public void testUserDTOtoUser() { + UserDTO userDTO = new UserDTO(); + userDTO.setId(DEFAULT_ID); + userDTO.setLogin(DEFAULT_LOGIN); + userDTO.setFirstName(DEFAULT_FIRSTNAME); + userDTO.setLastName(DEFAULT_LASTNAME); + userDTO.setEmail(DEFAULT_EMAIL); + userDTO.setActivated(true); + userDTO.setImageUrl(DEFAULT_IMAGEURL); + userDTO.setLangKey(DEFAULT_LANGKEY); + userDTO.setCreatedBy(DEFAULT_LOGIN); + userDTO.setLastModifiedBy(DEFAULT_LOGIN); + userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + User user = userMapper.userDTOToUser(userDTO); + assertThat(user.getId()).isEqualTo(DEFAULT_ID); + assertThat(user.getLogin()).isEqualTo(DEFAULT_LOGIN); + assertThat(user.getFirstName()).isEqualTo(DEFAULT_FIRSTNAME); + assertThat(user.getLastName()).isEqualTo(DEFAULT_LASTNAME); + assertThat(user.getEmail()).isEqualTo(DEFAULT_EMAIL); + assertThat(user.getActivated()).isEqualTo(true); + assertThat(user.getImageUrl()).isEqualTo(DEFAULT_IMAGEURL); + assertThat(user.getLangKey()).isEqualTo(DEFAULT_LANGKEY); + assertThat(user.getCreatedBy()).isNull(); + assertThat(user.getCreatedDate()).isNotNull(); + assertThat(user.getLastModifiedBy()).isNull(); + assertThat(user.getLastModifiedDate()).isNotNull(); + assertThat(user.getAuthorities()).extracting("name").containsExactly(AuthoritiesConstants.USER); + } + + @Test + public void testUserToUserDTO() { + user.setId(DEFAULT_ID); + user.setCreatedBy(DEFAULT_LOGIN); + user.setCreatedDate(Instant.now()); + user.setLastModifiedBy(DEFAULT_LOGIN); + user.setLastModifiedDate(Instant.now()); + Set authorities = new HashSet<>(); + Authority authority = new Authority(); + authority.setName(AuthoritiesConstants.USER); + authorities.add(authority); + user.setAuthorities(authorities); + + UserDTO userDTO = userMapper.userToUserDTO(user); + + assertThat(userDTO.getId()).isEqualTo(DEFAULT_ID); + assertThat(userDTO.getLogin()).isEqualTo(DEFAULT_LOGIN); + assertThat(userDTO.getFirstName()).isEqualTo(DEFAULT_FIRSTNAME); + assertThat(userDTO.getLastName()).isEqualTo(DEFAULT_LASTNAME); + assertThat(userDTO.getEmail()).isEqualTo(DEFAULT_EMAIL); + assertThat(userDTO.isActivated()).isEqualTo(true); + assertThat(userDTO.getImageUrl()).isEqualTo(DEFAULT_IMAGEURL); + assertThat(userDTO.getLangKey()).isEqualTo(DEFAULT_LANGKEY); + assertThat(userDTO.getCreatedBy()).isEqualTo(DEFAULT_LOGIN); + assertThat(userDTO.getCreatedDate()).isEqualTo(user.getCreatedDate()); + assertThat(userDTO.getLastModifiedBy()).isEqualTo(DEFAULT_LOGIN); + assertThat(userDTO.getLastModifiedDate()).isEqualTo(user.getLastModifiedDate()); + assertThat(userDTO.getAuthorities()).containsExactly(AuthoritiesConstants.USER); + assertThat(userDTO.toString()).isNotNull(); + } + + @Test + public void testAuthorityEquals() { + Authority authorityA = new Authority(); + assertThat(authorityA).isEqualTo(authorityA); + assertThat(authorityA).isNotEqualTo(null); + assertThat(authorityA).isNotEqualTo(new Object()); + assertThat(authorityA.hashCode()).isEqualTo(0); + assertThat(authorityA.toString()).isNotNull(); + + Authority authorityB = new Authority(); + assertThat(authorityA).isEqualTo(authorityB); + + authorityB.setName(AuthoritiesConstants.ADMIN); + assertThat(authorityA).isNotEqualTo(authorityB); + + authorityA.setName(AuthoritiesConstants.USER); + assertThat(authorityA).isNotEqualTo(authorityB); + + authorityB.setName(AuthoritiesConstants.USER); + assertThat(authorityA).isEqualTo(authorityB); + assertThat(authorityA.hashCode()).isEqualTo(authorityB.hashCode()); + } +} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/UserResourceIntegrationTest.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/UserResourceIntegrationTest.java similarity index 97% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/UserResourceIntegrationTest.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/UserResourceIntegrationTest.java index c0abc042fb..20d8d4a85c 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/UserResourceIntegrationTest.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/UserResourceIntegrationTest.java @@ -1,16 +1,17 @@ -package com.baeldung.jhipster5.web.rest; +package com.baeldung.jhipster6.web.rest; + +import com.baeldung.jhipster6.BookstoreApp; +import com.baeldung.jhipster6.domain.Authority; +import com.baeldung.jhipster6.domain.User; +import com.baeldung.jhipster6.repository.UserRepository; +import com.baeldung.jhipster6.security.AuthoritiesConstants; +import com.baeldung.jhipster6.service.MailService; +import com.baeldung.jhipster6.service.UserService; +import com.baeldung.jhipster6.service.dto.UserDTO; +import com.baeldung.jhipster6.service.mapper.UserMapper; +import com.baeldung.jhipster6.web.rest.errors.ExceptionTranslator; +import com.baeldung.jhipster6.web.rest.vm.ManagedUserVM; -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.domain.Authority; -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.repository.UserRepository; -import com.baeldung.jhipster5.security.AuthoritiesConstants; -import com.baeldung.jhipster5.service.MailService; -import com.baeldung.jhipster5.service.UserService; -import com.baeldung.jhipster5.service.dto.UserDTO; -import com.baeldung.jhipster5.service.mapper.UserMapper; -import com.baeldung.jhipster5.web.rest.errors.ExceptionTranslator; -import com.baeldung.jhipster5.web.rest.vm.ManagedUserVM; import org.apache.commons.lang3.RandomStringUtils; import org.junit.Before; import org.junit.Test; diff --git a/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/errors/ExceptionTranslatorIT.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/errors/ExceptionTranslatorIT.java new file mode 100644 index 0000000000..2ecbe7254e --- /dev/null +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/errors/ExceptionTranslatorIT.java @@ -0,0 +1,125 @@ +package com.baeldung.jhipster6.web.rest.errors; + +import com.baeldung.jhipster6.BookstoreApp; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +/** + * Integration tests {@link ExceptionTranslator} controller advice. + */ +@SpringBootTest(classes = BookstoreApp.class) +public class ExceptionTranslatorIT { + + @Autowired + private ExceptionTranslatorTestController controller; + + @Autowired + private ExceptionTranslator exceptionTranslator; + + @Autowired + private MappingJackson2HttpMessageConverter jacksonMessageConverter; + + private MockMvc mockMvc; + + @BeforeEach + public void setup() { + mockMvc = MockMvcBuilders.standaloneSetup(controller) + .setControllerAdvice(exceptionTranslator) + .setMessageConverters(jacksonMessageConverter) + .build(); + } + + @Test + public void testConcurrencyFailure() throws Exception { + mockMvc.perform(get("/test/concurrency-failure")) + .andExpect(status().isConflict()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value(ErrorConstants.ERR_CONCURRENCY_FAILURE)); + } + + @Test + public void testMethodArgumentNotValid() throws Exception { + mockMvc.perform(post("/test/method-argument").content("{}").contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value(ErrorConstants.ERR_VALIDATION)) + .andExpect(jsonPath("$.fieldErrors.[0].objectName").value("testDTO")) + .andExpect(jsonPath("$.fieldErrors.[0].field").value("test")) + .andExpect(jsonPath("$.fieldErrors.[0].message").value("NotNull")); + } + + @Test + public void testMissingServletRequestPartException() throws Exception { + mockMvc.perform(get("/test/missing-servlet-request-part")) + .andExpect(status().isBadRequest()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.400")); + } + + @Test + public void testMissingServletRequestParameterException() throws Exception { + mockMvc.perform(get("/test/missing-servlet-request-parameter")) + .andExpect(status().isBadRequest()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.400")); + } + + @Test + public void testAccessDenied() throws Exception { + mockMvc.perform(get("/test/access-denied")) + .andExpect(status().isForbidden()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.403")) + .andExpect(jsonPath("$.detail").value("test access denied!")); + } + + @Test + public void testUnauthorized() throws Exception { + mockMvc.perform(get("/test/unauthorized")) + .andExpect(status().isUnauthorized()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.401")) + .andExpect(jsonPath("$.path").value("/test/unauthorized")) + .andExpect(jsonPath("$.detail").value("test authentication failed!")); + } + + @Test + public void testMethodNotSupported() throws Exception { + mockMvc.perform(post("/test/access-denied")) + .andExpect(status().isMethodNotAllowed()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.405")) + .andExpect(jsonPath("$.detail").value("Request method 'POST' not supported")); + } + + @Test + public void testExceptionWithResponseStatus() throws Exception { + mockMvc.perform(get("/test/response-status")) + .andExpect(status().isBadRequest()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.400")) + .andExpect(jsonPath("$.title").value("test response status")); + } + + @Test + public void testInternalServerError() throws Exception { + mockMvc.perform(get("/test/internal-server-error")) + .andExpect(status().isInternalServerError()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.500")) + .andExpect(jsonPath("$.title").value("Internal Server Error")); + } + +} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/errors/ExceptionTranslatorIntegrationTest.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/errors/ExceptionTranslatorIntegrationTest.java similarity index 98% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/errors/ExceptionTranslatorIntegrationTest.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/errors/ExceptionTranslatorIntegrationTest.java index e5ef08ee9c..7b25b314ed 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/errors/ExceptionTranslatorIntegrationTest.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/errors/ExceptionTranslatorIntegrationTest.java @@ -1,6 +1,6 @@ -package com.baeldung.jhipster5.web.rest.errors; +package com.baeldung.jhipster6.web.rest.errors; -import com.baeldung.jhipster5.BookstoreApp; +import com.baeldung.jhipster6.BookstoreApp; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/errors/ExceptionTranslatorTestController.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/errors/ExceptionTranslatorTestController.java similarity index 98% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/errors/ExceptionTranslatorTestController.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/errors/ExceptionTranslatorTestController.java index f8d84151b9..a0e6e03178 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/errors/ExceptionTranslatorTestController.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/errors/ExceptionTranslatorTestController.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.web.rest.errors; +package com.baeldung.jhipster6.web.rest.errors; import org.springframework.dao.ConcurrencyFailureException; import org.springframework.http.HttpStatus; diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/util/PaginationUtilUnitTest.java b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/util/PaginationUtilUnitTest.java similarity index 97% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/util/PaginationUtilUnitTest.java rename to jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/util/PaginationUtilUnitTest.java index 78b17ee859..da7c2ae1f5 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/util/PaginationUtilUnitTest.java +++ b/jhipster-6/bookstore-monolith/src/test/java/com/baeldung/jhipster6/web/rest/util/PaginationUtilUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.jhipster5.web.rest.util; +package com.baeldung.jhipster6.web.rest.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/jest-global-mocks.ts b/jhipster-6/bookstore-monolith/src/test/javascript/jest-global-mocks.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/jest-global-mocks.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/jest-global-mocks.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/jest.conf.js b/jhipster-6/bookstore-monolith/src/test/javascript/jest.conf.js similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/jest.conf.js rename to jhipster-6/bookstore-monolith/src/test/javascript/jest.conf.js diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/jest.ts b/jhipster-6/bookstore-monolith/src/test/javascript/jest.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/jest.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/jest.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/activate/activate.component.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/account/activate/activate.component.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/activate/activate.component.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/account/activate/activate.component.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password-reset/finish/password-reset-finish.component.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/account/password-reset/finish/password-reset-finish.component.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password-reset/finish/password-reset-finish.component.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/account/password-reset/finish/password-reset-finish.component.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password-reset/init/password-reset-init.component.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/account/password-reset/init/password-reset-init.component.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password-reset/init/password-reset-init.component.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/account/password-reset/init/password-reset-init.component.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password/password-strength-bar.component.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/account/password/password-strength-bar.component.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password/password-strength-bar.component.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/account/password/password-strength-bar.component.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password/password.component.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/account/password/password.component.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password/password.component.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/account/password/password.component.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/register/register.component.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/account/register/register.component.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/register/register.component.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/account/register/register.component.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/settings/settings.component.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/account/settings/settings.component.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/settings/settings.component.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/account/settings/settings.component.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/audits/audits.component.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/audits/audits.component.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/audits/audits.component.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/audits/audits.component.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/audits/audits.service.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/audits/audits.service.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/audits/audits.service.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/audits/audits.service.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/configuration/configuration.component.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/configuration/configuration.component.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/configuration/configuration.component.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/configuration/configuration.component.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/configuration/configuration.service.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/configuration/configuration.service.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/configuration/configuration.service.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/configuration/configuration.service.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/health/health.component.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/health/health.component.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/health/health.component.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/health/health.component.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/metrics/metrics.component.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/metrics/metrics.component.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/metrics/metrics.component.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/metrics/metrics.component.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/metrics/metrics.service.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/metrics/metrics.service.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/metrics/metrics.service.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/metrics/metrics.service.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-delete-dialog.component.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-delete-dialog.component.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-delete-dialog.component.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-delete-dialog.component.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-detail.component.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-detail.component.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-detail.component.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-detail.component.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-update.component.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-update.component.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-update.component.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-update.component.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/core/user/account.service.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/core/user/account.service.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/core/user/account.service.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/core/user/account.service.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/core/user/user.service.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/core/user/user.service.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/core/user/user.service.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/core/user/user.service.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-delete-dialog.component.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-delete-dialog.component.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-delete-dialog.component.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-delete-dialog.component.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-detail.component.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-detail.component.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-detail.component.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-detail.component.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-update.component.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-update.component.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-update.component.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-update.component.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book.component.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/entities/book/book.component.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book.component.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/entities/book/book.component.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book.service.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/entities/book/book.service.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book.service.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/entities/book/book.service.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/shared/alert/alert-error.component.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/shared/alert/alert-error.component.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/shared/alert/alert-error.component.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/shared/alert/alert-error.component.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/shared/login/login.component.spec.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/app/shared/login/login.component.spec.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/app/shared/login/login.component.spec.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/app/shared/login/login.component.spec.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-account.service.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/helpers/mock-account.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-account.service.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/helpers/mock-account.service.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-active-modal.service.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/helpers/mock-active-modal.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-active-modal.service.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/helpers/mock-active-modal.service.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-alert.service.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/helpers/mock-alert.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-alert.service.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/helpers/mock-alert.service.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-event-manager.service.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/helpers/mock-event-manager.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-event-manager.service.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/helpers/mock-event-manager.service.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-login.service.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/helpers/mock-login.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-login.service.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/helpers/mock-login.service.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-route.service.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/helpers/mock-route.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-route.service.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/helpers/mock-route.service.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-state-storage.service.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/helpers/mock-state-storage.service.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-state-storage.service.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/helpers/mock-state-storage.service.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/spyobject.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/helpers/spyobject.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/spyobject.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/helpers/spyobject.ts diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/test.module.ts b/jhipster-6/bookstore-monolith/src/test/javascript/spec/test.module.ts similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/javascript/spec/test.module.ts rename to jhipster-6/bookstore-monolith/src/test/javascript/spec/test.module.ts diff --git a/jhipster-5/bookstore-monolith/src/test/resources/config/application.yml b/jhipster-6/bookstore-monolith/src/test/resources/config/application.yml similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/resources/config/application.yml rename to jhipster-6/bookstore-monolith/src/test/resources/config/application.yml diff --git a/jhipster-5/bookstore-monolith/src/test/resources/i18n/messages_en.properties b/jhipster-6/bookstore-monolith/src/test/resources/i18n/messages_en.properties similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/resources/i18n/messages_en.properties rename to jhipster-6/bookstore-monolith/src/test/resources/i18n/messages_en.properties diff --git a/jhipster-5/bookstore-monolith/src/test/resources/logback.xml b/jhipster-6/bookstore-monolith/src/test/resources/logback.xml similarity index 97% rename from jhipster-5/bookstore-monolith/src/test/resources/logback.xml rename to jhipster-6/bookstore-monolith/src/test/resources/logback.xml index 6244807dfa..de8cf57b93 100644 --- a/jhipster-5/bookstore-monolith/src/test/resources/logback.xml +++ b/jhipster-6/bookstore-monolith/src/test/resources/logback.xml @@ -10,7 +10,7 @@ - + diff --git a/jhipster-5/bookstore-monolith/src/test/resources/templates/mail/testEmail.html b/jhipster-6/bookstore-monolith/src/test/resources/templates/mail/testEmail.html similarity index 100% rename from jhipster-5/bookstore-monolith/src/test/resources/templates/mail/testEmail.html rename to jhipster-6/bookstore-monolith/src/test/resources/templates/mail/testEmail.html diff --git a/jhipster-5/bookstore-monolith/tsconfig-aot.json b/jhipster-6/bookstore-monolith/tsconfig-aot.json similarity index 100% rename from jhipster-5/bookstore-monolith/tsconfig-aot.json rename to jhipster-6/bookstore-monolith/tsconfig-aot.json diff --git a/jhipster-5/bookstore-monolith/tsconfig.json b/jhipster-6/bookstore-monolith/tsconfig.json similarity index 100% rename from jhipster-5/bookstore-monolith/tsconfig.json rename to jhipster-6/bookstore-monolith/tsconfig.json diff --git a/jhipster-5/bookstore-monolith/tslint.json b/jhipster-6/bookstore-monolith/tslint.json similarity index 100% rename from jhipster-5/bookstore-monolith/tslint.json rename to jhipster-6/bookstore-monolith/tslint.json diff --git a/jhipster-5/bookstore-monolith/webpack/logo-jhipster.png b/jhipster-6/bookstore-monolith/webpack/logo-jhipster.png similarity index 100% rename from jhipster-5/bookstore-monolith/webpack/logo-jhipster.png rename to jhipster-6/bookstore-monolith/webpack/logo-jhipster.png diff --git a/jhipster-5/bookstore-monolith/webpack/utils.js b/jhipster-6/bookstore-monolith/webpack/utils.js similarity index 100% rename from jhipster-5/bookstore-monolith/webpack/utils.js rename to jhipster-6/bookstore-monolith/webpack/utils.js diff --git a/jhipster-5/bookstore-monolith/webpack/webpack.common.js b/jhipster-6/bookstore-monolith/webpack/webpack.common.js similarity index 100% rename from jhipster-5/bookstore-monolith/webpack/webpack.common.js rename to jhipster-6/bookstore-monolith/webpack/webpack.common.js diff --git a/jhipster-5/bookstore-monolith/webpack/webpack.dev.js b/jhipster-6/bookstore-monolith/webpack/webpack.dev.js similarity index 100% rename from jhipster-5/bookstore-monolith/webpack/webpack.dev.js rename to jhipster-6/bookstore-monolith/webpack/webpack.dev.js diff --git a/jhipster-5/bookstore-monolith/webpack/webpack.prod.js b/jhipster-6/bookstore-monolith/webpack/webpack.prod.js similarity index 100% rename from jhipster-5/bookstore-monolith/webpack/webpack.prod.js rename to jhipster-6/bookstore-monolith/webpack/webpack.prod.js diff --git a/jhipster-5/pom.xml b/jhipster-6/pom.xml similarity index 56% rename from jhipster-5/pom.xml rename to jhipster-6/pom.xml index 2a5132e50e..b3c5e58319 100644 --- a/jhipster-5/pom.xml +++ b/jhipster-6/pom.xml @@ -1,11 +1,10 @@ - - + 4.0.0 com.baeldung.jhipster - jhipster-5 + jhipster-6 1.0.0-SNAPSHOT - jhipster-5 + jhipster-6 pom @@ -17,6 +16,6 @@ bookstore-monolith - - + + diff --git a/libraries-3/pom.xml b/libraries-3/pom.xml index daa01108f6..5e06a5550e 100644 --- a/libraries-3/pom.xml +++ b/libraries-3/pom.xml @@ -122,6 +122,11 @@ ${mutabilitydetector.version} test + + javax.annotation + javax.annotation-api + 1.3.2 + @@ -161,42 +166,10 @@ org.apache.maven.plugins maven-compiler-plugin - 3.5 - javac-with-errorprone - true - 1.8 - 1.8 - true - - - com.uber.nullaway - nullaway - 0.3.0 - - - - - - - -XepExcludedPaths:(.*)/test/.*|(.*)/jcabi/.* - -XepOpt:NullAway:AnnotatedPackages=com.baeldung.nullaway - + 11 + 11 - - - org.codehaus.plexus - plexus-compiler-javac-errorprone - 2.8 - - - - - com.google.errorprone - error_prone_core - 2.3.4 - - diff --git a/libraries-3/src/test/java/com/baeldung/immutable/ImmutablePersonUnitTest.java b/libraries-3/src/test/java/com/baeldung/immutable/ImmutablePersonUnitTest.java index 222cbfd8ef..b9164ed92b 100644 --- a/libraries-3/src/test/java/com/baeldung/immutable/ImmutablePersonUnitTest.java +++ b/libraries-3/src/test/java/com/baeldung/immutable/ImmutablePersonUnitTest.java @@ -1,5 +1,6 @@ package com.baeldung.immutable; +import org.junit.Ignore; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -7,6 +8,12 @@ import static org.mutabilitydetector.unittesting.MutabilityAssert.assertImmutabl public class ImmutablePersonUnitTest { + /** + * commenting the test case, As after upgrading to java 11 + * assertImmutable is giving exception. Raised the issue to Mutability support team + * https://github.com/MutabilityDetector/MutabilityDetector/issues/196 + */ + @Ignore @Test public void whenModifying_shouldCreateNewInstance() throws Exception { final ImmutablePerson john = ImmutablePerson.builder() diff --git a/libraries-4/pom.xml b/libraries-4/pom.xml index 87e618ee5b..3869570636 100644 --- a/libraries-4/pom.xml +++ b/libraries-4/pom.xml @@ -109,9 +109,30 @@ javafx-fxml ${javafx.version} + + + fr.inria.gforge.spoon + spoon-core + ${spoon-core.version} + + + + com.fasterxml.jackson.core + jackson-core + ${jackson-core.version} + + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson-annotations.version} + + + 2.14.2 + 2.14.2 1.2.6 8.2.0 1.1.0 @@ -129,6 +150,7 @@ 2.2.4 1.2.0 19 + 10.3.0 \ No newline at end of file diff --git a/libraries-4/src/main/java/com/baeldung/spoon/AddCopyrightProcessor.java b/libraries-4/src/main/java/com/baeldung/spoon/AddCopyrightProcessor.java new file mode 100644 index 0000000000..7298cffa12 --- /dev/null +++ b/libraries-4/src/main/java/com/baeldung/spoon/AddCopyrightProcessor.java @@ -0,0 +1,15 @@ +package com.baeldung.spoon; + +import spoon.processing.AbstractProcessor; +import spoon.reflect.code.CtComment; +import spoon.reflect.code.CtComment.CommentType; +import spoon.reflect.declaration.CtClass; + +public class AddCopyrightProcessor extends AbstractProcessor> { + + @Override + public void process(CtClass clazz) { + CtComment comment = getFactory().createComment("Copyright(c) 2023 etc", CommentType.JAVADOC); + clazz.addComment(comment); + } +} diff --git a/libraries-4/src/main/java/com/baeldung/spoon/AddCopyrightTransformer.java b/libraries-4/src/main/java/com/baeldung/spoon/AddCopyrightTransformer.java new file mode 100644 index 0000000000..b7f20b6b85 --- /dev/null +++ b/libraries-4/src/main/java/com/baeldung/spoon/AddCopyrightTransformer.java @@ -0,0 +1,31 @@ +package com.baeldung.spoon; + +import spoon.Launcher; +import spoon.SpoonAPI; +import spoon.reflect.CtModel; +import spoon.reflect.code.CtComment; +import spoon.reflect.code.CtComment.CommentType; +import spoon.reflect.declaration.CtClass; + +public class AddCopyrightTransformer { + + public void addCopyright(String source) { + + SpoonAPI spoon = new Launcher(); + spoon.addInputResource(source); + spoon.getEnvironment().setLevel("DEBUG"); + CtModel model = spoon.buildModel(); + + model.filterChildren((el) -> el instanceof CtClass) + .forEach((CtClass cl) -> { + CtComment comment = cl.getFactory() + .createComment("Copyright(c) 2023 etc", CommentType.JAVADOC); + cl.addComment(comment); + }); + + spoon.setSourceOutputDirectory("./target"); + spoon.prettyprint(); + } + + +} diff --git a/libraries-4/src/main/java/com/baeldung/spoon/ClassReporter.java b/libraries-4/src/main/java/com/baeldung/spoon/ClassReporter.java new file mode 100644 index 0000000000..a532b83be1 --- /dev/null +++ b/libraries-4/src/main/java/com/baeldung/spoon/ClassReporter.java @@ -0,0 +1,111 @@ +package com.baeldung.spoon; + +import spoon.Launcher; +import spoon.SpoonAPI; +import spoon.reflect.CtModel; +import spoon.reflect.declaration.CtClass; +import spoon.reflect.declaration.CtMethod; +import spoon.support.sniper.SniperJavaPrettyPrinter; + +/** + * Loads a given class and creates a summary o + */ +public class ClassReporter { + + + public MethodSummary generateMethodSummaryReport(String source) { + + SpoonAPI spoon = new Launcher(); + spoon.addInputResource(source); + CtModel model = spoon.buildModel(); + MethodSummary report = new MethodSummary(); + model.filterChildren((el) -> el instanceof CtClass) + .forEach((CtClass clazz) -> processMethods(report,clazz)); + + return report; + } + + private void processMethods(MethodSummary report, CtClass ctClass) { + + ctClass.filterChildren((c) -> c instanceof CtMethod ) + .forEach((CtMethod m) -> { + if (m.isPublic()) { + report.addPublicMethod(); + } + else if ( m.isPrivate()) { + report.addPrivateMethod(); + } + else if ( m.isProtected()) { + report.addProtectedMethod(); + } + else { + report.addPackagePrivateMethod(); + } + }); + } + + + public static class MethodSummary { + private int totalMethodCount; + private int publicMethodCount; + private int protectedMethodCount; + private int packagePrivateMethodCount; + private int privateMethodCount; + + void addPublicMethod() { + totalMethodCount++; + publicMethodCount++; + } + + void addPrivateMethod() { + totalMethodCount++; + privateMethodCount++; + } + + void addProtectedMethod() { + totalMethodCount++; + protectedMethodCount++; + } + + void addPackagePrivateMethod() { + totalMethodCount++; + packagePrivateMethodCount++; + } + + /** + * @return the totalMethodCount + */ + public int getTotalMethodCount() { + return totalMethodCount; + } + + /** + * @return the publicMethodCount + */ + public int getPublicMethodCount() { + return publicMethodCount; + } + + /** + * @return the protectedMethodCount + */ + public int getProtectedMethodCount() { + return protectedMethodCount; + } + + /** + * @return the privateMethodCount + */ + public int getPrivateMethodCount() { + return privateMethodCount; + } + + /** + * @return the privateMethodCount + */ + public int getPackagePrivateMethodCount() { + return packagePrivateMethodCount; + } + + } +} diff --git a/libraries-4/src/test/java/com/baeldung/spoon/AddCopyrightProcessorUnitTest.java b/libraries-4/src/test/java/com/baeldung/spoon/AddCopyrightProcessorUnitTest.java new file mode 100644 index 0000000000..44b45342b0 --- /dev/null +++ b/libraries-4/src/test/java/com/baeldung/spoon/AddCopyrightProcessorUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.spoon; + +import org.junit.Test; + +import spoon.Launcher; +import spoon.SpoonAPI; + +public class AddCopyrightProcessorUnitTest { + + @Test + public void whenAddCopyright_thenSuccess() { + + SpoonAPI spoon = new Launcher(); + spoon.addProcessor(new AddCopyrightProcessor()); + spoon.addInputResource("src/test/resources/spoon/SpoonClassToTest.java"); + spoon.setSourceOutputDirectory("./target/spoon-processed"); + spoon.buildModel(); + spoon.process(); + spoon.prettyprint(); + + } + +} diff --git a/libraries-4/src/test/java/com/baeldung/spoon/AddCopyrightTransformerUnitTest.java b/libraries-4/src/test/java/com/baeldung/spoon/AddCopyrightTransformerUnitTest.java new file mode 100644 index 0000000000..af6ba9e16b --- /dev/null +++ b/libraries-4/src/test/java/com/baeldung/spoon/AddCopyrightTransformerUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.spoon; + +import org.junit.Test; + +public class AddCopyrightTransformerUnitTest { + + + + @Test + public void whenAddCopyright_thenSuccess() { + + AddCopyrightTransformer transformer = new AddCopyrightTransformer(); + transformer.addCopyright("src/test/resources/spoon/SpoonClassToTest.java"); + + } + +} diff --git a/libraries-4/src/test/java/com/baeldung/spoon/ClassReporterUnitTest.java b/libraries-4/src/test/java/com/baeldung/spoon/ClassReporterUnitTest.java new file mode 100644 index 0000000000..38e6d8ddc7 --- /dev/null +++ b/libraries-4/src/test/java/com/baeldung/spoon/ClassReporterUnitTest.java @@ -0,0 +1,34 @@ +package com.baeldung.spoon; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; + +import com.baeldung.spoon.ClassReporter.MethodSummary; + +public class ClassReporterUnitTest { + + @Test + public void givenBrokenClass_whenGenerateReport_thenSuccess() { + ClassReporter reporter = new ClassReporter(); + MethodSummary report = reporter.generateMethodSummaryReport("src/test/resources/spoon/BrokenClass.java"); + + assertThat(report).isNotNull(); + assertThat(report.getPrivateMethodCount()).isEqualTo(0); + assertThat(report.getPublicMethodCount()).isEqualTo(1); + assertThat(report.getProtectedMethodCount()).isEqualTo(1); + + } + + @Test + public void whenGenerateReport_thenSuccess() { + + ClassReporter reporter = new ClassReporter(); + MethodSummary report = reporter.generateMethodSummaryReport("src/test/resources/spoon/SpoonClassToTest.java"); + assertThat(report).isNotNull(); + assertThat(report.getPackagePrivateMethodCount()).isEqualTo(1); + assertThat(report.getPublicMethodCount()).isEqualTo(1); + assertThat(report.getPrivateMethodCount()).isEqualTo(1); + } + +} diff --git a/libraries-4/src/test/resources/spoon/BrokenClass.java b/libraries-4/src/test/resources/spoon/BrokenClass.java new file mode 100644 index 0000000000..cf603b2afb --- /dev/null +++ b/libraries-4/src/test/resources/spoon/BrokenClass.java @@ -0,0 +1,12 @@ +package spoon; +public class BrokenClass { + + // Syntax error + pluvic void brokenMethod() {} + + // Syntax error + protected void protectedMethod() thraws Exception {} + + // Public method + public void publicMethod() {} +} \ No newline at end of file diff --git a/libraries-4/src/test/resources/spoon/SpoonClassToTest.java b/libraries-4/src/test/resources/spoon/SpoonClassToTest.java new file mode 100644 index 0000000000..75f06885c0 --- /dev/null +++ b/libraries-4/src/test/resources/spoon/SpoonClassToTest.java @@ -0,0 +1,28 @@ +package spoon; + +import some.superduper.HelperClass; +import some.superduper.SomeVO; + +public class SpoonClassToTest { + + private static HelperClass helper; + + public SpoonClassToTest() {} + + public int publicMethod() {} + + private int internalStuff() {} + + protected SomeVO protectedMethod() { + return new SomeVO(); + } + + void packageProtectedMethod() { + + try { + HelperClass.callSomeMethodThatThrows(); + } + catch(Exception ignored) {} + } + +} \ No newline at end of file diff --git a/libraries-6/pom.xml b/libraries-6/pom.xml index 234fa1349e..139edab34f 100644 --- a/libraries-6/pom.xml +++ b/libraries-6/pom.xml @@ -63,6 +63,11 @@ commons-collections4 ${commons-collections4.version} + + com.google.guava + guava + ${guava.version} + commons-net commons-net diff --git a/libraries-ai/README.md b/libraries-ai/README.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/libraries-ai/README.md @@ -0,0 +1 @@ + diff --git a/libraries-ai/pom.xml b/libraries-ai/pom.xml new file mode 100644 index 0000000000..2c1490440f --- /dev/null +++ b/libraries-ai/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + libraries-ai + libraries-ai + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + edu.stanford.nlp + stanford-corenlp + ${stanford-corenlp.version} + + + org.apache.opennlp + opennlp-tools + ${opennlp-tools.version} + + + + + 4.5.3 + 2.1.1 + + + \ No newline at end of file diff --git a/libraries-ai/src/test/java/com/baeldung/nlp/CoreNLPTokenizerUnitTest.java b/libraries-ai/src/test/java/com/baeldung/nlp/CoreNLPTokenizerUnitTest.java new file mode 100644 index 0000000000..11c5cd0be8 --- /dev/null +++ b/libraries-ai/src/test/java/com/baeldung/nlp/CoreNLPTokenizerUnitTest.java @@ -0,0 +1,41 @@ +package com.baeldung.nlp; + +import edu.stanford.nlp.ling.CoreAnnotations; +import edu.stanford.nlp.ling.CoreLabel; +import edu.stanford.nlp.pipeline.Annotation; +import edu.stanford.nlp.pipeline.StanfordCoreNLP; +import edu.stanford.nlp.util.CoreMap; +import org.junit.Test; + +import java.util.List; +import java.util.Properties; + +import static org.junit.Assert.assertEquals; + +public class CoreNLPTokenizerUnitTest { + @Test + public void givenSampleText_whenTokenize_thenExpectedTokensReturned() { + + Properties props = new Properties(); + props.setProperty("annotators", "tokenize"); + + StanfordCoreNLP pipeline = new StanfordCoreNLP(props); + String text = "The german shepard display an act of kindness"; + + Annotation document = new Annotation(text); + pipeline.annotate(document); + + List sentences = document.get(CoreAnnotations.SentencesAnnotation.class); + StringBuilder tokens = new StringBuilder(); + + for (CoreMap sentence : sentences) { + for (CoreLabel token : sentence.get(CoreAnnotations.TokensAnnotation.class)) { + String word = token.get(CoreAnnotations.TextAnnotation.class); + tokens.append(word) + .append(" "); + } + } + assertEquals("The german shepard display an act of kindness", tokens.toString() + .trim()); + } +} diff --git a/libraries-ai/src/test/java/com/baeldung/nlp/OpenNLPLanguageDetector.java b/libraries-ai/src/test/java/com/baeldung/nlp/OpenNLPLanguageDetector.java new file mode 100644 index 0000000000..00792b4875 --- /dev/null +++ b/libraries-ai/src/test/java/com/baeldung/nlp/OpenNLPLanguageDetector.java @@ -0,0 +1,33 @@ +package com.baeldung.nlp; + +import opennlp.tools.langdetect.Language; +import opennlp.tools.langdetect.LanguageDetectorME; +import opennlp.tools.langdetect.LanguageDetectorModel; +import org.junit.jupiter.api.Test; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class OpenNLPLanguageDetector { + + @Test + public void givenTextInEnglish_whenDetectLanguage_thenReturnsEnglishLanguageCode() { + + String text = "the dream my father told me"; + LanguageDetectorModel model; + + try (InputStream modelIn = new FileInputStream("langdetect-183.bin")) { + model = new LanguageDetectorModel(modelIn); + } catch (IOException e) { + return; + } + + LanguageDetectorME detector = new LanguageDetectorME(model); + Language language = detector.predictLanguage(text); + + assertEquals("eng", language.getLang()); + } +} \ No newline at end of file diff --git a/libraries-data-2/pom.xml b/libraries-data-2/pom.xml index f673ebd470..655bad2e2b 100644 --- a/libraries-data-2/pom.xml +++ b/libraries-data-2/pom.xml @@ -134,6 +134,11 @@ ${byte-buddy.version} test + + io.swagger.parser.v3 + swagger-parser + ${swagger-parser.version} + @@ -171,6 +176,7 @@ 1.1.0 3.0.0 2.8.4 + 2.1.13 \ No newline at end of file diff --git a/libraries-data-2/src/main/java/com/baeldung/swaggerparser/SwaggerParser.java b/libraries-data-2/src/main/java/com/baeldung/swaggerparser/SwaggerParser.java new file mode 100644 index 0000000000..d1f04e680a --- /dev/null +++ b/libraries-data-2/src/main/java/com/baeldung/swaggerparser/SwaggerParser.java @@ -0,0 +1,92 @@ +package com.baeldung.swaggerparser; + +import java.util.List; + +import io.swagger.parser.OpenAPIParser; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.PathItem; +import io.swagger.v3.oas.models.Paths; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.responses.ApiResponse; +import io.swagger.v3.oas.models.responses.ApiResponses; +import io.swagger.v3.oas.models.servers.Server; +import io.swagger.v3.parser.core.models.SwaggerParseResult; + +public class SwaggerParser { + + private static String OPENAPI_SPECIFICATION_STRING = "{\"openapi\":\"3.0.0\",\"info\":{\"title\":\"User APIs\",\"version\":\"1.0\"},\"servers\":[{\"url\":\"https://jsonplaceholder.typicode.com\",\"description\":\"Json Place Holder Service\"}],\"paths\":{\"/users/{id}\":{\"parameters\":[{\"schema\":{\"type\":\"integer\"},\"name\":\"id\",\"in\":\"path\",\"required\":true}],\"get\":{\"summary\":\"Fetch user by ID\",\"tags\":[\"User\"],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"integer\"},\"name\":{\"type\":\"string\"}}}}}}},\"operationId\":\"get-users-user_id\",\"description\":\"Retrieve a specific user by ID\"}}}}"; + + public static void main(String[] args) { + parseYAMLFile(); + parseJSONFile(); + parseString(); + } + + private static void parseString() { + SwaggerParseResult result = new OpenAPIParser().readContents(OPENAPI_SPECIFICATION_STRING, null, null); + + OpenAPI openAPI = result.getOpenAPI(); + + if (openAPI != null) { + printData(openAPI); + } + } + + private static void parseJSONFile() { + SwaggerParseResult result = new OpenAPIParser().readLocation("sample.yml", null, null); + + OpenAPI openAPI = result.getOpenAPI(); + + if (openAPI != null) { + printData(openAPI); + } + } + + private static void parseYAMLFile() { + SwaggerParseResult result = new OpenAPIParser().readLocation("sample.json", null, null); + + OpenAPI openAPI = result.getOpenAPI(); + + if (openAPI != null) { + printData(openAPI); + } + } + + private static void printData(OpenAPI openAPI) { + System.out.println(openAPI.getSpecVersion()); + + Info info = openAPI.getInfo(); + System.out.println(info.getTitle()); + System.out.println(info.getVersion()); + + List servers = openAPI.getServers(); + for (Server server : servers) { + System.out.println(server.getUrl()); + System.out.println(server.getDescription()); + } + + Paths paths = openAPI.getPaths(); + paths.entrySet() + .forEach(pathEntry -> { + System.out.println(pathEntry.getKey()); + + PathItem path = pathEntry.getValue(); + System.out.println(path.getGet() + .getSummary()); + System.out.println(path.getGet() + .getDescription()); + System.out.println(path.getGet() + .getOperationId()); + + ApiResponses responses = path.getGet() + .getResponses(); + responses.entrySet() + .forEach(responseEntry -> { + System.out.println(responseEntry.getKey()); + + ApiResponse response = responseEntry.getValue(); + System.out.println(response.getDescription()); + }); + }); + } +} diff --git a/libraries-data-2/src/main/resources/sample.json b/libraries-data-2/src/main/resources/sample.json new file mode 100644 index 0000000000..8b59bbb42a --- /dev/null +++ b/libraries-data-2/src/main/resources/sample.json @@ -0,0 +1,55 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "User APIs", + "version": "1.0" + }, + "servers": [ + { + "url": "https://jsonplaceholder.typicode.com", + "description": "Json Place Holder Service" + } + ], + "paths": { + "/users/{id}": { + "parameters": [ + { + "schema": { + "type": "integer" + }, + "name": "id", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Fetch user by ID", + "tags": [ + "User" + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + } + } + } + } + }, + "operationId": "get-users-user_id", + "description": "Retrieve a specific user by ID" + } + } + } +} \ No newline at end of file diff --git a/libraries-data-2/src/main/resources/sample.yml b/libraries-data-2/src/main/resources/sample.yml new file mode 100644 index 0000000000..ddfa064393 --- /dev/null +++ b/libraries-data-2/src/main/resources/sample.yml @@ -0,0 +1,33 @@ +openapi: 3.0.0 +info: + title: User APIs + version: '1.0' +servers: + - url: https://jsonplaceholder.typicode.com + description: Json Place Holder Service +paths: + /users/{id}: + parameters: + - schema: + type: integer + name: id + in: path + required: true + get: + summary: Fetch user by ID + tags: + - User + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: integer + name: + type: string + operationId: get-users-user_id + description: Retrieve a specific user by ID \ No newline at end of file diff --git a/libraries-data-2/src/test/java/com/baeldung/swaggerparser/SwaggerParserUnitTest.java b/libraries-data-2/src/test/java/com/baeldung/swaggerparser/SwaggerParserUnitTest.java new file mode 100644 index 0000000000..615bd917cb --- /dev/null +++ b/libraries-data-2/src/test/java/com/baeldung/swaggerparser/SwaggerParserUnitTest.java @@ -0,0 +1,65 @@ +package com.baeldung.swaggerparser; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.List; + +import org.junit.jupiter.api.Test; + +import io.swagger.parser.OpenAPIParser; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.parser.core.models.SwaggerParseResult; + +public class SwaggerParserUnitTest { + + private static String OPENAPI_SPECIFICATION_STRING = "{\"openapi\":\"3.0.0\",\"info\":{\"title\":\"User APIs\",\"version\":\"1.0\"},\"servers\":[{\"url\":\"https://jsonplaceholder.typicode.com\",\"description\":\"Json Place Holder Service\"}],\"paths\":{\"/users/{id}\":{\"parameters\":[{\"schema\":{\"type\":\"integer\"},\"name\":\"id\",\"in\":\"path\",\"required\":true}],\"get\":{\"summary\":\"Fetch user by ID\",\"tags\":[\"User\"],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"integer\"},\"name\":{\"type\":\"string\"}}}}}}},\"operationId\":\"get-users-user_id\",\"description\":\"Retrieve a specific user by ID\"}}}}"; + + @Test + public void givenAValidOpenAPIYAMLFile_whenParsing_thenCheckIfParsed() { + SwaggerParseResult result = new OpenAPIParser().readLocation("valid-openapi-sample.yml", null, null); + + OpenAPI openAPI = result.getOpenAPI(); + + assertNotNull(openAPI); + } + + @Test + public void givenAValidOpenAPIYAMLFile_whenParsing_thenCheckIfNotErrors() { + SwaggerParseResult result = new OpenAPIParser().readLocation("valid-openapi-sample.yml", null, null); + + List messages = result.getMessages(); + + assertTrue(messages.isEmpty()); + } + + @Test + public void givenAnInvalidOpenAPIYAMLFile_whenParsing_thenCheckIfErrors() { + SwaggerParseResult result = new OpenAPIParser().readLocation("invalid-openapi-sample.yml", null, null); + + List messages = result.getMessages(); + + assertFalse(messages.isEmpty()); + } + + @Test + public void givenAValidOpenAPISpecificationString_whenParsing_thenCheckIfParsed() { + SwaggerParseResult result = new OpenAPIParser().readContents(OPENAPI_SPECIFICATION_STRING, null, null); + + OpenAPI openAPI = result.getOpenAPI(); + + assertNotNull(openAPI); + } + + @Test + public void givenAValidOpenAPISpecificationString_whenParsing_thenCheckIfNotErrors() { + SwaggerParseResult result = new OpenAPIParser().readLocation(OPENAPI_SPECIFICATION_STRING, null, null); + + List messages = result.getMessages(); + + assertNull(messages); + } + +} diff --git a/libraries-data-2/src/test/resources/invalid-openapi-sample.yml b/libraries-data-2/src/test/resources/invalid-openapi-sample.yml new file mode 100644 index 0000000000..eaac64c9a9 --- /dev/null +++ b/libraries-data-2/src/test/resources/invalid-openapi-sample.yml @@ -0,0 +1,32 @@ +openapi: 3.0.0 +info: + title: User APIs + version: '1.0' +servers: + - description: Json Place Holder Service +paths: + /users/{id}: + parameters: + - schema: + type: integer + name: id + in: path + required: true + get: + summary: Fetch user by ID + tags: + - User + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: integer + name: + type: string + operationId: get-users-user_id + description: Retrieve a specific user by ID \ No newline at end of file diff --git a/libraries-data-2/src/test/resources/valid-openapi-sample.yml b/libraries-data-2/src/test/resources/valid-openapi-sample.yml new file mode 100644 index 0000000000..ddfa064393 --- /dev/null +++ b/libraries-data-2/src/test/resources/valid-openapi-sample.yml @@ -0,0 +1,33 @@ +openapi: 3.0.0 +info: + title: User APIs + version: '1.0' +servers: + - url: https://jsonplaceholder.typicode.com + description: Json Place Holder Service +paths: + /users/{id}: + parameters: + - schema: + type: integer + name: id + in: path + required: true + get: + summary: Fetch user by ID + tags: + - User + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: integer + name: + type: string + operationId: get-users-user_id + description: Retrieve a specific user by ID \ No newline at end of file diff --git a/libraries-data-db/log4j.properties b/libraries-data-db/log4j.properties index 2173c5d96f..d2a3cae499 100644 --- a/libraries-data-db/log4j.properties +++ b/libraries-data-db/log4j.properties @@ -1 +1,4 @@ -log4j.rootLogger=INFO, stdout +log4j.rootLogger=INFO,stdout +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout +log4j.logger.org.datanucleus=DEBUG diff --git a/libraries-data-db/pom.xml b/libraries-data-db/pom.xml index 55fd990a80..66fa24476e 100644 --- a/libraries-data-db/pom.xml +++ b/libraries-data-db/pom.xml @@ -115,6 +115,24 @@ mysql ${testcontainers-version} + + + com.vladmihalcea.flexy-pool + flexy-micrometer-metrics + ${flexy-pool.version} + + + + com.vladmihalcea.flexy-pool + flexy-hikaricp + ${flexy-pool.version} + + + com.vladmihalcea.flexy-pool + flexy-dropwizard-metrics + + + org.springframework.boot @@ -147,6 +165,7 @@ + org.apache.maven.plugins maven-antrun-plugin ${maven-antrun-plugin.version} @@ -284,6 +303,7 @@ 5.0.1 13.15.2 2.1.3.Final + 2.2.3 1.17.6 diff --git a/libraries-data-db/src/main/java/com/baeldung/libraries/flexypool/FlexypoolConfig.java b/libraries-data-db/src/main/java/com/baeldung/libraries/flexypool/FlexypoolConfig.java new file mode 100644 index 0000000000..3b6bdca26b --- /dev/null +++ b/libraries-data-db/src/main/java/com/baeldung/libraries/flexypool/FlexypoolConfig.java @@ -0,0 +1,109 @@ +package com.baeldung.libraries.flexypool; + +import com.vladmihalcea.flexypool.FlexyPoolDataSource; +import com.vladmihalcea.flexypool.adaptor.HikariCPPoolAdapter; +import com.vladmihalcea.flexypool.config.Configuration; +import com.vladmihalcea.flexypool.connection.ConnectionDecoratorFactoryResolver; +import com.vladmihalcea.flexypool.event.ConnectionAcquireTimeThresholdExceededEvent; +import com.vladmihalcea.flexypool.event.ConnectionAcquireTimeoutEvent; +import com.vladmihalcea.flexypool.event.ConnectionLeaseTimeThresholdExceededEvent; +import com.vladmihalcea.flexypool.event.EventListener; +import com.vladmihalcea.flexypool.metric.micrometer.MicrometerMetrics; +import com.vladmihalcea.flexypool.strategy.IncrementPoolOnTimeoutConnectionAcquiringStrategy; +import com.vladmihalcea.flexypool.strategy.RetryConnectionAcquiringStrategy; +import com.vladmihalcea.flexypool.strategy.UniqueNamingStrategy; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; + +import java.util.Arrays; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +@org.springframework.context.annotation.Configuration +public class FlexypoolConfig { + + @SuppressWarnings("unchecked") + @Bean(initMethod = "start", destroyMethod = "stop") + public FlexyPoolDataSource flexypoolDataSource() { + Configuration configuration = flexypoolConfiguration(); + return new FlexyPoolDataSource<>(configuration, new IncrementPoolOnTimeoutConnectionAcquiringStrategy.Factory<>(5), new RetryConnectionAcquiringStrategy.Factory<>(2)); + } + + @Bean + public Configuration flexypoolConfiguration() { + + HikariDataSource dataSource = hikariDataSource(); + + return new Configuration.Builder<>(UUID.randomUUID().toString(), dataSource, HikariCPPoolAdapter.FACTORY).setMetricsFactory(MicrometerMetrics::new) + .setConnectionProxyFactory(ConnectionDecoratorFactoryResolver.INSTANCE.resolve()) + .setMetricLogReporterMillis(TimeUnit.SECONDS.toMillis(5)) + .setMetricNamingUniqueName(UniqueNamingStrategy.INSTANCE) + .setJmxEnabled(true) + .setJmxAutoStart(true) + .setConnectionAcquireTimeThresholdMillis(50L) + .setConnectionLeaseTimeThresholdMillis(250L) + .setEventListenerResolver(() -> Arrays.asList(new ConnectionAcquireTimeoutEventListener(), new ConnectionAcquireTimeThresholdExceededEventListener(), new ConnectionLeaseTimeThresholdExceededEventListener())) + .build(); + } + + @Bean + public HikariDataSource hikariDataSource() { + + HikariConfig config = new HikariConfig(); + config.setJdbcUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;INIT=runscript from 'classpath:/db.sql'"); + config.setUsername(""); + config.setPassword(""); + config.addDataSourceProperty("cachePrepStmts", "true"); + config.addDataSourceProperty("prepStmtCacheSize", "250"); + config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); + config.addDataSourceProperty("minimumPoolSize", "1"); + config.addDataSourceProperty("maximumPoolSize", "3"); + config.addDataSourceProperty("connectionTimeout", "1000"); + return new HikariDataSource(config); + } +} + +class ConnectionAcquireTimeThresholdExceededEventListener extends EventListener { + + public static final Logger LOGGER = LoggerFactory.getLogger(ConnectionAcquireTimeThresholdExceededEventListener.class); + + public ConnectionAcquireTimeThresholdExceededEventListener() { + super(ConnectionAcquireTimeThresholdExceededEvent.class); + } + + @Override + public void on(ConnectionAcquireTimeThresholdExceededEvent event) { + LOGGER.info("ConnectionAcquireTimeThresholdExceededEvent Caught event {}", event); + } +} + +class ConnectionLeaseTimeThresholdExceededEventListener extends EventListener { + + public static final Logger LOGGER = LoggerFactory.getLogger(ConnectionLeaseTimeThresholdExceededEventListener.class); + + public ConnectionLeaseTimeThresholdExceededEventListener() { + super(ConnectionLeaseTimeThresholdExceededEvent.class); + } + + @Override + public void on(ConnectionLeaseTimeThresholdExceededEvent event) { + LOGGER.info("ConnectionLeaseTimeThresholdExceededEvent Caught event {}", event); + } +} + +class ConnectionAcquireTimeoutEventListener extends EventListener { + + public static final Logger LOGGER = LoggerFactory.getLogger(ConnectionAcquireTimeoutEventListener.class); + + public ConnectionAcquireTimeoutEventListener() { + super(ConnectionAcquireTimeoutEvent.class); + } + + @Override + public void on(ConnectionAcquireTimeoutEvent event) { + LOGGER.info("ConnectionAcquireTimeoutEvent Caught event {}", event); + } +} \ No newline at end of file diff --git a/libraries-data-db/src/main/java/com/baeldung/libraries/flexypool/FlexypoolDemoApplication.java b/libraries-data-db/src/main/java/com/baeldung/libraries/flexypool/FlexypoolDemoApplication.java new file mode 100644 index 0000000000..16d342f6f9 --- /dev/null +++ b/libraries-data-db/src/main/java/com/baeldung/libraries/flexypool/FlexypoolDemoApplication.java @@ -0,0 +1,53 @@ +package com.baeldung.libraries.flexypool; + +import com.baeldung.libraries.hikaricp.Employee; +import com.vladmihalcea.flexypool.FlexyPoolDataSource; +import com.zaxxer.hikari.HikariDataSource; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +@SpringBootApplication +public class FlexypoolDemoApplication { + + private static FlexyPoolDataSource poolDataSource; + + public FlexypoolDemoApplication(FlexyPoolDataSource poolDataSource) { + FlexypoolDemoApplication.poolDataSource = poolDataSource; + } + + public static List getEmployees() throws SQLException { + String SQL_QUERY = "select * from emp"; + List employees; + try (Connection con = poolDataSource.getConnection(); PreparedStatement pst = con.prepareStatement(SQL_QUERY); ResultSet rs = pst.executeQuery();) { + employees = new ArrayList<>(); + Employee employee; + while (rs.next()) { + employee = new Employee(); + employee.setEmpNo(rs.getInt("empno")); + employee.setEname(rs.getString("ename")); + employee.setJob(rs.getString("job")); + employee.setMgr(rs.getInt("mgr")); + employee.setHiredate(rs.getDate("hiredate")); + employee.setSal(rs.getInt("sal")); + employee.setComm(rs.getInt("comm")); + employee.setDeptno(rs.getInt("deptno")); + employees.add(employee); + } + } + return employees; + } + + public static void main(String[] args) throws SQLException { + SpringApplication.run(FlexypoolDemoApplication.class, args); + List employees = getEmployees(); + System.out.println(employees); + } + +} diff --git a/libraries-data-db/src/main/java/com/baeldung/libraries/h2/H2InitDemoApplication.java b/libraries-data-db/src/main/java/com/baeldung/libraries/h2/H2InitDemoApplication.java new file mode 100644 index 0000000000..36170fb263 --- /dev/null +++ b/libraries-data-db/src/main/java/com/baeldung/libraries/h2/H2InitDemoApplication.java @@ -0,0 +1,72 @@ +package com.baeldung.libraries.h2; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.DriverManager; + +@SpringBootApplication +public class H2InitDemoApplication { + + public static void main(String[] args) { + ApplicationContext ctx = SpringApplication.run(H2InitDemoApplication.class, args); + initDatabaseUsingPlainJDBCWithURL(); + initDatabaseUsingPlainJDBCWithFile(); + initDatabaseUsingSpring(ctx.getBean(DataSource.class)); + } + + /** + * Initialize in-memory database using plain JDBC and SQL + * statements in the URL. + */ + private static void initDatabaseUsingPlainJDBCWithURL() { + try (Connection conn = DriverManager. + getConnection("jdbc:h2:mem:baeldung;INIT=CREATE SCHEMA IF NOT EXISTS baeldung\\;SET SCHEMA baeldung;", + "admin", + "password")) { + conn.createStatement().execute("create table users (name VARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULL);"); + System.out.println("Created table users"); + conn.createStatement().execute("insert into users (name, email) values ('Mike', 'mike@baeldung.com')"); + System.out.println("Added user mike"); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * Initialize in-memory database using plain JDBC and SQL + * statements in a file. + */ + private static void initDatabaseUsingPlainJDBCWithFile() { + try (Connection conn = DriverManager. + getConnection("jdbc:h2:mem:baeldung;INIT=RUNSCRIPT FROM 'src/main/resources/h2init.sql';", + "admin", + "password")) { + conn.createStatement().execute("insert into users (name, email) values ('Mike', 'mike@baeldung.com')"); + System.out.println("Added user mike"); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * Initialize in-memory database using Spring Boot + * properties. See article for full details of required + * properties for this method to work. + */ + private static void initDatabaseUsingSpring(DataSource ds) { + try (Connection conn = ds.getConnection()) { + conn.createStatement().execute("insert into users (name, email) values ('Mike', 'mike@baeldung.com')"); + System.out.println("Added user mike"); + } + catch (Exception e) { + e.printStackTrace(); + } + } +} + diff --git a/libraries-data-db/src/main/resources/h2init.sql b/libraries-data-db/src/main/resources/h2init.sql new file mode 100644 index 0000000000..c6fb70bcc4 --- /dev/null +++ b/libraries-data-db/src/main/resources/h2init.sql @@ -0,0 +1,3 @@ +CREATE SCHEMA IF NOT EXISTS baeldung; +SET SCHEMA baeldung; +CREATE TABLE users (name VARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULL); diff --git a/libraries-files/pom.xml b/libraries-files/pom.xml index b36dc150a8..e4b3ffcdb2 100644 --- a/libraries-files/pom.xml +++ b/libraries-files/pom.xml @@ -38,22 +38,24 @@ ${jackson.version} - com.itextpdf - itext7-core - 7.2.4 - pom + com.itextpdf + itext7-core + ${itext7-core.version} + pom - - org.assertj - assertj-core - 3.23.1 - test + + org.assertj + assertj-core + ${assertj-core.version} + test 0.5.4 2.8.0 + 7.2.4 + 3.23.1 \ No newline at end of file diff --git a/libraries-http/pom.xml b/libraries-http/pom.xml index 0077a5047e..18ba571f60 100644 --- a/libraries-http/pom.xml +++ b/libraries-http/pom.xml @@ -52,11 +52,6 @@ async-http-client ${async.http.client.version} - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - com.google.code.gson gson diff --git a/libraries-primitive/pom.xml b/libraries-primitive/pom.xml index badcfc443d..114ec64848 100644 --- a/libraries-primitive/pom.xml +++ b/libraries-primitive/pom.xml @@ -3,7 +3,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung libraries-primitive 1.0-SNAPSHOT libraries-primitive diff --git a/linux-bash/command-line-arguments/src/main/bash/README.md b/linux-bash-modules/command-line-arguments/src/main/bash/README.md similarity index 100% rename from linux-bash/command-line-arguments/src/main/bash/README.md rename to linux-bash-modules/command-line-arguments/src/main/bash/README.md diff --git a/linux-bash/command-line-arguments/src/main/bash/userReg-flags.sh b/linux-bash-modules/command-line-arguments/src/main/bash/userReg-flags.sh similarity index 100% rename from linux-bash/command-line-arguments/src/main/bash/userReg-flags.sh rename to linux-bash-modules/command-line-arguments/src/main/bash/userReg-flags.sh diff --git a/linux-bash/command-line-arguments/src/main/bash/userReg-positional-parameter.sh b/linux-bash-modules/command-line-arguments/src/main/bash/userReg-positional-parameter.sh similarity index 100% rename from linux-bash/command-line-arguments/src/main/bash/userReg-positional-parameter.sh rename to linux-bash-modules/command-line-arguments/src/main/bash/userReg-positional-parameter.sh diff --git a/linux-bash/command-line-arguments/src/main/bash/users-loop.sh b/linux-bash-modules/command-line-arguments/src/main/bash/users-loop.sh similarity index 100% rename from linux-bash/command-line-arguments/src/main/bash/users-loop.sh rename to linux-bash-modules/command-line-arguments/src/main/bash/users-loop.sh diff --git a/linux-bash/command-line-arguments/src/main/bash/users-shift-operator.sh b/linux-bash-modules/command-line-arguments/src/main/bash/users-shift-operator.sh similarity index 100% rename from linux-bash/command-line-arguments/src/main/bash/users-shift-operator.sh rename to linux-bash-modules/command-line-arguments/src/main/bash/users-shift-operator.sh diff --git a/linux-bash/functions/src/main/bash/README.md b/linux-bash-modules/functions/src/main/bash/README.md similarity index 100% rename from linux-bash/functions/src/main/bash/README.md rename to linux-bash-modules/functions/src/main/bash/README.md diff --git a/linux-bash/functions/src/main/bash/functions.sh b/linux-bash-modules/functions/src/main/bash/functions.sh similarity index 100% rename from linux-bash/functions/src/main/bash/functions.sh rename to linux-bash-modules/functions/src/main/bash/functions.sh diff --git a/linux-bash/functions/src/main/bash/infile b/linux-bash-modules/functions/src/main/bash/infile similarity index 100% rename from linux-bash/functions/src/main/bash/infile rename to linux-bash-modules/functions/src/main/bash/infile diff --git a/linux-bash/json/README.md b/linux-bash-modules/json/README.md similarity index 100% rename from linux-bash/json/README.md rename to linux-bash-modules/json/README.md diff --git a/linux-bash/json/src/main/bash/fruit.json b/linux-bash-modules/json/src/main/bash/fruit.json similarity index 100% rename from linux-bash/json/src/main/bash/fruit.json rename to linux-bash-modules/json/src/main/bash/fruit.json diff --git a/linux-bash/json/src/main/bash/fruits.json b/linux-bash-modules/json/src/main/bash/fruits.json similarity index 100% rename from linux-bash/json/src/main/bash/fruits.json rename to linux-bash-modules/json/src/main/bash/fruits.json diff --git a/linux-bash/json/src/main/bash/jq.sh b/linux-bash-modules/json/src/main/bash/jq.sh similarity index 100% rename from linux-bash/json/src/main/bash/jq.sh rename to linux-bash-modules/json/src/main/bash/jq.sh diff --git a/linux-bash/json/src/main/bash/wikipedia.json b/linux-bash-modules/json/src/main/bash/wikipedia.json similarity index 100% rename from linux-bash/json/src/main/bash/wikipedia.json rename to linux-bash-modules/json/src/main/bash/wikipedia.json diff --git a/linux-bash/loops/README.md b/linux-bash-modules/loops/README.md similarity index 100% rename from linux-bash/loops/README.md rename to linux-bash-modules/loops/README.md diff --git a/linux-bash/loops/src/main/bash/find_directories.sh b/linux-bash-modules/loops/src/main/bash/find_directories.sh similarity index 100% rename from linux-bash/loops/src/main/bash/find_directories.sh rename to linux-bash-modules/loops/src/main/bash/find_directories.sh diff --git a/linux-bash/loops/src/main/bash/loop_directories.sh b/linux-bash-modules/loops/src/main/bash/loop_directories.sh similarity index 100% rename from linux-bash/loops/src/main/bash/loop_directories.sh rename to linux-bash-modules/loops/src/main/bash/loop_directories.sh diff --git a/linux-bash/read/README.md b/linux-bash-modules/read/README.md similarity index 100% rename from linux-bash/read/README.md rename to linux-bash-modules/read/README.md diff --git a/linux-bash/read/src/main/bash/file.csv b/linux-bash-modules/read/src/main/bash/file.csv similarity index 100% rename from linux-bash/read/src/main/bash/file.csv rename to linux-bash-modules/read/src/main/bash/file.csv diff --git a/linux-bash/read/src/main/bash/read_inputs.sh b/linux-bash-modules/read/src/main/bash/read_inputs.sh similarity index 100% rename from linux-bash/read/src/main/bash/read_inputs.sh rename to linux-bash-modules/read/src/main/bash/read_inputs.sh diff --git a/linux-bash/text/README.md b/linux-bash-modules/text/README.md similarity index 100% rename from linux-bash/text/README.md rename to linux-bash-modules/text/README.md diff --git a/linux-bash/text/src/main/bash/append_multiple_lines.sh b/linux-bash-modules/text/src/main/bash/append_multiple_lines.sh similarity index 100% rename from linux-bash/text/src/main/bash/append_multiple_lines.sh rename to linux-bash-modules/text/src/main/bash/append_multiple_lines.sh diff --git a/linux-bash/text/src/main/bash/remove_characters.sh b/linux-bash-modules/text/src/main/bash/remove_characters.sh similarity index 100% rename from linux-bash/text/src/main/bash/remove_characters.sh rename to linux-bash-modules/text/src/main/bash/remove_characters.sh diff --git a/logging-modules/log4j2/pom.xml b/logging-modules/log4j2/pom.xml index 9fa58769b2..da2984442c 100644 --- a/logging-modules/log4j2/pom.xml +++ b/logging-modules/log4j2/pom.xml @@ -63,7 +63,6 @@ org.apache.maven.plugins maven-compiler-plugin - ${maven-compiler-plugin.version} none diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/standardexception/CustomException.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/standardexception/CustomException.java new file mode 100644 index 0000000000..bee85b3398 --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/standardexception/CustomException.java @@ -0,0 +1,7 @@ +package com.baeldung.lombok.standardexception; + +import lombok.experimental.StandardException; + +@StandardException +public class CustomException extends NumberFormatException { +} diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/standardexception/CustomNumberFormatException.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/standardexception/CustomNumberFormatException.java new file mode 100644 index 0000000000..fbd98cac16 --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/standardexception/CustomNumberFormatException.java @@ -0,0 +1,11 @@ +package com.baeldung.lombok.standardexception; + +public class CustomNumberFormatException extends NumberFormatException { + public CustomNumberFormatException() { + super(); + } + + public CustomNumberFormatException(String s) { + super(s); + } +} \ No newline at end of file diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/valvar/ValExample.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/valvar/ValExample.java index b7ecd95fa8..f436ef81dd 100644 --- a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/valvar/ValExample.java +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/valvar/ValExample.java @@ -1,7 +1,6 @@ package com.baeldung.lombok.valvar; import lombok.val; -import lombok.var; import java.util.ArrayList; import java.util.HashMap; diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/valvar/VarExample.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/valvar/VarExample.java index 6fabf66590..138264db09 100644 --- a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/valvar/VarExample.java +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/valvar/VarExample.java @@ -1,6 +1,5 @@ package com.baeldung.lombok.valvar; -import lombok.var; import java.util.ArrayList; import java.util.Arrays; diff --git a/lombok-modules/lombok-custom/pom.xml b/lombok-modules/lombok-custom/pom.xml index c119900c8a..1f7f630772 100644 --- a/lombok-modules/lombok-custom/pom.xml +++ b/lombok-modules/lombok-custom/pom.xml @@ -53,11 +53,27 @@ + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + 1.14.8 1.8 3.3.0-v_771 + 1.8 + 1.8 \ No newline at end of file diff --git a/lombok-modules/lombok/pom.xml b/lombok-modules/lombok/pom.xml index 1be22f0bc2..57b2a5a999 100644 --- a/lombok-modules/lombok/pom.xml +++ b/lombok-modules/lombok/pom.xml @@ -40,41 +40,19 @@ true - - - org.projectlombok - lombok-maven-plugin - ${delombok-maven-plugin.version} - - - delombok - generate-sources - - delombok - - - ${project.basedir}/src/main/java - ${project.build.directory}/delombok - false - - skip - - false - - - - - - - - - + edge-SNAPSHOT 1.0.0.Final 1.18.20.0 23.0.0 + + + projectlombok.org + https://projectlombok.org/edge-releases + + \ No newline at end of file diff --git a/lombok-modules/pom.xml b/lombok-modules/pom.xml index 7ca303af9d..f2bfdb51c0 100644 --- a/lombok-modules/pom.xml +++ b/lombok-modules/pom.xml @@ -18,10 +18,21 @@ lombok lombok-2 - lombok-custom + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + + @@ -32,4 +43,9 @@ + + 11 + 11 + + \ No newline at end of file diff --git a/mapstruct/README.md b/mapstruct/README.md index 384bcbaa14..46a9f8b213 100644 --- a/mapstruct/README.md +++ b/mapstruct/README.md @@ -9,3 +9,4 @@ This module contains articles about MapStruct. - [Using Multiple Source Objects with MapStruct](https://www.baeldung.com/mapstruct-multiple-source-objects) - [Ignoring Unmapped Properties with MapStruct](https://www.baeldung.com/mapstruct-ignore-unmapped-properties) - [Mapping Collections with MapStruct](https://www.baeldung.com/java-mapstruct-mapping-collections) +- [Use Mapper in Another Mapper with Mapstruct and Java](https://www.baeldung.com/java-mapstruct-nested-mapping) diff --git a/maven-modules/version-collision/dependencyconvergence.xml b/maven-modules/version-collision/dependencyconvergence.xml new file mode 100644 index 0000000000..8f57cbf1d5 --- /dev/null +++ b/maven-modules/version-collision/dependencyconvergence.xml @@ -0,0 +1,22 @@ + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.3.0 + + + enforce + + + + + + + enforce + + + + + + \ No newline at end of file diff --git a/maven-modules/version-collision/dependencyconvergence_exclude_scenario.xml b/maven-modules/version-collision/dependencyconvergence_exclude_scenario.xml new file mode 100644 index 0000000000..32b0462a11 --- /dev/null +++ b/maven-modules/version-collision/dependencyconvergence_exclude_scenario.xml @@ -0,0 +1,26 @@ + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.3.0 + + + enforce + + + + + com.google.guava:guava + + + + + + enforce + + + + + + \ No newline at end of file diff --git a/maven-modules/version-collision/dependencyconvergence_include_scenario.xml b/maven-modules/version-collision/dependencyconvergence_include_scenario.xml new file mode 100644 index 0000000000..9e4680fc91 --- /dev/null +++ b/maven-modules/version-collision/dependencyconvergence_include_scenario.xml @@ -0,0 +1,26 @@ + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.3.0 + + + enforce + + + + + com.google.guava:guava + + + + + + enforce + + + + + + \ No newline at end of file diff --git a/messaging-modules/rabbitmq/README.md b/messaging-modules/rabbitmq/README.md index 93bb795d7b..8cfcca3378 100644 --- a/messaging-modules/rabbitmq/README.md +++ b/messaging-modules/rabbitmq/README.md @@ -9,3 +9,4 @@ This module contains articles about RabbitMQ. - [Channels and Connections in RabbitMQ](https://www.baeldung.com/java-rabbitmq-channels-connections) - [Create Dynamic Queues in RabbitMQ](https://www.baeldung.com/rabbitmq-dynamic-queues) + diff --git a/messaging-modules/spring-jms/pom.xml b/messaging-modules/spring-jms/pom.xml index 2dee95136d..ef1e0cb3a8 100644 --- a/messaging-modules/spring-jms/pom.xml +++ b/messaging-modules/spring-jms/pom.xml @@ -44,19 +44,19 @@ org.mockito mockito-core - 4.6.1 + ${mockito-core.version} test org.apache.activemq.tooling activemq-junit - 5.16.5 + ${activemq-junit.version} test org.testcontainers testcontainers - 1.17.3 + ${testcontainers.version} test @@ -83,6 +83,9 @@ 5.14.1 1.5.10.RELEASE 3.3.2 + 4.6.1 + 5.16.5 + 1.17.3 \ No newline at end of file diff --git a/microservices-modules/rest-express/pom.xml b/microservices-modules/rest-express/pom.xml index e3fed19e29..eda27ec164 100644 --- a/microservices-modules/rest-express/pom.xml +++ b/microservices-modules/rest-express/pom.xml @@ -23,15 +23,6 @@ rest-express jar - - 0.3.3 - 3.1.2 - 2.6 - 0.11.3 - 1.0 - 0.4.8 - 4.11 - @@ -98,7 +89,7 @@ org.codehaus.mojo exec-maven-plugin - 1.2.1 + ${exec-maven-plugin.version} com.baeldung.restexpress.Main @@ -106,7 +97,7 @@ org.apache.maven.plugins maven-shade-plugin - 2.4.1 + ${maven-shade-plugin.version} false @@ -140,8 +131,22 @@ org.codehaus.mojo versions-maven-plugin - 2.0 + ${versions-maven-plugin.version} + + + 0.3.3 + 3.1.2 + 2.6 + 0.11.3 + 1.0 + 0.4.8 + 4.11 + 1.2.1 + 2.4.1 + 2.0 + + diff --git a/persistence-modules/hibernate-exceptions/src/test/java/com/baeldung/hibernate/exception/detachedentity/DetachedEntityUnitTest.java b/persistence-modules/hibernate-exceptions/src/test/java/com/baeldung/hibernate/exception/detachedentity/DetachedEntityUnitTest.java index c10b319319..cb4313c537 100644 --- a/persistence-modules/hibernate-exceptions/src/test/java/com/baeldung/hibernate/exception/detachedentity/DetachedEntityUnitTest.java +++ b/persistence-modules/hibernate-exceptions/src/test/java/com/baeldung/hibernate/exception/detachedentity/DetachedEntityUnitTest.java @@ -42,7 +42,7 @@ public class DetachedEntityUnitTest { assertThatThrownBy(() -> session.persist(detachedPost)) .isInstanceOf(PersistenceException.class) - .hasMessageContaining("`org.hibernate.PersistentObjectException` to JPA `PersistenceException` : detached entity passed to persist"); + .hasMessageContaining("detached entity passed to persist: com.baeldung.hibernate.exception.detachedentity.entity.Post"); } @Test @@ -71,13 +71,13 @@ public class DetachedEntityUnitTest { assertThatThrownBy(() -> session.persist(detachedPost)) .isInstanceOf(PersistenceException.class) - .hasMessageContaining("`org.hibernate.PersistentObjectException` to JPA `PersistenceException` : detached entity passed to persist"); + .hasMessageContaining("detached entity passed to persist: com.baeldung.hibernate.exception.detachedentity.entity.Post"); } @Test public void givenDetachedPost_whenMergeAndPersistComment_thenNoExceptionIsThrown() { Comment comment = new Comment("nice article!"); - Post mergedPost = (Post) session.merge(detachedPost); + Post mergedPost = session.merge(detachedPost); comment.setPost(mergedPost); session.persist(comment); diff --git a/persistence-modules/hibernate-jpa/pom.xml b/persistence-modules/hibernate-jpa/pom.xml index 086e487eb9..5a99c1c4d0 100644 --- a/persistence-modules/hibernate-jpa/pom.xml +++ b/persistence-modules/hibernate-jpa/pom.xml @@ -83,7 +83,6 @@ - 6.1.7.Final 8.0.32 2.6.0 3.0.4 @@ -92,4 +91,4 @@ 1.4.6 - \ No newline at end of file + diff --git a/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/entitymanager/getreference/GetReferenceH2IntegrationTest.java b/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/entitymanager/getreference/GetReferenceH2IntegrationTest.java index 02744c8ee5..86f059c6d7 100644 --- a/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/entitymanager/getreference/GetReferenceH2IntegrationTest.java +++ b/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/entitymanager/getreference/GetReferenceH2IntegrationTest.java @@ -136,9 +136,6 @@ public class GetReferenceH2IntegrationTest { }); StringBuilder expected = new StringBuilder(); - expected.append("Hibernate: select "); - expected.append("p1_0.id,g1_0.id,g1_0.name,p1_0.name "); - expected.append("from Player p1_0 left join Game g1_0 on g1_0.id=p1_0.game_id where p1_0.id=?" + System.lineSeparator()); expected.append("Hibernate: delete from Player where id=?" + System.lineSeparator()); assertEquals(expected.toString(), output.toString()); @@ -161,7 +158,7 @@ public class GetReferenceH2IntegrationTest { expected.append("Hibernate: select "); expected.append("p1_0.id,g1_0.id,g1_0.name,p1_0.name "); expected.append("from Player p1_0 left join Game g1_0 on g1_0.id=p1_0.game_id where p1_0.id=?" + System.lineSeparator()); - expected.append("Hibernate: update Player set game_id=?, name=? where id=?" + System.lineSeparator()); + expected.append("Hibernate: update Player set game_id=?,name=? where id=?" + System.lineSeparator()); assertEquals(expected.toString(), output.toString()); } @@ -182,7 +179,7 @@ public class GetReferenceH2IntegrationTest { expected.append("Hibernate: select "); expected.append("p1_0.id,g1_0.id,g1_0.name,p1_0.name "); expected.append("from Player p1_0 left join Game g1_0 on g1_0.id=p1_0.game_id where p1_0.id=?" + System.lineSeparator()); - expected.append("Hibernate: update Player set game_id=?, name=? where id=?" + System.lineSeparator()); + expected.append("Hibernate: update Player set game_id=?,name=? where id=?" + System.lineSeparator()); assertEquals(expected.toString(), output.toString()); } diff --git a/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java b/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java index d9bffcfc08..16d1057285 100644 --- a/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java +++ b/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java @@ -81,13 +81,10 @@ public class EmployeeSearchServiceIntegrationTest { @Test public final void givenCriteriaQuery_whenSearchedUsingCriteriaBuilderWithListofAuthors_thenResultIsFilteredByAuthorNames() { - List titles = new ArrayList<>() { - { - add("Manager"); - add("Senior Manager"); - add("Director"); - } - }; + List titles = new ArrayList<>(); + titles.add("Manager"); + titles.add("Senior Manager"); + titles.add("Director"); List result = searchService.filterbyTitleUsingCriteriaBuilder(titles); assertEquals("Number of Employees does not match with expected.", 6, result.size()); assertThat(result.stream() diff --git a/persistence-modules/hibernate-mapping-2/pom.xml b/persistence-modules/hibernate-mapping-2/pom.xml index a56f67b202..1b9a3e45d3 100644 --- a/persistence-modules/hibernate-mapping-2/pom.xml +++ b/persistence-modules/hibernate-mapping-2/pom.xml @@ -62,7 +62,6 @@ 6.0.6 3.0.3 - 6.1.7.Final 9.0.0.M26 4.0.2 2.1.214 diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/util/HibernateUtil.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/HibernateUtil.java similarity index 80% rename from persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/util/HibernateUtil.java rename to persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/HibernateUtil.java index d429564564..26ad7e77ba 100644 --- a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/util/HibernateUtil.java +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/HibernateUtil.java @@ -1,4 +1,4 @@ -package com.baeldung.manytomany.util; +package com.baeldung; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; @@ -9,6 +9,10 @@ import org.slf4j.LoggerFactory; import com.baeldung.manytomany.model.Employee; import com.baeldung.manytomany.model.Project; +import com.baeldung.uuids.WebSiteUser; +import com.baeldung.uuids.Element; +import com.baeldung.uuids.Reservation; +import com.baeldung.uuids.Sale; public class HibernateUtil { @@ -21,6 +25,10 @@ public class HibernateUtil { Configuration configuration = new Configuration(); configuration.addAnnotatedClass(Employee.class); configuration.addAnnotatedClass(Project.class); + configuration.addAnnotatedClass(WebSiteUser.class); + configuration.addAnnotatedClass(Element.class); + configuration.addAnnotatedClass(Reservation.class); + configuration.addAnnotatedClass(Sale.class); configuration.configure("manytomany.cfg.xml"); LOGGER.debug("Hibernate Annotation Configuration loaded"); diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/Element.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/Element.java new file mode 100644 index 0000000000..1a17cba90c --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/Element.java @@ -0,0 +1,32 @@ +package com.baeldung.uuids; + +import java.util.UUID; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import org.hibernate.annotations.UuidGenerator; + +@Entity +public class Element { + + @Id + @UuidGenerator + private String id; + + private String name; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/Reservation.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/Reservation.java new file mode 100644 index 0000000000..83b232d940 --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/Reservation.java @@ -0,0 +1,43 @@ +package com.baeldung.uuids; + +import java.util.UUID; +import jakarta.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; + +@Entity +public class Reservation { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; + + private String status; + + private String number; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getNumber() { + return number; + } + + public void setNumber(String number) { + this.number = number; + } +} diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/Sale.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/Sale.java new file mode 100644 index 0000000000..f9b1c246cd --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/Sale.java @@ -0,0 +1,36 @@ +package com.baeldung.uuids; + +import jakarta.persistence.Id; +import jakarta.persistence.Entity; +import org.hibernate.annotations.UuidGenerator; + +import java.util.UUID; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import org.hibernate.annotations.UuidGenerator; + +@Entity +public class Sale { + + @Id + @UuidGenerator + private UUID id; + + private boolean completed; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public boolean isCompleted() { + return completed; + } + + public void setCompleted(boolean completed) { + this.completed = completed; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/WebSiteUser.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/WebSiteUser.java new file mode 100644 index 0000000000..1150c03dcc --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/WebSiteUser.java @@ -0,0 +1,33 @@ +package com.baeldung.uuids; + +import java.util.UUID; +import java.time.LocalDate; +import jakarta.persistence.Id; +import jakarta.persistence.Entity; +import org.hibernate.annotations.UuidGenerator; + +@Entity +public class WebSiteUser { + + @Id + @UuidGenerator(style = UuidGenerator.Style.TIME) + private UUID id; + + private LocalDate registrationDate; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public LocalDate getRegistrationDate() { + return registrationDate; + } + + public void setRegistrationDate(LocalDate registrationDate) { + this.registrationDate = registrationDate; + } +} diff --git a/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java index 5255cb040f..15ad2c50b9 100644 --- a/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java +++ b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java @@ -17,7 +17,7 @@ import org.junit.Test; import com.baeldung.manytomany.model.Employee; import com.baeldung.manytomany.model.Project; -import com.baeldung.manytomany.util.HibernateUtil; +import com.baeldung.HibernateUtil; /** * Configured in: manytomany.cfg.xml diff --git a/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/uuids/UUIDsHibernateGenerationIntegrationTest.java b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/uuids/UUIDsHibernateGenerationIntegrationTest.java new file mode 100644 index 0000000000..7d605484ed --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/uuids/UUIDsHibernateGenerationIntegrationTest.java @@ -0,0 +1,78 @@ +package com.baeldung.hibernate.uuids; + +import com.baeldung.HibernateUtil; + +import com.baeldung.uuids.Reservation; +import com.baeldung.uuids.Sale; +import com.baeldung.uuids.WebSiteUser; +import com.baeldung.uuids.Element; +import org.assertj.core.api.Assertions; +import java.io.IOException; + +import org.hibernate.SessionFactory; +import org.hibernate.Session; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.Test; +import java.util.UUID; +import java.time.LocalDate; + +public class UUIDsHibernateGenerationIntegrationTest { + + private SessionFactory sessionFactory; + + private Session session; + + @Before + public void setUp() throws IOException { + sessionFactory = HibernateUtil.getSessionFactory(); + session = sessionFactory.openSession(); + } + + @Test + public void whenGeneratingUUIDUsingNewJPAGenerationType_thenHibernateGeneratedUUID() throws IOException { + Reservation reservation = new Reservation(); + reservation.setStatus("created"); + reservation.setNumber("12345"); + UUID saved = (UUID) session.save(reservation); + Assertions.assertThat(saved).isNotNull(); + } + + @Test + public void whenGeneratingUUIDUsingNewJPAGenerationType_thenHibernateGeneratedUUIDOfVersion4() throws IOException { + Reservation reservation = new Reservation(); + reservation.setStatus("new"); + reservation.setNumber("012"); + UUID saved = (UUID) session.save(reservation); + Assertions.assertThat(saved).isNotNull(); + Assertions.assertThat(saved.version()).isEqualTo(4); + } + + @Test + public void whenGeneratingUUIDUsingGenericConverter_thenAlsoGetUUIDGeneratedVersion4() throws IOException { + Sale sale = new Sale(); + sale.setCompleted(true); + UUID saved = (UUID) session.save(sale); + Assertions.assertThat(saved).isNotNull(); + Assertions.assertThat(saved.version()).isEqualTo(4); + } + + @Test + public void whenGeneratingTimeBasedUUID_thenUUIDGeneratedVersion1() throws IOException { + WebSiteUser user = new WebSiteUser(); + user.setRegistrationDate(LocalDate.now()); + UUID saved = (UUID) session.save(user); + Assertions.assertThat(saved).isNotNull(); + Assertions.assertThat(saved.version()).isEqualTo(1); + } + + @Test + public void whenGeneratingUUIDAsString_thenUUIDGeneratedVersion1() throws IOException { + Element element = new Element(); + element.setName("a"); + String saved = (String) session.save(element); + Assertions.assertThat(saved).isNotEmpty(); + Assertions.assertThat(UUID.fromString(saved).version()).isEqualTo(4); + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/keywords/HibernateKeywordsApplicationIntegrationTest.java b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/keywords/HibernateKeywordsApplicationManualTest.java similarity index 78% rename from persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/keywords/HibernateKeywordsApplicationIntegrationTest.java rename to persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/keywords/HibernateKeywordsApplicationManualTest.java index 4282da3de4..780a0fd77e 100644 --- a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/keywords/HibernateKeywordsApplicationIntegrationTest.java +++ b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/keywords/HibernateKeywordsApplicationManualTest.java @@ -3,8 +3,6 @@ package com.baeldung.hibernate.keywords; import static java.util.UUID.randomUUID; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import javax.persistence.PersistenceException; - import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; @@ -13,7 +11,17 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -public class HibernateKeywordsApplicationIntegrationTest { +import jakarta.persistence.PersistenceException; + +/** + * This test suite uses testcontainers library and therefore + * requires Docker installed on the local system to be able to run it. + * + * When docker is available on the local machine it can be run either by: + * - running it from your favorite IDE + * - or through `mvn test -Dtest=HibernateKeywordsApplicationManualTest` + */ +public class HibernateKeywordsApplicationManualTest { private static SessionFactory sessionFactory; private Session session; diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 85cf251d18..46ac9b50f1 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -114,10 +114,10 @@ - 6.1.7.Final + 6.2.0.Final 42.5.4 2.3.4 1.16.3 - \ No newline at end of file + diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/dataloading/ApplicationDataLoading.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/dataloading/ApplicationDataLoading.java new file mode 100644 index 0000000000..40742d303e --- /dev/null +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/dataloading/ApplicationDataLoading.java @@ -0,0 +1,16 @@ +package com.baeldung.dataloading; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.core.env.AbstractEnvironment; + +@SpringBootApplication(scanBasePackages = { "com.baeldung.dataloading" }) +public class ApplicationDataLoading { + + public static void main(String[] args) { + System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, "datasource"); + + SpringApplication.run(ApplicationDataLoading.class, args); + } + +} diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/dataloading/model/Country.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/dataloading/model/Country.java new file mode 100644 index 0000000000..692d48caf0 --- /dev/null +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/dataloading/model/Country.java @@ -0,0 +1,36 @@ +package com.baeldung.dataloading.model; + +import static javax.persistence.GenerationType.IDENTITY; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +public class Country { + + @Id + @GeneratedValue(strategy = IDENTITY) + private Integer id; + + @Column(nullable = false) + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/persistence-modules/spring-boot-persistence/src/main/resources/application-datasource.properties b/persistence-modules/spring-boot-persistence/src/main/resources/application-datasource.properties new file mode 100644 index 0000000000..98cf2ba965 --- /dev/null +++ b/persistence-modules/spring-boot-persistence/src/main/resources/application-datasource.properties @@ -0,0 +1,14 @@ +spring.datasource.driver-class-name=org.h2.Driver +spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 +spring.datasource.username=sa +spring.datasource.password= + +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +spring.jpa.hibernate.ddl-auto=create +spring.jpa.defer-datasource-initialization=true + +# Enabling H2 Console +spring.h2.console.enabled=true + +# By default enabled for Embedded Databases +#spring.sql.init.mode=always \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/Library.java b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/Library.java new file mode 100644 index 0000000000..04c0ad5e0a --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/Library.java @@ -0,0 +1,66 @@ +package com.baeldung.spring.data.jpa.listrepositories.entity; + +import jakarta.persistence.*; + +import java.util.ArrayList; +import java.util.List; + +@Entity(name = "library") +public class Library { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + + @Convert(converter = StringListConverter.class) + @Column(name = "addresses", nullable = false) + private List addresses = new ArrayList<>(); + + @ElementCollection(targetClass = String.class, fetch = FetchType.EAGER) + @CollectionTable(name = "book", joinColumns = @JoinColumn(name = "library_id")) + @Column(name = "book", nullable = false) + private List books = new ArrayList<>(); + + public Library() { + } + + public Library(String name, List addresses, List books) { + this.name = name; + this.addresses = addresses; + this.books = books; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getAddresses() { + return addresses; + } + + public void setAddresses(List addresses) { + this.addresses = addresses; + } + + public List getBooks() { + return books; + } + + public void setBooks(List books) { + this.books = books; + } +} diff --git a/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/StringListConverter.java b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/StringListConverter.java new file mode 100644 index 0000000000..ffc097ee18 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/StringListConverter.java @@ -0,0 +1,25 @@ +package com.baeldung.spring.data.jpa.listrepositories.entity; + +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; + +import java.util.Arrays; +import java.util.List; + + +import static java.util.Collections.*; + +@Converter +public class StringListConverter implements AttributeConverter, String> { + private static final String SPLIT_CHAR = ";"; + + @Override + public String convertToDatabaseColumn(List stringList) { + return stringList != null ? String.join(SPLIT_CHAR, stringList) : ""; + } + + @Override + public List convertToEntityAttribute(String string) { + return string != null ? Arrays.asList(string.split(SPLIT_CHAR)) : emptyList(); + } +} \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/repository/LibraryRepository.java b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/repository/LibraryRepository.java new file mode 100644 index 0000000000..71deb04b3e --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/repository/LibraryRepository.java @@ -0,0 +1,13 @@ +package com.baeldung.spring.data.jpa.listrepositories.repository; + +import com.baeldung.spring.data.jpa.listrepositories.entity.Library; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface LibraryRepository extends CrudRepository { + @Query("SELECT l FROM library l JOIN FETCH l.books WHERE l.id = (:id)") + Library findById(@Param("id") long id); +} diff --git a/persistence-modules/spring-data-jpa-repo-3/src/test/java/com/baeldung/spring/data/jpa/listrepositories/repository/LibraryIntegrationTest.java b/persistence-modules/spring-data-jpa-repo-3/src/test/java/com/baeldung/spring/data/jpa/listrepositories/repository/LibraryIntegrationTest.java new file mode 100644 index 0000000000..7bd1b90407 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-3/src/test/java/com/baeldung/spring/data/jpa/listrepositories/repository/LibraryIntegrationTest.java @@ -0,0 +1,32 @@ +package com.baeldung.spring.data.jpa.listrepositories.repository; + +import com.baeldung.spring.data.jpa.listrepositories.entity.Library; +import jakarta.transaction.Transactional; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.Arrays; + +@SpringBootTest +public class LibraryIntegrationTest { + + @Autowired + private LibraryRepository libraryRepository; + + @Test + @Transactional + public void givenLibrary_whenGetAddressesAndGetBooks_thenGetListOfItems(){ + Library library = new Library(); + library.setAddresses(Arrays.asList("Address 1", "Address 2")); + library.setBooks(Arrays.asList("Book 1", "Book 2")); + + libraryRepository.save(library); + Library lib = libraryRepository.findById(library.getId().longValue()); + + Assertions.assertEquals(2, lib.getAddresses().size()); + Assertions.assertEquals(2, lib.getBooks().size()); + } + +} diff --git a/pom.xml b/pom.xml index ca50f630ae..4e5970d301 100644 --- a/pom.xml +++ b/pom.xml @@ -330,10 +330,9 @@ parent-spring-5 parent-java - checker-plugin - + checker-framework + - core-java-modules/core-java core-java-modules/core-java-8 core-java-modules/core-java-8-2 core-java-modules/core-java-8-datetime @@ -354,16 +353,13 @@ - java-jdi - jetbrains - jhipster-5 language-interop - libraries-3 + libraries-jdk8 - lombok-modules + lombok-modules/lombok-custom muleesb @@ -488,10 +484,7 @@ jenkins-modules jhipster-modules - jhipster-5 jws - - libraries-6 @@ -527,10 +520,9 @@ parent-spring-5 parent-java - checker-plugin - + checker-framework + - core-java-modules/core-java core-java-modules/core-java-8 core-java-modules/core-java-8-2 core-java-modules/core-java-8-datetime @@ -551,15 +543,12 @@ - java-jdi - - jhipster-5 language-interop - libraries-3 + libraries-jdk8 - lombok-modules + lombok-modules/lombok-custom muleesb web-modules @@ -666,10 +655,7 @@ jenkins-modules jhipster-modules - jhipster-5 jws - - libraries-6 @@ -735,6 +721,7 @@ + lombok-modules osgi spring-katharsis logging-modules @@ -807,7 +794,6 @@ custom-pmd - spring-core-6 data-structures ddd-contexts jackson-modules @@ -818,6 +804,7 @@ guava-modules kubernetes-modules libraries-concurrency + jhipster-6 libraries-testing maven-modules optaplanner @@ -860,7 +847,7 @@ axon bazel - code-generation + google-auto-project ddd discord4j disruptor @@ -874,7 +861,7 @@ hystrix jackson-simple java-blockchain - + java-jdi java-rmi java-spi javax-sound @@ -893,6 +880,7 @@ libraries-2 libraries-4 libraries-5 + libraries-6 libraries-apache-commons libraries-apache-commons-collections @@ -928,7 +916,7 @@ spring-activiti spring-core-2 spring-core-3 - spring-core-5 + spring-credhub spring-di-3 spring-cucumber @@ -952,6 +940,7 @@ persistence-modules/questdb vaadin + libraries-3 @@ -985,6 +974,7 @@ + lombok-modules osgi spring-katharsis logging-modules @@ -1056,7 +1046,6 @@ spring-aop spring-aop-2 custom-pmd - spring-core-6 data-structures ddd-contexts jackson-modules @@ -1068,6 +1057,7 @@ guava-modules kubernetes-modules libraries-concurrency + jhipster-6 libraries-testing maven-modules optaplanner @@ -1109,7 +1099,7 @@ axon bazel - code-generation + google-auto-project ddd discord4j disruptor @@ -1125,7 +1115,7 @@ hystrix jackson-simple java-blockchain - + java-jdi java-rmi java-spi javax-sound @@ -1141,8 +1131,10 @@ ksqldb libraries + libraries-2 libraries-4 libraries-5 + libraries-6 libraries-apache-commons libraries-apache-commons-collections libraries-apache-commons-io @@ -1152,6 +1144,7 @@ libraries-http libraries-http-2 libraries-io + libraries-ai libraries-primitive libraries-rpc libraries-server @@ -1178,7 +1171,7 @@ spring-activiti spring-core-2 spring-core-3 - spring-core-5 + spring-credhub spring-di-3 spring-cucumber @@ -1196,11 +1189,12 @@ xstream webrtc persistence-modules/java-mongodb - libraries-2 + messaging-modules persistence-modules/questdb vaadin + libraries-3 diff --git a/security-modules/pom.xml b/security-modules/pom.xml index ed88ef842e..d0edced4e0 100644 --- a/security-modules/pom.xml +++ b/security-modules/pom.xml @@ -17,7 +17,7 @@ apache-shiro cas cloud-foundry-uaa - + java-ee-8-security-api jee-7-security jjwt jwt diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 83b935f845..1de19fc867 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -63,10 +63,6 @@ spring-boot-nashorn spring-boot-parent spring-boot-performance - spring-boot-properties - spring-boot-properties-2 - spring-boot-properties-3 - spring-boot-properties-migrator-demo spring-boot-property-exp spring-boot-request-params spring-boot-runtime @@ -94,6 +90,10 @@ spring-boot-3-observation spring-boot-3-test-pitfalls spring-boot-resilience4j + spring-boot-properties + spring-boot-properties-2 + spring-boot-properties-3 + spring-boot-properties-migrator-demo diff --git a/spring-boot-modules/spring-boot-3-native/pom.xml b/spring-boot-modules/spring-boot-3-native/pom.xml index 5382b8413c..1e93c3d8ed 100644 --- a/spring-boot-modules/spring-boot-3-native/pom.xml +++ b/spring-boot-modules/spring-boot-3-native/pom.xml @@ -56,10 +56,15 @@ -agentlib:native-image-agent=config-output-dir=target/native-image - - true - + + + process-aot + + process-aot + + + --> diff --git a/spring-boot-modules/spring-boot-3-url-matching/README.md b/spring-boot-modules/spring-boot-3-url-matching/README.md index 8b13789179..577849c0e1 100644 --- a/spring-boot-modules/spring-boot-3-url-matching/README.md +++ b/spring-boot-modules/spring-boot-3-url-matching/README.md @@ -1 +1,2 @@ - +## Relevant Articles +- [URL Matching in Spring Boot 3](https://www.baeldung.com/spring-boot-3-url-matching) diff --git a/spring-boot-modules/spring-boot-3/pom.xml b/spring-boot-modules/spring-boot-3/pom.xml index 03740e805f..8fe995ca91 100644 --- a/spring-boot-modules/spring-boot-3/pom.xml +++ b/spring-boot-modules/spring-boot-3/pom.xml @@ -116,6 +116,7 @@ org.springframework.boot spring-boot-maven-plugin + com.baeldung.virtualthreads.VirtualThreadsApp org.projectlombok @@ -131,15 +132,23 @@ org.springframework.boot spring-boot-maven-plugin + + org.apache.maven.plugins + maven-compiler-plugin + + --enable-preview + + + 19 1.5.2.Final 2.0.0 3.0.0-M7 com.baeldung.sample.TodoApplication - 5.14.0 + 5.14.0 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/VirtualThreadsApp.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/VirtualThreadsApp.java new file mode 100644 index 0000000000..159fa1c243 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/VirtualThreadsApp.java @@ -0,0 +1,13 @@ +package com.baeldung.virtualthreads; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class VirtualThreadsApp { + + public static void main(String[] args) { + SpringApplication.run(VirtualThreadsApp.class, args); + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/config/ThreadConfig.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/config/ThreadConfig.java new file mode 100644 index 0000000000..7231ec0b94 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/config/ThreadConfig.java @@ -0,0 +1,33 @@ +package com.baeldung.virtualthreads.config; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.web.embedded.tomcat.TomcatProtocolHandlerCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.AsyncTaskExecutor; +import org.springframework.core.task.support.TaskExecutorAdapter; +import org.springframework.scheduling.annotation.EnableAsync; + +import java.util.concurrent.Executors; + +@EnableAsync +@Configuration +@ConditionalOnProperty( + value = "spring.thread-executor", + havingValue = "virtual" +) +public class ThreadConfig { + + @Bean + public AsyncTaskExecutor applicationTaskExecutor() { + return new TaskExecutorAdapter(Executors.newVirtualThreadPerTaskExecutor()); + } + + @Bean + public TomcatProtocolHandlerCustomizer protocolHandlerVirtualThreadExecutorCustomizer() { + return protocolHandler -> { + protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor()); + }; + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/controller/LoadTestController.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/controller/LoadTestController.java new file mode 100644 index 0000000000..d99d3824a0 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/controller/LoadTestController.java @@ -0,0 +1,23 @@ +package com.baeldung.virtualthreads.controller; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; + +@RestController +@RequestMapping("/load") +public class LoadTestController { + + private static final Logger LOG = LoggerFactory.getLogger(LoadTestController.class); + + @GetMapping + public void doSomething() throws InterruptedException { + LOG.info("hey, I'm doing something"); + Thread.sleep(1000); + } + +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/controller/ThreadController.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/controller/ThreadController.java new file mode 100644 index 0000000000..73b28ce9f0 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/controller/ThreadController.java @@ -0,0 +1,16 @@ +package com.baeldung.virtualthreads.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/thread") +public class ThreadController { + + @GetMapping("/name") + public String getThreadName() { + return Thread.currentThread().toString(); + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/application.yml b/spring-boot-modules/spring-boot-3/src/main/resources/application.yml index 9a966a5bbd..5f9031bc9e 100644 --- a/spring-boot-modules/spring-boot-3/src/main/resources/application.yml +++ b/spring-boot-modules/spring-boot-3/src/main/resources/application.yml @@ -14,8 +14,10 @@ spring: properties: hibernate: dialect: org.hibernate.dialect.H2Dialect + thread-executor: standard + # Custom Properties cors: allow: origins: ${CORS_ALLOWED_ORIGINS:*} - credentials: ${CORS_ALLOW_CREDENTIALS:false} + credentials: ${CORS_ALLOW_CREDENTIALS:false} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/test/HTTP Load Request .jmx b/spring-boot-modules/spring-boot-3/src/test/HTTP Load Request .jmx new file mode 100644 index 0000000000..bbd02cecbe --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/test/HTTP Load Request .jmx @@ -0,0 +1,125 @@ + + + + + + false + true + false + + + + + + + + stoptest + + false + -1 + + 1000 + 10 + true + 100 + + true + + + + + + + localhost + 8080 + + + /load + GET + true + false + true + false + + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + + diff --git a/spring-boot-modules/spring-boot-data-3/README.md b/spring-boot-modules/spring-boot-data-3/README.md index 3959894853..7130d25118 100644 --- a/spring-boot-modules/spring-boot-data-3/README.md +++ b/spring-boot-modules/spring-boot-data-3/README.md @@ -1,2 +1,4 @@ ### Relevant Articles: - [Spring Data JPA – Run an App Without a Database](https://www.baeldung.com/spring-data-jpa-run-app-without-db) +- [Integrate AWS Secrets Manager in Spring Boot](https://www.baeldung.com/spring-boot-integrate-aws-secrets-manager) +- [Fix Spring Data JPA Exception: No Property Found for Type](https://www.baeldung.com/spring-data-jpa-exception-no-property-found-for-type) diff --git a/spring-boot-modules/spring-boot-data-3/pom.xml b/spring-boot-modules/spring-boot-data-3/pom.xml index cf53c25697..4903d2ea26 100644 --- a/spring-boot-modules/spring-boot-data-3/pom.xml +++ b/spring-boot-modules/spring-boot-data-3/pom.xml @@ -25,15 +25,29 @@ spring-boot-starter-data-jpa - com.mysql - mysql-connector-j + com.amazonaws.secretsmanager + aws-secretsmanager-jdbc + ${aws.secrets.manager.jdbc} + + + mysql + mysql-connector-java runtime + + com.h2database + h2 + org.springframework.boot spring-boot-starter-test test + + io.awspring.cloud + spring-cloud-starter-aws-secrets-manager-config + ${aws.secrets.manager.config} + @@ -45,4 +59,9 @@ + + 2.4.4 + 1.0.11 + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/NoPropertyFoundApplication.java b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/NoPropertyFoundApplication.java new file mode 100644 index 0000000000..276df9535b --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/NoPropertyFoundApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.nopropertyfound; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class NoPropertyFoundApplication { + + public static void main(String[] args) { + SpringApplication.run(NoPropertyFoundApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/config/DbConfig.java b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/config/DbConfig.java new file mode 100644 index 0000000000..9a589e55a3 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/config/DbConfig.java @@ -0,0 +1,20 @@ +package com.baeldung.nopropertyfound.config; + +import javax.sql.DataSource; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class DbConfig { + + @Bean + @ConfigurationProperties(prefix = "h2.datasource") + public DataSource dataSource() { + return DataSourceBuilder.create() + .build(); + } + +} diff --git a/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/model/Person.java b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/model/Person.java new file mode 100644 index 0000000000..3392d3ec67 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/model/Person.java @@ -0,0 +1,41 @@ +package com.baeldung.nopropertyfound.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Person { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + private String firstName; + private String lastName; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + +} diff --git a/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/repository/PersonRepository.java b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/repository/PersonRepository.java new file mode 100644 index 0000000000..900c391c93 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/repository/PersonRepository.java @@ -0,0 +1,15 @@ +package com.baeldung.nopropertyfound.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.baeldung.nopropertyfound.model.Person; + +@Repository +public interface PersonRepository extends JpaRepository { + + // findByFirsttName will cause Spring Data to throw PropertyReferenceException + // Person findByFirsttName(String firstName); + Person findByFirstName(String firstName); + +} diff --git a/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/StartWithAWSSecretsManagerApplication.java b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/StartWithAWSSecretsManagerApplication.java new file mode 100644 index 0000000000..0bcbef7729 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/StartWithAWSSecretsManagerApplication.java @@ -0,0 +1,29 @@ +package com.baeldung.startdbwithawssecretsmanager; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Profile; + +import javax.annotation.PostConstruct; + +@SpringBootApplication +@Profile("aws") +public class StartWithAWSSecretsManagerApplication { + @Value("${api-key1}") + private String apiKeyValue1; + + @Value("${api-key2}") + private String apiKeyValue2; + + @PostConstruct + private void postConstruct() { + System.out.println(apiKeyValue1); + System.out.println(apiKeyValue2); + } + + public static void main(String[] args) { + SpringApplication.run(StartWithAWSSecretsManagerApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/controller/UserController.java b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/controller/UserController.java new file mode 100644 index 0000000000..08745db3f0 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/controller/UserController.java @@ -0,0 +1,38 @@ +package com.baeldung.startdbwithawssecretsmanager.controller; + +import com.baeldung.startdbwithawssecretsmanager.model.UserEntity; +import com.baeldung.startdbwithawssecretsmanager.repository.UserRepository; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("users") +public class UserController { + + private final UserRepository userRepository; + + public UserController(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @GetMapping(value = "/{id}", produces = "application/json") + public @ResponseBody UserEntity getUser(@PathVariable Long id) { + return userRepository.findById(id).get(); + } + + @PostMapping + public UserEntity createUser(@RequestBody UserEntity userEntity) { + return userRepository.save(userEntity); + } + + @DeleteMapping(value = "/{id}") + public void removeUser(@PathVariable Long id) { + userRepository.deleteById(id); + } +} diff --git a/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/model/UserEntity.java b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/model/UserEntity.java new file mode 100644 index 0000000000..285e7094dd --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/model/UserEntity.java @@ -0,0 +1,40 @@ +package com.baeldung.startdbwithawssecretsmanager.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class UserEntity { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String name; + + public UserEntity() { + } + + public UserEntity(Long id, String name) { + this.id = id; + this.name = name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/repository/UserRepository.java b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/repository/UserRepository.java new file mode 100644 index 0000000000..e2abfe88e6 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/repository/UserRepository.java @@ -0,0 +1,10 @@ +package com.baeldung.startdbwithawssecretsmanager.repository; + +import com.baeldung.startdbwithawssecretsmanager.model.UserEntity; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface UserRepository + extends CrudRepository { +} diff --git a/spring-boot-modules/spring-boot-data-3/src/main/resources/application-aws.properties b/spring-boot-modules/spring-boot-data-3/src/main/resources/application-aws.properties new file mode 100644 index 0000000000..07c4b0a4d6 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/resources/application-aws.properties @@ -0,0 +1,9 @@ +spring.datasource.driver-class-name=com.amazonaws.secretsmanager.sql.AWSSecretsManagerMySQLDriver +spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect +spring.datasource.url=jdbc-secretsmanager:mysql://database-1.cwhqvgjbpgfw.eu-central-1.rds.amazonaws.com:3306/test +spring.datasource.username=rds/credentials + +#Overwriting application.properties configuration back to default. +spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=true + +spring.config.import=aws-secretsmanager:test/secret/ diff --git a/spring-boot-modules/spring-boot-data-3/src/main/resources/application.properties b/spring-boot-modules/spring-boot-data-3/src/main/resources/application.properties index cbe044134f..71f39e0ee3 100644 --- a/spring-boot-modules/spring-boot-data-3/src/main/resources/application.properties +++ b/spring-boot-modules/spring-boot-data-3/src/main/resources/application.properties @@ -4,4 +4,9 @@ spring.datasource.username=root spring.datasource.password=root spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect spring.jpa.hibernate.ddl-auto=none -spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false \ No newline at end of file +spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false + +h2.datasource.url=jdbc:h2:mem:testdb +h2.datasource.driver-class-name=org.h2.Driver +h2.datasource.username=sa +h2.datasource.password= diff --git a/spring-boot-modules/spring-boot-data-3/src/main/resources/data.sql b/spring-boot-modules/spring-boot-data-3/src/main/resources/data.sql new file mode 100644 index 0000000000..5623bbfadf --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/resources/data.sql @@ -0,0 +1,3 @@ +INSERT INTO person (first_name, last_name) VALUES('Azhrioun', 'Abderrahim'); +INSERT INTO person (first_name, last_name) VALUES('Brian', 'Wheeler'); +INSERT INTO person (first_name, last_name) VALUES('Dave', 'Anderson'); \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-data-3/src/main/resources/schema.sql b/spring-boot-modules/spring-boot-data-3/src/main/resources/schema.sql new file mode 100644 index 0000000000..738ef25298 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/resources/schema.sql @@ -0,0 +1,6 @@ +DROP TABLE IF EXISTS person; +CREATE TABLE person( + id INT AUTO_INCREMENT PRIMARY KEY, + first_name VARCHAR(200), + last_name VARCHAR(200) +) \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-data-3/src/test/java/com/baeldung/nopropertyfound/PersonRepositoryIntegrationTest.java b/spring-boot-modules/spring-boot-data-3/src/test/java/com/baeldung/nopropertyfound/PersonRepositoryIntegrationTest.java new file mode 100644 index 0000000000..2a9d1a46f2 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/test/java/com/baeldung/nopropertyfound/PersonRepositoryIntegrationTest.java @@ -0,0 +1,28 @@ +package com.baeldung.nopropertyfound; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import com.baeldung.nopropertyfound.model.Person; +import com.baeldung.nopropertyfound.repository.PersonRepository; + +@DataJpaTest +class PersonRepositoryIntegrationTest { + + @Autowired + private PersonRepository personRepository; + + @Test + void givenQueryMethod_whenUsingValidProperty_thenCorrect() { + + Person person = personRepository.findByFirstName("Azhrioun"); + + assertNotNull(person); + assertEquals("Abderrahim", person.getLastName()); + } + +} diff --git a/spring-boot-modules/spring-boot-libraries-2/pom.xml b/spring-boot-modules/spring-boot-libraries-2/pom.xml index 4409db0672..6d9401f4bc 100644 --- a/spring-boot-modules/spring-boot-libraries-2/pom.xml +++ b/spring-boot-modules/spring-boot-libraries-2/pom.xml @@ -11,6 +11,18 @@ 1.0.0-SNAPSHOT + + + + org.springframework.experimental + spring-modulith-bom + 0.5.1 + import + pom + + + + org.springframework.boot @@ -87,6 +99,15 @@ 2.34.0 test + + org.springframework.experimental + spring-modulith-api + + + org.springframework.experimental + spring-modulith-starter-test + test + diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/modulith/Application.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/modulith/Application.java new file mode 100644 index 0000000000..a8c3e48661 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/modulith/Application.java @@ -0,0 +1,21 @@ +package com.baeldung.modulith; + +import com.baeldung.modulith.product.ProductService; +import com.baeldung.modulith.product.internal.Product; +import org.jobrunr.autoconfigure.JobRunrAutoConfiguration; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableAsync; + +@EnableAsync +@SpringBootApplication +@EnableAutoConfiguration(exclude = { JobRunrAutoConfiguration.class}) +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args) + .getBean(ProductService.class) + .create(new Product("baeldung", "course", 10)); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/modulith/notification/NotificationDTO.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/modulith/notification/NotificationDTO.java new file mode 100644 index 0000000000..a8fb346daa --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/modulith/notification/NotificationDTO.java @@ -0,0 +1,39 @@ +package com.baeldung.modulith.notification; + +import java.util.Date; + +public class NotificationDTO { + private Date date; + private String format; + private String productName; + + public NotificationDTO(Date date, String format, String productName) { + this.date = date; + this.format = format; + this.productName = productName; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/modulith/notification/NotificationService.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/modulith/notification/NotificationService.java new file mode 100644 index 0000000000..7789798bbe --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/modulith/notification/NotificationService.java @@ -0,0 +1,42 @@ +package com.baeldung.modulith.notification; + +import com.baeldung.modulith.notification.internal.Notification; +import com.baeldung.modulith.notification.internal.NotificationType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.modulith.ApplicationModuleListener; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +@Service +public class NotificationService { + + private static final Logger LOG = LoggerFactory.getLogger(NotificationService.class); + + public void createNotification(NotificationDTO notificationDTO) { + Notification notification = toEntity(notificationDTO); + LOG.info("Received notification by module dependency for product {} in date {} by {}.", notification.getProductName() + , notification.getDate(), notification.getFormat()); + } + + @Async + @ApplicationModuleListener + public void notificationEvent(NotificationDTO event) { + Notification notification = toEntity(event); + LOG.info("Received notification by event for product {} in date {} by {}.", notification.getProductName() + , notification.getDate(), notification.getFormat()); + } + + private Notification toEntity(NotificationDTO notificationDTO) { + Notification notification = new Notification(); + notification.setDate(notificationDTO.getDate()); + if (notificationDTO.getFormat().equals("SMS")) { + notification.setFormat(NotificationType.SMS); + } + if (notificationDTO.getFormat().equals("EMAIL")) { + notification.setFormat(NotificationType.EMAIL); + } + notification.setProductName(notificationDTO.getProductName()); + return notification; + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/modulith/notification/internal/Notification.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/modulith/notification/internal/Notification.java new file mode 100644 index 0000000000..0b1ce85d26 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/modulith/notification/internal/Notification.java @@ -0,0 +1,37 @@ +package com.baeldung.modulith.notification.internal; + +import java.util.Date; + +public class Notification { + private Date date; + private NotificationType format; + private String productName; + + public Notification() { + + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public NotificationType getFormat() { + return format; + } + + public void setFormat(NotificationType format) { + this.format = format; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/modulith/notification/internal/NotificationType.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/modulith/notification/internal/NotificationType.java new file mode 100644 index 0000000000..45870e52b9 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/modulith/notification/internal/NotificationType.java @@ -0,0 +1,5 @@ +package com.baeldung.modulith.notification.internal; + +public enum NotificationType { + EMAIL, SMS +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/modulith/product/ProductService.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/modulith/product/ProductService.java new file mode 100644 index 0000000000..46d87fc539 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/modulith/product/ProductService.java @@ -0,0 +1,26 @@ +package com.baeldung.modulith.product; + +import com.baeldung.modulith.notification.NotificationDTO; +import com.baeldung.modulith.notification.NotificationService; +import com.baeldung.modulith.product.internal.Product; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +public class ProductService { + + private final ApplicationEventPublisher events; + private final NotificationService notificationService; + + public ProductService(ApplicationEventPublisher events, NotificationService notificationService) { + this.events = events; + this.notificationService = notificationService; + } + + public void create(Product product) { + notificationService.createNotification(new NotificationDTO(new Date(), "SMS", product.getName())); + events.publishEvent(new NotificationDTO(new Date(), "SMS", product.getName())); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/modulith/product/internal/Product.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/modulith/product/internal/Product.java new file mode 100644 index 0000000000..d989906b63 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/modulith/product/internal/Product.java @@ -0,0 +1,38 @@ +package com.baeldung.modulith.product.internal; + +public class Product { + + private String name; + private String description; + private int price; + + public Product(String name, String description, int price) { + this.name = name; + this.description = description; + this.price = price; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public int getPrice() { + return price; + } + + public void setPrice(int price) { + this.price = price; + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/config/OpenAIRestTemplateConfig.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/config/OpenAIRestTemplateConfig.java new file mode 100644 index 0000000000..b832ee4264 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/config/OpenAIRestTemplateConfig.java @@ -0,0 +1,25 @@ +package com.baeldung.openapi.config; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class OpenAIRestTemplateConfig { + + @Value("${openai.api.key}") + private String openaiApiKey; + + @Bean + @Qualifier("openaiRestTemplate") + public RestTemplate openaiRestTemplate() { + RestTemplate restTemplate = new RestTemplate(); + restTemplate.getInterceptors().add((request, body, execution) -> { + request.getHeaders().add("Authorization", "Bearer " + openaiApiKey); + return execution.execute(request, body); + }); + return restTemplate; + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/controller/ChatController.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/controller/ChatController.java new file mode 100644 index 0000000000..129d233582 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/controller/ChatController.java @@ -0,0 +1,48 @@ +package com.baeldung.openapi.controller; + +import com.baeldung.openapi.dto.ChatRequest; +import com.baeldung.openapi.dto.ChatResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +@RestController +public class ChatController { + + @Qualifier("openaiRestTemplate") + @Autowired + private RestTemplate restTemplate; + + @Value("${openai.model}") + private String model; + + @Value("${openai.api.url}") + private String apiUrl; + + /** + * Creates a chat request and sends it to the OpenAI API + * Returns the first message from the API response + * + * @param prompt the prompt to send to the API + * @return first message from the API response + */ + @GetMapping("/chat") + public String chat(@RequestParam String prompt) { + ChatRequest request = new ChatRequest(model, prompt); + + ChatResponse response = restTemplate.postForObject( + apiUrl, + request, + ChatResponse.class); + + if (response == null || response.getChoices() == null || response.getChoices().isEmpty()) { + return "No response"; + } + + return response.getChoices().get(0).getMessage().getContent(); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/dto/ChatRequest.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/dto/ChatRequest.java new file mode 100644 index 0000000000..1e32b937ce --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/dto/ChatRequest.java @@ -0,0 +1,32 @@ +package com.baeldung.openapi.dto; + +import java.util.ArrayList; +import java.util.List; + +public class ChatRequest { + private String model; + private List messages; + + public ChatRequest(String model, String prompt) { + this.model = model; + + this.messages = new ArrayList<>(); + this.messages.add(new Message("user", prompt)); + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public List getMessages() { + return messages; + } + + public void setMessages(List messages) { + this.messages = messages; + } +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/dto/ChatResponse.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/dto/ChatResponse.java new file mode 100644 index 0000000000..937e2d87db --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/dto/ChatResponse.java @@ -0,0 +1,38 @@ +package com.baeldung.openapi.dto; + +import java.util.List; + +public class ChatResponse { + + private List choices; + + public static class Choice { + + private int index; + private Message message; + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public Message getMessage() { + return message; + } + + public void setMessage(Message message) { + this.message = message; + } + } + + public List getChoices() { + return choices; + } + + public void setChoices(List choices) { + this.choices = choices; + } +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/dto/Message.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/dto/Message.java new file mode 100644 index 0000000000..242cf4e89f --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/dto/Message.java @@ -0,0 +1,31 @@ +package com.baeldung.openapi.dto; + +public class Message { + + private String role; + private String content; + + Message(String role, String content) { + this.role = role; + this.content = content; + } + + Message() { + } + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/resources/application.properties b/spring-boot-modules/spring-boot-libraries-2/src/main/resources/application.properties index a18eda349a..47b2973fca 100644 --- a/spring-boot-modules/spring-boot-libraries-2/src/main/resources/application.properties +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/resources/application.properties @@ -47,4 +47,8 @@ resilience4j.ratelimiter.instances.rateLimiterApi.limit-refresh-period=60s resilience4j.ratelimiter.instances.rateLimiterApi.timeout-duration=0s resilience4j.ratelimiter.instances.rateLimiterApi.allow-health-indicator-to-fail=true resilience4j.ratelimiter.instances.rateLimiterApi.subscribe-for-events=true -resilience4j.ratelimiter.instances.rateLimiterApi.event-consumer-buffer-size=50 \ No newline at end of file +resilience4j.ratelimiter.instances.rateLimiterApi.event-consumer-buffer-size=50 + +openai.model=gpt-3.5-turbo +openai.api.url=https://api.openai.com/v1/chat/completions +openai.api.key=your-api-key \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/modulith/ApplicationModularityUnitTest.java b/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/modulith/ApplicationModularityUnitTest.java new file mode 100644 index 0000000000..40d644b1e0 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/modulith/ApplicationModularityUnitTest.java @@ -0,0 +1,27 @@ +package com.baeldung.modulith; + +import org.junit.jupiter.api.Test; +import org.springframework.modulith.core.ApplicationModules; +import org.springframework.modulith.docs.Documenter; + +class ApplicationModularityUnitTest { + + ApplicationModules modules = ApplicationModules.of(Application.class); + + @Test + void verifiesModularStructure() { + modules.verify(); + } + + @Test + void createModuleDocumentation() { + new Documenter(modules) + .writeDocumentation() + .writeIndividualModulesAsPlantUml(); + } + + @Test + void createApplicationModuleModel() { + modules.forEach(System.out::println); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/controller/AuthorsController.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/controller/AuthorsController.java new file mode 100644 index 0000000000..019bd5ad9d --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/controller/AuthorsController.java @@ -0,0 +1,34 @@ +package com.baeldung.springboot.swagger.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.springboot.swagger.model.Author; +import com.baeldung.springboot.swagger.service.AuthorService; +import com.baeldung.springboot.swagger.views.Views; +import com.fasterxml.jackson.annotation.JsonView; + +@RestController +@RequestMapping("/authors") +public class AuthorsController { + + @Autowired + AuthorService authorService; + + @JsonView(Views.Public.class) + @GetMapping + public List getAllAuthors() { + return authorService.getAllAuthors(); + } + + @PostMapping + public void addAuthor(@RequestBody @JsonView(Views.Public.class) Author author){ + authorService.addAuthors(author); + } +} diff --git a/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/model/Author.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/model/Author.java new file mode 100644 index 0000000000..2e30998059 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/model/Author.java @@ -0,0 +1,28 @@ +package com.baeldung.springboot.swagger.model; + +import com.baeldung.springboot.swagger.views.Views; +import com.fasterxml.jackson.annotation.JsonView; + +public class Author { + + @JsonView(Views.Private.class) + private Integer id; + + @JsonView(Views.Public.class) + private String name; + + @JsonView(Views.Public.class) + private String email; + + public Author() { + } + + public Author(String name, String email) { + this.name = name; + this.email = email; + } + + public void setId(Integer id) { + this.id = id; + } +} diff --git a/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/service/AuthorService.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/service/AuthorService.java new file mode 100644 index 0000000000..bf1f637889 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/service/AuthorService.java @@ -0,0 +1,23 @@ +package com.baeldung.springboot.swagger.service; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.baeldung.springboot.swagger.model.Author; + +@Service +public class AuthorService { + private List authors = new ArrayList<>(); + + public List getAllAuthors(){ + return authors; + } + + public void addAuthors(Author author){ + author.setId(authors.size()+1); + authors.add(author); + } + +} diff --git a/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/views/Views.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/views/Views.java new file mode 100644 index 0000000000..df638a5647 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/views/Views.java @@ -0,0 +1,9 @@ +package com.baeldung.springboot.swagger.views; + +public class Views { + public static class Public { + } + + public static class Private { + } +} diff --git a/spring-boot-modules/spring-boot-properties-2/pom.xml b/spring-boot-modules/spring-boot-properties-2/pom.xml index 442cb24c7a..4b1daca34d 100644 --- a/spring-boot-modules/spring-boot-properties-2/pom.xml +++ b/spring-boot-modules/spring-boot-properties-2/pom.xml @@ -10,9 +10,10 @@ Spring Boot Properties Module - com.baeldung.spring-boot-modules - spring-boot-modules - 1.0.0-SNAPSHOT + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 @@ -24,6 +25,15 @@ org.springframework.boot spring-boot-starter-web + + commons-lang + commons-lang + 2.6 + + + com.baeldung.properties.yaml.YamlApplication + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/ValuesApp.java b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/ValuesApp.java index 67547199a6..282ce4658e 100644 --- a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/ValuesApp.java +++ b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/ValuesApp.java @@ -7,11 +7,12 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; -import javax.annotation.PostConstruct; import java.util.Arrays; import java.util.List; import java.util.Map; +import jakarta.annotation.PostConstruct; + @Configuration @PropertySource(name = "myProperties", value = "values.properties") public class ValuesApp { diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/defaults/ValuesWithDefaultsApp.java b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/defaults/ValuesWithDefaultsApp.java index 2a2b535be7..f1720d2fb3 100644 --- a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/defaults/ValuesWithDefaultsApp.java +++ b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/defaults/ValuesWithDefaultsApp.java @@ -1,6 +1,6 @@ package com.baeldung.properties.value.defaults; -import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang.ArrayUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; @@ -8,10 +8,11 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.util.Assert; -import javax.annotation.PostConstruct; import java.util.Arrays; import java.util.List; +import jakarta.annotation.PostConstruct; + /** * Demonstrates setting defaults for @Value annotation. Note that there are no properties * defined in the specified property source. We also assume that the user here @@ -60,10 +61,10 @@ public class ValuesWithDefaultsApp { // arrays List stringListValues = Arrays.asList("one", "two", "three"); - Assert.isTrue(Arrays.asList(stringArrayWithDefaults).containsAll(stringListValues), "unexpected value for stringArrayWithDefaults"); + Assert.isTrue(Arrays.asList(stringArrayWithDefaults).containsAll(stringListValues), "unexpected value for stringArrayWithDefaults"); List intListValues = Arrays.asList(1, 2, 3); - Assert.isTrue(Arrays.asList(ArrayUtils.toObject(intArrayWithDefaults)).containsAll(intListValues), "unexpected value for intArrayWithDefaults"); + Assert.isTrue(Arrays.asList(ArrayUtils.toObject(intArrayWithDefaults)).containsAll(intListValues), "unexpected value for intArrayWithDefaults"); // SpEL Assert.isTrue(spelWithDefaultValue.equals("my default system property value"), "unexpected value for spelWithDefaultValue"); diff --git a/spring-boot-modules/spring-boot-properties-3/README.md b/spring-boot-modules/spring-boot-properties-3/README.md index 37b63abb84..4bc4a2325f 100644 --- a/spring-boot-modules/spring-boot-properties-3/README.md +++ b/spring-boot-modules/spring-boot-properties-3/README.md @@ -11,4 +11,5 @@ - [IntelliJ – Cannot Resolve Spring Boot Configuration Properties Error](https://www.baeldung.com/intellij-resolve-spring-boot-configuration-properties) - [Log Properties in a Spring Boot Application](https://www.baeldung.com/spring-boot-log-properties) - [Using Environment Variables in Spring Boot’s application.properties](https://www.baeldung.com/spring-boot-properties-env-variables) +- [Loading Multiple YAML Configuration Files in Spring Boot](https://www.baeldung.com/spring-boot-load-multiple-yaml-configuration-files) - More articles: [[<-- prev]](../spring-boot-properties-2) diff --git a/spring-boot-modules/spring-boot-properties-3/pom.xml b/spring-boot-modules/spring-boot-properties-3/pom.xml index 3de85c7175..ed6e08add0 100644 --- a/spring-boot-modules/spring-boot-properties-3/pom.xml +++ b/spring-boot-modules/spring-boot-properties-3/pom.xml @@ -9,9 +9,10 @@ Spring Boot Properties Module - com.baeldung.spring-boot-modules - spring-boot-modules - 1.0.0-SNAPSHOT + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 @@ -31,7 +32,6 @@ org.springframework.boot spring-boot-starter-web - RELEASE @@ -44,4 +44,8 @@ + + com.baeldung.boot.properties.DemoApplication + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/log/EnvironmentPropertiesPrinter.java b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/log/EnvironmentPropertiesPrinter.java index 321593b31b..26f6867296 100644 --- a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/log/EnvironmentPropertiesPrinter.java +++ b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/log/EnvironmentPropertiesPrinter.java @@ -5,7 +5,7 @@ import org.slf4j.LoggerFactory; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; @Component public class EnvironmentPropertiesPrinter { diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/multipleyaml/MultipleYamlApplication.java b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/multipleyaml/MultipleYamlApplication.java new file mode 100644 index 0000000000..9dc754b24b --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/multipleyaml/MultipleYamlApplication.java @@ -0,0 +1,27 @@ +package com.baeldung.properties.multipleyaml; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class MultipleYamlApplication implements CommandLineRunner { + + @Autowired + private MultipleYamlConfiguration config; + + public static void main(String[] args) { + SpringApplication springApp = new SpringApplication(MultipleYamlApplication.class); + + // Code from first example, uncomment to use multiple profiles + // springApp.setAdditionalProfiles("students", "teachers"); + + springApp.run(args); + } + + public void run(String... args) throws Exception { + System.out.println("Students: " + config.getStudents()); + System.out.println("Teachers: " + config.getTeachers()); + } +} diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/multipleyaml/MultipleYamlConfiguration.java b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/multipleyaml/MultipleYamlConfiguration.java new file mode 100644 index 0000000000..c46a321e24 --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/multipleyaml/MultipleYamlConfiguration.java @@ -0,0 +1,35 @@ +package com.baeldung.properties.multipleyaml; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.context.annotation.PropertySources; + +import java.util.List; + +@Configuration +@ConfigurationProperties +@PropertySources({ + @PropertySource(value = "classpath:application-teachers.yml", factory = MultipleYamlPropertySourceFactory.class), + @PropertySource(value = "classpath:application-students.yml", factory = MultipleYamlPropertySourceFactory.class)}) +public class MultipleYamlConfiguration { + + List teachers; + List students; + + public void setTeachers(List teachers) { + this.teachers = teachers; + } + + public void setStudents(List students) { + this.students = students; + } + + public List getTeachers() { + return teachers; + } + + public List getStudents() { + return students; + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/multipleyaml/MultipleYamlPropertySourceFactory.java b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/multipleyaml/MultipleYamlPropertySourceFactory.java new file mode 100644 index 0000000000..c09bd3c8b9 --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/multipleyaml/MultipleYamlPropertySourceFactory.java @@ -0,0 +1,23 @@ +package com.baeldung.properties.multipleyaml; + +import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; +import org.springframework.core.env.PropertiesPropertySource; +import org.springframework.core.env.PropertySource; +import org.springframework.core.io.support.EncodedResource; +import org.springframework.core.io.support.PropertySourceFactory; + +import java.io.IOException; +import java.util.Properties; + +public class MultipleYamlPropertySourceFactory implements PropertySourceFactory { + + @Override + public PropertySource createPropertySource(String name, EncodedResource encodedResource) throws IOException { + YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); + factory.setResources(encodedResource.getResource()); + + Properties properties = factory.getObject(); + + return new PropertiesPropertySource(encodedResource.getResource().getFilename(), properties); + } +} diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/resources/application-students.yml b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application-students.yml new file mode 100644 index 0000000000..f4aaf8ae4d --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application-students.yml @@ -0,0 +1,3 @@ +students: + - Jane + - Michael \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/resources/application-teachers.yml b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application-teachers.yml new file mode 100644 index 0000000000..f0d2080164 --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application-teachers.yml @@ -0,0 +1,3 @@ +teachers: + - Margo + - Javier \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.yml b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.yml index 2e28da5ad3..2c44065028 100644 --- a/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.yml +++ b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.yml @@ -2,6 +2,10 @@ bael: root-level-property: defaultRootLevelValue spring: profiles: +# Multiple profiles for MultipleYamlApplication first example +# include: +# - teachers +# - students group: multidocument-integration: multidocument-integration-extension --- diff --git a/spring-boot-modules/spring-boot-properties-migrator-demo/pom.xml b/spring-boot-modules/spring-boot-properties-migrator-demo/pom.xml index 95dc06b155..21ed0f59f4 100644 --- a/spring-boot-modules/spring-boot-properties-migrator-demo/pom.xml +++ b/spring-boot-modules/spring-boot-properties-migrator-demo/pom.xml @@ -7,10 +7,10 @@ 1.0-SNAPSHOT - com.baeldung.spring-boot-modules - spring-boot-modules - 1.0.0-SNAPSHOT - ../pom.xml + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 @@ -49,8 +49,8 @@ - 8 - 8 + 17 + 17 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-properties/pom.xml b/spring-boot-modules/spring-boot-properties/pom.xml index 378864a1df..4ad5aeed1d 100644 --- a/spring-boot-modules/spring-boot-properties/pom.xml +++ b/spring-boot-modules/spring-boot-properties/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-boot-properties 0.0.1-SNAPSHOT @@ -10,9 +10,10 @@ Spring Boot Properties Module - com.baeldung.spring-boot-modules - spring-boot-modules - 1.0.0-SNAPSHOT + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 @@ -74,6 +75,25 @@ + + org.springframework.boot + spring-boot-maven-plugin + + + build-info + + build-info + + + + ${java.version} + ${project.description} + 123 + + + + + org.apache.maven.plugins maven-resources-plugin @@ -122,7 +142,7 @@ - 2021.0.3 + 2022.0.1 1.10 @ diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/ConfigProperties.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/ConfigProperties.java index 47df784885..faf5678398 100644 --- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/ConfigProperties.java +++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/ConfigProperties.java @@ -3,10 +3,10 @@ package com.baeldung.configurationproperties; import java.util.List; import java.util.Map; -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Pattern; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; import org.hibernate.validator.constraints.Length; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/ImmutableCredentials.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/ImmutableCredentials.java index a58e4143e5..72c45afbb2 100644 --- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/ImmutableCredentials.java +++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/ImmutableCredentials.java @@ -1,10 +1,8 @@ package com.baeldung.configurationproperties; import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.context.properties.ConstructorBinding; @ConfigurationProperties(prefix = "mail.credentials") -@ConstructorBinding public class ImmutableCredentials { private final String authMethod; diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/buildproperties/BuildInfoServiceIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/buildproperties/BuildInfoServiceIntegrationTest.java index 2cb27e1844..9ed27f412c 100644 --- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/buildproperties/BuildInfoServiceIntegrationTest.java +++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/buildproperties/BuildInfoServiceIntegrationTest.java @@ -4,12 +4,9 @@ import static org.junit.Assert.assertThat; import org.hamcrest.Matchers; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; -@RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) class BuildInfoServiceIntegrationTest { diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/buildproperties/BuildPropertiesUnitTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/buildproperties/BuildPropertiesUnitTest.java new file mode 100644 index 0000000000..bb8ec78cc1 --- /dev/null +++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/buildproperties/BuildPropertiesUnitTest.java @@ -0,0 +1,30 @@ +package com.baeldung.buildproperties; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.info.BuildProperties; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +@SpringBootTest +@ExtendWith(SpringExtension.class) +public class BuildPropertiesUnitTest { + @Autowired + private BuildProperties buildProperties; + + @Test + void givenBuildPropertiesBean_WhenFetchDefaultBuildProperties_ThenGetValidValues() { + Assertions.assertEquals("spring-boot-properties", buildProperties.getArtifact()); + Assertions.assertEquals("com.baeldung", buildProperties.getGroup()); + Assertions.assertEquals("0.0.1-SNAPSHOT", buildProperties.getVersion()); + } + + @Test + void givenBuildPropertiesBean_WhenFetchCustomBuildProprties_ThenGetValidValues() { + Assertions.assertEquals("123", buildProperties.get("custom.value")); + Assertions.assertNotNull(buildProperties.get("java.version")); + Assertions.assertEquals("Spring Boot Properties Module", buildProperties.get("description")); + } +} diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/reloading/PropertiesReloadManualTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/reloading/PropertiesReloadManualTest.java index 88e22af4ba..ecb547a0a0 100644 --- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/reloading/PropertiesReloadManualTest.java +++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/reloading/PropertiesReloadManualTest.java @@ -1,28 +1,27 @@ package com.baeldung.properties.reloading; +import static org.junit.jupiter.api.Assertions.assertEquals; + import com.baeldung.properties.reloading.beans.ConfigurationPropertiesRefreshConfigBean; import com.baeldung.properties.reloading.beans.EnvironmentConfigBean; import com.baeldung.properties.reloading.beans.PropertiesConfigBean; import com.baeldung.properties.reloading.beans.ValueRefreshConfigBean; import java.io.FileOutputStream; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.mock.web.MockHttpServletResponse; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = SpringBootPropertiesTestApplication.class) public class PropertiesReloadManualTest { @@ -50,7 +49,7 @@ public class PropertiesReloadManualTest { ValueRefreshConfigBean singletonValueRefreshConfigBean; - @Before + @BeforeEach public void setUp() throws Exception { mvc = MockMvcBuilders .webAppContextSetup(webApplicationContext) @@ -61,7 +60,7 @@ public class PropertiesReloadManualTest { callRefresh(); } - @After + @AfterEach public void tearDown() throws Exception { createConfig("extra.properties", "application.theme.color", "blue"); createConfig("extra2.properties", "application.theme.background", "red"); @@ -69,76 +68,76 @@ public class PropertiesReloadManualTest { @Test public void givenEnvironmentReader_whenColorChanged_thenExpectChangeValue() throws Exception { - Assert.assertEquals("blue", environmentConfigBean.getColor()); + assertEquals("blue", environmentConfigBean.getColor()); createConfig("extra.properties", "application.theme.color", "red"); Thread.sleep(refreshDelay); - Assert.assertEquals("red", environmentConfigBean.getColor()); + assertEquals("red", environmentConfigBean.getColor()); } @Test public void givenEnvironmentReader_whenBackgroundChanged_thenExpectChangeValue() throws Exception { - Assert.assertEquals("red", environmentConfigBean.getBackgroundColor()); + assertEquals("red", environmentConfigBean.getBackgroundColor()); createConfig("extra2.properties", "application.theme.background", "blue"); Thread.sleep(refreshDelay); - Assert.assertEquals("blue", environmentConfigBean.getBackgroundColor()); + assertEquals("blue", environmentConfigBean.getBackgroundColor()); } @Test public void givenPropertiesReader_whenColorChanged_thenExpectChangeValue() throws Exception { - Assert.assertEquals("blue", propertiesConfigBean.getColor()); + assertEquals("blue", propertiesConfigBean.getColor()); createConfig("extra.properties", "application.theme.color", "red"); Thread.sleep(refreshDelay); - Assert.assertEquals("red", propertiesConfigBean.getColor()); + assertEquals("red", propertiesConfigBean.getColor()); } @Test public void givenRefreshScopedValueReader_whenColorChangedAndRefreshCalled_thenExpectChangeValue() throws Exception { - Assert.assertEquals("blue", valueRefreshConfigBean.getColor()); + assertEquals("blue", valueRefreshConfigBean.getColor()); createConfig("extra.properties", "application.theme.color", "red"); Thread.sleep(refreshDelay); - Assert.assertEquals("blue", valueRefreshConfigBean.getColor()); + assertEquals("blue", valueRefreshConfigBean.getColor()); callRefresh(); - Assert.assertEquals("red", valueRefreshConfigBean.getColor()); + assertEquals("red", valueRefreshConfigBean.getColor()); } @Test public void givenSingletonRefreshScopedValueReader_whenColorChangedAndRefreshCalled_thenExpectOldValue() throws Exception { - Assert.assertEquals("blue", singletonValueRefreshConfigBean.getColor()); + assertEquals("blue", singletonValueRefreshConfigBean.getColor()); createConfig("extra.properties", "application.theme.color", "red"); Thread.sleep(refreshDelay); - Assert.assertEquals("blue", singletonValueRefreshConfigBean.getColor()); + assertEquals("blue", singletonValueRefreshConfigBean.getColor()); callRefresh(); - Assert.assertEquals("blue", singletonValueRefreshConfigBean.getColor()); + assertEquals("blue", singletonValueRefreshConfigBean.getColor()); } @Test public void givenRefreshScopedConfigurationPropertiesReader_whenColorChangedAndRefreshCalled_thenExpectChangeValue() throws Exception { - Assert.assertEquals("blue", configurationPropertiesRefreshConfigBean.getColor()); + assertEquals("blue", configurationPropertiesRefreshConfigBean.getColor()); createConfig("extra.properties", "application.theme.color", "red"); Thread.sleep(refreshDelay); - Assert.assertEquals("blue", configurationPropertiesRefreshConfigBean.getColor()); + assertEquals("blue", configurationPropertiesRefreshConfigBean.getColor()); callRefresh(); - Assert.assertEquals("red", configurationPropertiesRefreshConfigBean.getColor()); + assertEquals("red", configurationPropertiesRefreshConfigBean.getColor()); } public void callRefresh() throws Exception { @@ -148,7 +147,7 @@ public class PropertiesReloadManualTest { .accept(MediaType.APPLICATION_JSON_VALUE)) .andReturn(); MockHttpServletResponse response = mvcResult.getResponse(); - Assert.assertEquals(response.getStatus(), 200); + assertEquals(200, response.getStatus()); } public void createConfig(String file, String key, String value) throws Exception { diff --git a/spring-boot-modules/spring-boot-redis/pom.xml b/spring-boot-modules/spring-boot-redis/pom.xml index 42aa1321d5..5b85ad00ca 100644 --- a/spring-boot-modules/spring-boot-redis/pom.xml +++ b/spring-boot-modules/spring-boot-redis/pom.xml @@ -2,20 +2,19 @@ 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 3.0.2 - - com.baelding spring-boot-redis 0.0.1-SNAPSHOT spring-boot-redis Demo project for Spring Boot with Spring Data Redis - - 15 - + + + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 + + org.springframework.boot @@ -38,6 +37,12 @@ it.ozimov embedded-redis + + + org.slf4j + slf4j-simple + + 0.7.3 test @@ -66,4 +71,8 @@ + + 15 + + diff --git a/spring-boot-modules/spring-boot-resilience4j/src/test/java/com/baeldung/resilience4j/eventendpoints/ResilientAppControllerIntegrationTest.java b/spring-boot-modules/spring-boot-resilience4j/src/test/java/com/baeldung/resilience4j/eventendpoints/ResilientAppControllerIntegrationTest.java index ae1b89764d..d1951218de 100644 --- a/spring-boot-modules/spring-boot-resilience4j/src/test/java/com/baeldung/resilience4j/eventendpoints/ResilientAppControllerIntegrationTest.java +++ b/spring-boot-modules/spring-boot-resilience4j/src/test/java/com/baeldung/resilience4j/eventendpoints/ResilientAppControllerIntegrationTest.java @@ -14,7 +14,6 @@ import com.github.tomakehurst.wiremock.core.WireMockConfiguration; import com.github.tomakehurst.wiremock.junit5.WireMockExtension; import java.net.URI; import java.nio.charset.Charset; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.*; @@ -22,6 +21,8 @@ import java.util.stream.IntStream; import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; @@ -32,6 +33,8 @@ import org.springframework.http.ResponseEntity; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) class ResilientAppControllerIntegrationTest { + private final Logger LOGGER = LoggerFactory.getLogger(getClass()); + @Autowired private TestRestTemplate restTemplate; @LocalServerPort private Integer port; @@ -206,26 +209,24 @@ class ResilientAppControllerIntegrationTest { EXTERNAL_SERVICE.stubFor(WireMock.get("/api/external").willReturn(ok())); Map responseStatusCount = new ConcurrentHashMap<>(); ExecutorService executorService = Executors.newFixedThreadPool(5); + CountDownLatch latch = new CountDownLatch(5); - List> tasks = new ArrayList<>(); IntStream.rangeClosed(1, 5) .forEach( i -> - tasks.add( + executorService.execute( () -> { ResponseEntity response = restTemplate.getForEntity("/api/bulkhead", String.class); - return response.getStatusCodeValue(); + int statusCode = response.getStatusCodeValue(); + responseStatusCount.merge(statusCode, 1, Integer::sum); + latch.countDown(); })); - - List> futures = executorService.invokeAll(tasks); - for (Future future : futures) { - int statusCode = future.get(); - responseStatusCount.merge(statusCode, 1, Integer::sum); - } + latch.await(); executorService.shutdown(); assertEquals(2, responseStatusCount.keySet().size()); + LOGGER.info("Response statuses: " + responseStatusCount.keySet()); assertTrue(responseStatusCount.containsKey(BANDWIDTH_LIMIT_EXCEEDED.value())); assertTrue(responseStatusCount.containsKey(OK.value())); EXTERNAL_SERVICE.verify(3, getRequestedFor(urlEqualTo("/api/external"))); diff --git a/spring-boot-modules/spring-caching/README.md b/spring-boot-modules/spring-caching/README.md index e10d6080e8..4994c22c0b 100644 --- a/spring-boot-modules/spring-caching/README.md +++ b/spring-boot-modules/spring-caching/README.md @@ -6,3 +6,4 @@ - [Using Multiple Cache Managers in Spring](https://www.baeldung.com/spring-multiple-cache-managers) - [Testing @Cacheable on Spring Data Repositories](https://www.baeldung.com/spring-data-testing-cacheable) - [Spring Boot Ehcache Example](https://www.baeldung.com/spring-boot-ehcache) +- [Get All Cached Keys with Caffeine Cache in Spring Boot](https://www.baeldung.com/spring-boot-caffeine-spring-get-all-keys) diff --git a/spring-boot-rest/pom.xml b/spring-boot-rest/pom.xml index 81c9ebbec8..46563b725f 100644 --- a/spring-boot-rest/pom.xml +++ b/spring-boot-rest/pom.xml @@ -143,6 +143,11 @@ + + org.glassfish.jaxb + jaxb-runtime + ${jaxb-runtime.version} + @@ -159,5 +164,6 @@ 1.4.11.1 3.1.0 3.3.2 + 2.3.7 diff --git a/spring-core-2/.gitignore b/spring-core-2/.gitignore deleted file mode 100644 index 83c05e60c8..0000000000 --- a/spring-core-2/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -*.class - -#folders# -/target -/neoDb* -/data -/src/main/webapp/WEB-INF/classes -*/META-INF/* - -# Packaged files # -*.jar -*.war -*.ear \ No newline at end of file diff --git a/spring-core-2/README.md b/spring-core-2/README.md index 18e4e32d1f..80ae54b2a4 100644 --- a/spring-core-2/README.md +++ b/spring-core-2/README.md @@ -6,4 +6,9 @@ This module contains articles about core Spring functionality - [Quick Guide to Spring Bean Scopes](http://www.baeldung.com/spring-bean-scopes) - [Spring Events](https://www.baeldung.com/spring-events) +- [Solving Spring’s “not eligible for auto-proxying” Warning](https://www.baeldung.com/spring-not-eligible-for-auto-proxying) +- [Finding the Spring Version](https://www.baeldung.com/spring-find-version) +- [How Does the Spring Singleton Bean Serve Concurrent Requests?](https://www.baeldung.com/spring-singleton-concurrent-requests) +- [Reinitialize Singleton Bean in Spring Context](https://www.baeldung.com/spring-reinitialize-singleton-bean) +- [Getting the Current ApplicationContext in Spring](https://www.baeldung.com/spring-get-current-applicationcontext) - More articles: [[<-- prev]](/spring-core)[[next -->]](/spring-core-3) diff --git a/spring-core-2/pom.xml b/spring-core-2/pom.xml index d05090fa6b..bab47cb70c 100644 --- a/spring-core-2/pom.xml +++ b/spring-core-2/pom.xml @@ -15,29 +15,15 @@ ../parent-boot-2 - - - - org.springframework - spring-framework-bom - ${org.springframework.version} - pom - import - - - org.springframework - spring-core - ${org.springframework.version} - - - org.springframework.boot - spring-boot-starter-thymeleaf - ${org.springframework.version} - - - - + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-web + com.fasterxml.jackson.core jackson-databind @@ -129,6 +115,11 @@ spring-test test + + org.springframework.boot + spring-boot-starter-test + test + net.javacrumbs.shedlock @@ -140,6 +131,10 @@ shedlock-provider-jdbc-template ${shedlock.version} + + org.projectlombok + lombok + @@ -164,8 +159,6 @@ com.baeldung.sample.App - - 5.3.0 1.3.2 5.2.5.Final diff --git a/spring-core-6/src/main/java/com/baeldung/applicationcontext/ApplicationContextProvider.java b/spring-core-2/src/main/java/com/baeldung/applicationcontext/ApplicationContextProvider.java similarity index 100% rename from spring-core-6/src/main/java/com/baeldung/applicationcontext/ApplicationContextProvider.java rename to spring-core-2/src/main/java/com/baeldung/applicationcontext/ApplicationContextProvider.java diff --git a/spring-core-6/src/main/java/com/baeldung/applicationcontext/ItemService.java b/spring-core-2/src/main/java/com/baeldung/applicationcontext/ItemService.java similarity index 100% rename from spring-core-6/src/main/java/com/baeldung/applicationcontext/ItemService.java rename to spring-core-2/src/main/java/com/baeldung/applicationcontext/ItemService.java diff --git a/spring-core-6/src/main/java/com/baeldung/applicationcontext/MyBean.java b/spring-core-2/src/main/java/com/baeldung/applicationcontext/MyBean.java similarity index 100% rename from spring-core-6/src/main/java/com/baeldung/applicationcontext/MyBean.java rename to spring-core-2/src/main/java/com/baeldung/applicationcontext/MyBean.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/autoproxying/DataCache.java b/spring-core-2/src/main/java/com/baeldung/component/autoproxying/DataCache.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/autoproxying/DataCache.java rename to spring-core-2/src/main/java/com/baeldung/component/autoproxying/DataCache.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/autoproxying/EligibleForAutoProxyRandomIntProcessor.java b/spring-core-2/src/main/java/com/baeldung/component/autoproxying/EligibleForAutoProxyRandomIntProcessor.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/autoproxying/EligibleForAutoProxyRandomIntProcessor.java rename to spring-core-2/src/main/java/com/baeldung/component/autoproxying/EligibleForAutoProxyRandomIntProcessor.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/autoproxying/NotEligibleForAutoProxyRandomIntProcessor.java b/spring-core-2/src/main/java/com/baeldung/component/autoproxying/NotEligibleForAutoProxyRandomIntProcessor.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/autoproxying/NotEligibleForAutoProxyRandomIntProcessor.java rename to spring-core-2/src/main/java/com/baeldung/component/autoproxying/NotEligibleForAutoProxyRandomIntProcessor.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/autoproxying/RandomInt.java b/spring-core-2/src/main/java/com/baeldung/component/autoproxying/RandomInt.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/autoproxying/RandomInt.java rename to spring-core-2/src/main/java/com/baeldung/component/autoproxying/RandomInt.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/autoproxying/RandomIntGenerator.java b/spring-core-2/src/main/java/com/baeldung/component/autoproxying/RandomIntGenerator.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/autoproxying/RandomIntGenerator.java rename to spring-core-2/src/main/java/com/baeldung/component/autoproxying/RandomIntGenerator.java diff --git a/spring-core-5/src/main/java/com/baeldung/concurrentrequest/ConcurrentRequestApplication.java b/spring-core-2/src/main/java/com/baeldung/concurrentrequest/ConcurrentRequestApplication.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/concurrentrequest/ConcurrentRequestApplication.java rename to spring-core-2/src/main/java/com/baeldung/concurrentrequest/ConcurrentRequestApplication.java diff --git a/spring-core-5/src/main/java/com/baeldung/concurrentrequest/Product.java b/spring-core-2/src/main/java/com/baeldung/concurrentrequest/Product.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/concurrentrequest/Product.java rename to spring-core-2/src/main/java/com/baeldung/concurrentrequest/Product.java diff --git a/spring-core-5/src/main/java/com/baeldung/concurrentrequest/ProductController.java b/spring-core-2/src/main/java/com/baeldung/concurrentrequest/ProductController.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/concurrentrequest/ProductController.java rename to spring-core-2/src/main/java/com/baeldung/concurrentrequest/ProductController.java diff --git a/spring-core-5/src/main/java/com/baeldung/concurrentrequest/ProductService.java b/spring-core-2/src/main/java/com/baeldung/concurrentrequest/ProductService.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/concurrentrequest/ProductService.java rename to spring-core-2/src/main/java/com/baeldung/concurrentrequest/ProductService.java diff --git a/spring-core-5/src/main/java/com/baeldung/concurrentrequest/Stock.java b/spring-core-2/src/main/java/com/baeldung/concurrentrequest/Stock.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/concurrentrequest/Stock.java rename to spring-core-2/src/main/java/com/baeldung/concurrentrequest/Stock.java diff --git a/spring-core-6/src/main/java/com/baeldung/reinitializebean/ReinitializeBeanApp.java b/spring-core-2/src/main/java/com/baeldung/reinitializebean/ReinitializeBeanApp.java similarity index 100% rename from spring-core-6/src/main/java/com/baeldung/reinitializebean/ReinitializeBeanApp.java rename to spring-core-2/src/main/java/com/baeldung/reinitializebean/ReinitializeBeanApp.java diff --git a/spring-core-6/src/main/java/com/baeldung/reinitializebean/cache/ConfigManager.java b/spring-core-2/src/main/java/com/baeldung/reinitializebean/cache/ConfigManager.java similarity index 100% rename from spring-core-6/src/main/java/com/baeldung/reinitializebean/cache/ConfigManager.java rename to spring-core-2/src/main/java/com/baeldung/reinitializebean/cache/ConfigManager.java diff --git a/spring-core-6/src/main/java/com/baeldung/reinitializebean/controller/ConfigController.java b/spring-core-2/src/main/java/com/baeldung/reinitializebean/controller/ConfigController.java similarity index 100% rename from spring-core-6/src/main/java/com/baeldung/reinitializebean/controller/ConfigController.java rename to spring-core-2/src/main/java/com/baeldung/reinitializebean/controller/ConfigController.java diff --git a/spring-core-5/src/main/java/com/baeldung/version/VersionObtainer.java b/spring-core-2/src/main/java/com/baeldung/version/VersionObtainer.java similarity index 96% rename from spring-core-5/src/main/java/com/baeldung/version/VersionObtainer.java rename to spring-core-2/src/main/java/com/baeldung/version/VersionObtainer.java index 392cc44a72..e0e28c6181 100644 --- a/spring-core-5/src/main/java/com/baeldung/version/VersionObtainer.java +++ b/spring-core-2/src/main/java/com/baeldung/version/VersionObtainer.java @@ -1,20 +1,20 @@ -package com.baeldung.version; - -import org.springframework.boot.system.JavaVersion; -import org.springframework.boot.system.SystemProperties; -import org.springframework.core.SpringVersion; - -public class VersionObtainer { - - public String getSpringVersion() { - return SpringVersion.getVersion(); - } - - public String getJavaVersion() { - return JavaVersion.getJavaVersion().toString(); - } - - public String getJdkVersion() { - return SystemProperties.get("java.version"); - } -} +package com.baeldung.version; + +import org.springframework.boot.system.JavaVersion; +import org.springframework.boot.system.SystemProperties; +import org.springframework.core.SpringVersion; + +public class VersionObtainer { + + public String getSpringVersion() { + return SpringVersion.getVersion(); + } + + public String getJavaVersion() { + return JavaVersion.getJavaVersion().toString(); + } + + public String getJdkVersion() { + return SystemProperties.get("java.version"); + } +} diff --git a/spring-core-2/src/main/resources/application.properties b/spring-core-2/src/main/resources/application.properties index e69de29bb2..97916eec19 100644 --- a/spring-core-2/src/main/resources/application.properties +++ b/spring-core-2/src/main/resources/application.properties @@ -0,0 +1 @@ +config.file.path=./spring-core-2/src/main/resources/config.properties \ No newline at end of file diff --git a/spring-core-6/src/main/resources/config.properties b/spring-core-2/src/main/resources/config.properties similarity index 100% rename from spring-core-6/src/main/resources/config.properties rename to spring-core-2/src/main/resources/config.properties diff --git a/spring-core-6/src/test/java/com/baeldung/applicationcontext/ApplicationContextProviderUnitTest.java b/spring-core-2/src/test/java/com/baeldung/applicationcontext/ApplicationContextProviderUnitTest.java similarity index 100% rename from spring-core-6/src/test/java/com/baeldung/applicationcontext/ApplicationContextProviderUnitTest.java rename to spring-core-2/src/test/java/com/baeldung/applicationcontext/ApplicationContextProviderUnitTest.java diff --git a/spring-core-6/src/test/java/com/baeldung/applicationcontext/MyBeanUnitTest.java b/spring-core-2/src/test/java/com/baeldung/applicationcontext/MyBeanUnitTest.java similarity index 100% rename from spring-core-6/src/test/java/com/baeldung/applicationcontext/MyBeanUnitTest.java rename to spring-core-2/src/test/java/com/baeldung/applicationcontext/MyBeanUnitTest.java diff --git a/spring-core-6/src/test/java/com/baeldung/applicationcontext/TestContextConfig.java b/spring-core-2/src/test/java/com/baeldung/applicationcontext/TestContextConfig.java similarity index 100% rename from spring-core-6/src/test/java/com/baeldung/applicationcontext/TestContextConfig.java rename to spring-core-2/src/test/java/com/baeldung/applicationcontext/TestContextConfig.java diff --git a/spring-core-5/src/test/java/com/baeldung/component/autoproxying/EligibleForAutoProxyingIntegrationTest.java b/spring-core-2/src/test/java/com/baeldung/component/autoproxying/EligibleForAutoProxyingIntegrationTest.java similarity index 100% rename from spring-core-5/src/test/java/com/baeldung/component/autoproxying/EligibleForAutoProxyingIntegrationTest.java rename to spring-core-2/src/test/java/com/baeldung/component/autoproxying/EligibleForAutoProxyingIntegrationTest.java diff --git a/spring-core-5/src/test/java/com/baeldung/component/autoproxying/MemoryLogAppender.java b/spring-core-2/src/test/java/com/baeldung/component/autoproxying/MemoryLogAppender.java similarity index 100% rename from spring-core-5/src/test/java/com/baeldung/component/autoproxying/MemoryLogAppender.java rename to spring-core-2/src/test/java/com/baeldung/component/autoproxying/MemoryLogAppender.java diff --git a/spring-core-5/src/test/java/com/baeldung/component/autoproxying/NotEligibleForAutoProxyingIntegrationTest.java b/spring-core-2/src/test/java/com/baeldung/component/autoproxying/NotEligibleForAutoProxyingIntegrationTest.java similarity index 100% rename from spring-core-5/src/test/java/com/baeldung/component/autoproxying/NotEligibleForAutoProxyingIntegrationTest.java rename to spring-core-2/src/test/java/com/baeldung/component/autoproxying/NotEligibleForAutoProxyingIntegrationTest.java diff --git a/spring-core-5/src/test/java/com/baeldung/concurrentrequest/ConcurrentRequestManualTest.java b/spring-core-2/src/test/java/com/baeldung/concurrentrequest/ConcurrentRequestManualTest.java similarity index 100% rename from spring-core-5/src/test/java/com/baeldung/concurrentrequest/ConcurrentRequestManualTest.java rename to spring-core-2/src/test/java/com/baeldung/concurrentrequest/ConcurrentRequestManualTest.java diff --git a/spring-core-5/src/test/java/com/baeldung/version/VersionObtainerUnitTest.java b/spring-core-2/src/test/java/com/baeldung/version/VersionObtainerUnitTest.java similarity index 96% rename from spring-core-5/src/test/java/com/baeldung/version/VersionObtainerUnitTest.java rename to spring-core-2/src/test/java/com/baeldung/version/VersionObtainerUnitTest.java index 6d77cd1403..af074d5783 100644 --- a/spring-core-5/src/test/java/com/baeldung/version/VersionObtainerUnitTest.java +++ b/spring-core-2/src/test/java/com/baeldung/version/VersionObtainerUnitTest.java @@ -1,30 +1,30 @@ -package com.baeldung.version; - -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest(classes = VersionObtainer.class) -public class VersionObtainerUnitTest { - - public VersionObtainer version = new VersionObtainer(); - - @Test - public void testGetSpringVersion() { - String res = version.getSpringVersion(); - assertThat(res).isNotEmpty(); - } - - @Test - public void testGetJdkVersion() { - String res = version.getJdkVersion(); - assertThat(res).isNotEmpty(); - } - - @Test - public void testGetJavaVersion() { - String res = version.getJavaVersion(); - assertThat(res).isNotEmpty(); - } -} +package com.baeldung.version; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest(classes = VersionObtainer.class) +public class VersionObtainerUnitTest { + + public VersionObtainer version = new VersionObtainer(); + + @Test + public void testGetSpringVersion() { + String res = version.getSpringVersion(); + assertThat(res).isNotEmpty(); + } + + @Test + public void testGetJdkVersion() { + String res = version.getJdkVersion(); + assertThat(res).isNotEmpty(); + } + + @Test + public void testGetJavaVersion() { + String res = version.getJavaVersion(); + assertThat(res).isNotEmpty(); + } +} diff --git a/spring-core-3/README.md b/spring-core-3/README.md index 394f6e1857..ed88561e10 100644 --- a/spring-core-3/README.md +++ b/spring-core-3/README.md @@ -10,4 +10,5 @@ This module contains articles about core Spring functionality - [Design Patterns in the Spring Framework](https://www.baeldung.com/spring-framework-design-patterns) - [Difference Between BeanFactory and ApplicationContext](https://www.baeldung.com/spring-beanfactory-vs-applicationcontext) - [Custom Scope in Spring](http://www.baeldung.com/spring-custom-scope) +- [The Spring ApplicationContext](https://www.baeldung.com/spring-application-context) - More articles: [[<-- prev]](/spring-core-2) [[next -->]](/spring-core-4) diff --git a/spring-core-4/src/main/java/com/baeldung/applicationcontext/AccountConfig.java b/spring-core-3/src/main/java/com/baeldung/applicationcontext/AccountConfig.java similarity index 100% rename from spring-core-4/src/main/java/com/baeldung/applicationcontext/AccountConfig.java rename to spring-core-3/src/main/java/com/baeldung/applicationcontext/AccountConfig.java diff --git a/spring-core-4/src/main/java/com/baeldung/applicationcontext/AccountRepository.java b/spring-core-3/src/main/java/com/baeldung/applicationcontext/AccountRepository.java similarity index 100% rename from spring-core-4/src/main/java/com/baeldung/applicationcontext/AccountRepository.java rename to spring-core-3/src/main/java/com/baeldung/applicationcontext/AccountRepository.java diff --git a/spring-core-4/src/main/java/com/baeldung/applicationcontext/AccountService.java b/spring-core-3/src/main/java/com/baeldung/applicationcontext/AccountService.java similarity index 100% rename from spring-core-4/src/main/java/com/baeldung/applicationcontext/AccountService.java rename to spring-core-3/src/main/java/com/baeldung/applicationcontext/AccountService.java diff --git a/spring-core-4/src/main/java/com/baeldung/applicationcontext/MyWebApplicationInitializer.java b/spring-core-3/src/main/java/com/baeldung/applicationcontext/MyWebApplicationInitializer.java similarity index 100% rename from spring-core-4/src/main/java/com/baeldung/applicationcontext/MyWebApplicationInitializer.java rename to spring-core-3/src/main/java/com/baeldung/applicationcontext/MyWebApplicationInitializer.java diff --git a/spring-core-4/src/main/java/com/baeldung/applicationcontext/MyXmlWebApplicationInitializer.java b/spring-core-3/src/main/java/com/baeldung/applicationcontext/MyXmlWebApplicationInitializer.java similarity index 100% rename from spring-core-4/src/main/java/com/baeldung/applicationcontext/MyXmlWebApplicationInitializer.java rename to spring-core-3/src/main/java/com/baeldung/applicationcontext/MyXmlWebApplicationInitializer.java diff --git a/spring-core-4/src/main/java/com/baeldung/applicationcontext/UserService.java b/spring-core-3/src/main/java/com/baeldung/applicationcontext/UserService.java similarity index 100% rename from spring-core-4/src/main/java/com/baeldung/applicationcontext/UserService.java rename to spring-core-3/src/main/java/com/baeldung/applicationcontext/UserService.java diff --git a/spring-core-4/src/test/java/com/baeldung/applicationcontext/ApplicationContextUnitTest.java b/spring-core-3/src/test/java/com/baeldung/applicationcontext/ApplicationContextUnitTest.java similarity index 100% rename from spring-core-4/src/test/java/com/baeldung/applicationcontext/ApplicationContextUnitTest.java rename to spring-core-3/src/test/java/com/baeldung/applicationcontext/ApplicationContextUnitTest.java diff --git a/spring-core-4/src/test/resources/applicationcontext/account-bean-config.xml b/spring-core-3/src/test/resources/applicationcontext/account-bean-config.xml similarity index 100% rename from spring-core-4/src/test/resources/applicationcontext/account-bean-config.xml rename to spring-core-3/src/test/resources/applicationcontext/account-bean-config.xml diff --git a/spring-core-4/src/test/resources/applicationcontext/user-bean-config.xml b/spring-core-3/src/test/resources/applicationcontext/user-bean-config.xml similarity index 100% rename from spring-core-4/src/test/resources/applicationcontext/user-bean-config.xml rename to spring-core-3/src/test/resources/applicationcontext/user-bean-config.xml diff --git a/spring-core-4/src/test/resources/config/messages.properties b/spring-core-3/src/test/resources/config/messages.properties similarity index 100% rename from spring-core-4/src/test/resources/config/messages.properties rename to spring-core-3/src/test/resources/config/messages.properties diff --git a/spring-core-4/README.md b/spring-core-4/README.md index 0338d5d6e8..a0f5ac97f9 100644 --- a/spring-core-4/README.md +++ b/spring-core-4/README.md @@ -6,6 +6,4 @@ This module contains articles about core Spring functionality - [Creating Spring Beans Through Factory Methods](https://www.baeldung.com/spring-beans-factory-methods) - [Spring BeanPostProcessor](https://www.baeldung.com/spring-beanpostprocessor) -- [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class) -- [The Spring ApplicationContext](https://www.baeldung.com/spring-application-context) -- More articles: [[<-- prev]](/spring-core-3) [[next -->]](/spring-core-5) +- More articles: [[<-- prev]](/spring-core-3) diff --git a/spring-core-5/README.md b/spring-core-5/README.md deleted file mode 100644 index 13945c1f8b..0000000000 --- a/spring-core-5/README.md +++ /dev/null @@ -1,11 +0,0 @@ -## Spring Core - -This module contains articles about core Spring functionality. - -## Relevant Articles: - -- [Spring @Component Annotation](https://www.baeldung.com/spring-component-annotation) -- [Solving Spring’s “not eligible for auto-proxying” Warning](https://www.baeldung.com/spring-not-eligible-for-auto-proxying) -- [Finding the Spring Version](https://www.baeldung.com/spring-find-version) -- [How Does the Spring Singleton Bean Serve Concurrent Requests?](https://www.baeldung.com/spring-singleton-concurrent-requests) -- More articles: [[<-- prev]](../spring-core-4) diff --git a/spring-core-5/pom.xml b/spring-core-5/pom.xml deleted file mode 100644 index 1c2e80be44..0000000000 --- a/spring-core-5/pom.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - 4.0.0 - spring-core-5 - spring-core-5 - - - com.baeldung - parent-spring-5 - 0.0.1-SNAPSHOT - ../parent-spring-5 - - - - - org.springframework.boot - spring-boot-starter - ${spring-boot-starter.version} - - - org.springframework.boot - spring-boot-starter-web - ${spring-boot-starter.version} - - - org.springframework.boot - spring-boot-starter-test - ${spring-boot-starter.version} - test - - - org.projectlombok - lombok - ${lombok.version} - - - - - 5.3.3 - 2.4.2 - - - \ No newline at end of file diff --git a/spring-core-6/README.md b/spring-core-6/README.md deleted file mode 100644 index 1879ff9a68..0000000000 --- a/spring-core-6/README.md +++ /dev/null @@ -1,5 +0,0 @@ - -### Relevant Articles: -- [Reinitialize Singleton Bean in Spring Context](https://www.baeldung.com/spring-reinitialize-singleton-bean) -- [Getting the Current ApplicationContext in Spring](https://www.baeldung.com/spring-get-current-applicationcontext) -- More articles: [[<-- prev]](../spring-core-5) \ No newline at end of file diff --git a/spring-core-6/pom.xml b/spring-core-6/pom.xml deleted file mode 100644 index cc494b3a57..0000000000 --- a/spring-core-6/pom.xml +++ /dev/null @@ -1,95 +0,0 @@ - - - 4.0.0 - com.baeldung - spring-core-6 - 0.0.1-SNAPSHOT - spring-core-6 - http://www.baeldung.com - - - org.springframework.boot - spring-boot-starter-parent - 3.0.1 - - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-test - test - - - io.projectreactor - reactor-test - test - - - - - - - - maven-clean-plugin - 3.1.0 - - - maven-resources-plugin - 3.0.2 - - - maven-compiler-plugin - 3.8.0 - - - maven-surefire-plugin - 2.22.1 - - - maven-jar-plugin - 3.0.2 - - - maven-install-plugin - 2.5.2 - - - maven-deploy-plugin - 2.8.2 - - - maven-site-plugin - 3.7.1 - - - maven-project-info-reports-plugin - 3.0.0 - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 17 - 17 - - - - - - - UTF-8 - 17 - 17 - - - \ No newline at end of file diff --git a/spring-core-6/src/main/resources/application.properties b/spring-core-6/src/main/resources/application.properties deleted file mode 100644 index 6545cd1097..0000000000 --- a/spring-core-6/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -config.file.path=./spring-core-6/src/main/resources/config.properties \ No newline at end of file diff --git a/spring-di-3/README.md b/spring-di-3/README.md index 1ac280fef2..ffb81fbe7d 100644 --- a/spring-di-3/README.md +++ b/spring-di-3/README.md @@ -11,4 +11,4 @@ This module contains articles about dependency injection with Spring - [@Order in Spring](http://www.baeldung.com/spring-order) - [How to dynamically Autowire a Bean in Spring](https://www.baeldung.com/spring-dynamic-autowire) - [Spring @Import Annotation](https://www.baeldung.com/spring-import-annotation) -- More articles: [[<-- prev]](../spring-di-2) +- More articles: [[<-- prev]](../spring-di-2)[[more -->]](../spring-di-4) diff --git a/spring-di-4/README.md b/spring-di-4/README.md new file mode 100644 index 0000000000..d4b0d94385 --- /dev/null +++ b/spring-di-4/README.md @@ -0,0 +1,9 @@ +## Spring Dependency Injection + +This module contains articles about dependency injection with Spring + +### Relevant Articles + +- [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class) +- [Spring @Component Annotation](https://www.baeldung.com/spring-component-annotation) +- More articles: [[<-- prev]](../spring-di-3) diff --git a/spring-di-4/pom.xml b/spring-di-4/pom.xml new file mode 100644 index 0000000000..c6572495cb --- /dev/null +++ b/spring-di-4/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + spring-di-4 + 1.0-SNAPSHOT + spring-di-4 + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + + + + \ No newline at end of file diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/AmbiguousBean.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/AmbiguousBean.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/AmbiguousBean.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/AmbiguousBean.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/BeanExample.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/BeanExample.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/BeanExample.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/BeanExample.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/BeanImplA.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/BeanImplA.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/BeanImplA.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/BeanImplA.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/BeanImplB.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/BeanImplB.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/BeanImplB.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/BeanImplB.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/ComponentApplication.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/ComponentApplication.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/ComponentApplication.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/ComponentApplication.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/ComponentExample.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/ComponentExample.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/ComponentExample.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/ComponentExample.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/ControllerExample.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/ControllerExample.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/ControllerExample.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/ControllerExample.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/CustomComponent.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/CustomComponent.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/CustomComponent.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/CustomComponent.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/CustomComponentExample.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/CustomComponentExample.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/CustomComponentExample.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/CustomComponentExample.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/RepositoryExample.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/RepositoryExample.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/RepositoryExample.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/RepositoryExample.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/ServiceExample.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/ServiceExample.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/ServiceExample.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/ServiceExample.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/outsidescope/OutsideScopeBeanExample.java b/spring-di-4/src/main/java/com/baeldung/component/outsidescope/OutsideScopeBeanExample.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/outsidescope/OutsideScopeBeanExample.java rename to spring-di-4/src/main/java/com/baeldung/component/outsidescope/OutsideScopeBeanExample.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/outsidescope/OutsideScopeExample.java b/spring-di-4/src/main/java/com/baeldung/component/outsidescope/OutsideScopeExample.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/outsidescope/OutsideScopeExample.java rename to spring-di-4/src/main/java/com/baeldung/component/outsidescope/OutsideScopeExample.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/scannedscope/ScannedScopeExample.java b/spring-di-4/src/main/java/com/baeldung/component/scannedscope/ScannedScopeExample.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/scannedscope/ScannedScopeExample.java rename to spring-di-4/src/main/java/com/baeldung/component/scannedscope/ScannedScopeExample.java diff --git a/spring-core-4/src/main/java/com/baeldung/sampleabstract/BallService.java b/spring-di-4/src/main/java/com/baeldung/sampleabstract/BallService.java similarity index 100% rename from spring-core-4/src/main/java/com/baeldung/sampleabstract/BallService.java rename to spring-di-4/src/main/java/com/baeldung/sampleabstract/BallService.java diff --git a/spring-core-4/src/main/java/com/baeldung/sampleabstract/BasketballService.java b/spring-di-4/src/main/java/com/baeldung/sampleabstract/BasketballService.java similarity index 100% rename from spring-core-4/src/main/java/com/baeldung/sampleabstract/BasketballService.java rename to spring-di-4/src/main/java/com/baeldung/sampleabstract/BasketballService.java diff --git a/spring-core-4/src/main/java/com/baeldung/sampleabstract/DemoApp.java b/spring-di-4/src/main/java/com/baeldung/sampleabstract/DemoApp.java similarity index 100% rename from spring-core-4/src/main/java/com/baeldung/sampleabstract/DemoApp.java rename to spring-di-4/src/main/java/com/baeldung/sampleabstract/DemoApp.java diff --git a/spring-core-4/src/main/java/com/baeldung/sampleabstract/LogRepository.java b/spring-di-4/src/main/java/com/baeldung/sampleabstract/LogRepository.java similarity index 100% rename from spring-core-4/src/main/java/com/baeldung/sampleabstract/LogRepository.java rename to spring-di-4/src/main/java/com/baeldung/sampleabstract/LogRepository.java diff --git a/spring-core-4/src/main/java/com/baeldung/sampleabstract/RuleRepository.java b/spring-di-4/src/main/java/com/baeldung/sampleabstract/RuleRepository.java similarity index 100% rename from spring-core-4/src/main/java/com/baeldung/sampleabstract/RuleRepository.java rename to spring-di-4/src/main/java/com/baeldung/sampleabstract/RuleRepository.java diff --git a/spring-core-5/src/main/resources/application.yml b/spring-di-4/src/main/resources/application.yml similarity index 100% rename from spring-core-5/src/main/resources/application.yml rename to spring-di-4/src/main/resources/application.yml diff --git a/spring-core-5/src/test/java/com/baeldung/component/inscope/ComponentUnitTest.java b/spring-di-4/src/test/java/com/baeldung/component/inscope/ComponentUnitTest.java similarity index 100% rename from spring-core-5/src/test/java/com/baeldung/component/inscope/ComponentUnitTest.java rename to spring-di-4/src/test/java/com/baeldung/component/inscope/ComponentUnitTest.java diff --git a/spring-core-5/src/test/resources/application.yml b/spring-di-4/src/test/resources/application.yml similarity index 100% rename from spring-core-5/src/test/resources/application.yml rename to spring-di-4/src/test/resources/application.yml diff --git a/spring-core-5/src/test/resources/logback-test.xml b/spring-di-4/src/test/resources/logback-test.xml similarity index 100% rename from spring-core-5/src/test/resources/logback-test.xml rename to spring-di-4/src/test/resources/logback-test.xml diff --git a/spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/cancelflux/CancelFluxUnitTest.java b/spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/cancelflux/CancelFluxUnitTest.java new file mode 100644 index 0000000000..e360c2d5e4 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/cancelflux/CancelFluxUnitTest.java @@ -0,0 +1,123 @@ +package com.baeldung.cancelflux; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; + +import java.io.PrintStream; +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.atomic.AtomicInteger; + +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mockito; + +import reactor.core.Disposable; +import reactor.core.publisher.Flux; +import reactor.core.publisher.SignalType; +import reactor.test.StepVerifier; + +public class CancelFluxUnitTest { + + @Test + void givenOngoingFlux_whentakeUntil_thenFluxCancels() { + Flux sensorData = Flux.range(1, 10); + List result = new ArrayList<>(); + + sensorData.takeUntil(reading -> reading == 8) + .subscribe(result::add); + assertThat(result).containsExactly(1, 2, 3, 4, 5, 6, 7, 8); + } + + @Test + void givenOngoingFlux_whentakeWhile_thenFluxCancels() { + List result = new ArrayList<>(); + Flux sensorData = Flux.range(1, 10) + .takeWhile(reading -> reading < 8) + .doOnNext(result::add); + + sensorData.subscribe(); + assertThat(result).containsExactly(1, 2, 3, 4, 5, 6, 7); + } + + @Test + void givenOngoingFlux_whentake_thenFluxCancels() { + Flux sensorData = Flux.range(1, Integer.MAX_VALUE); + List result = new ArrayList<>(); + + sensorData.take(2) + .subscribe(result::add); + assertThat(result).containsExactly(1, 2); + } + + @Test + void givenAnOnGoingFlux_whenTakeDurationElapsed_thenCancelsFlux() { + Flux sensorData = Flux.interval(Duration.ZERO, Duration.ofSeconds(2)) + .map(i -> i.intValue() + 10) + .take(5); + + Flux canceledByTimeout = sensorData.take(Duration.ofSeconds(3)); + + StepVerifier.create(canceledByTimeout) + .expectNext(10, 11) + .expectComplete() + .verify(); + } + + @Test + void givenAnOnGoingFlux_whenDispose_thenCancelsFluxExplicitly() throws InterruptedException { + Flux flux = Flux.range(1, 10) + .delayElements(Duration.ofSeconds(1)); + + AtomicInteger count = new AtomicInteger(0); + Disposable disposable = flux.subscribe(i -> { + System.out.println("Received: " + i); + count.incrementAndGet(); + }, e -> System.err.println("Error: " + e.getMessage())); + + Thread.sleep(4500); + System.out.println("Will Dispose The flux Next"); + disposable.dispose(); + if (disposable.isDisposed()) { + System.out.println("Flux Disposed"); + } + assertEquals(4, count.get()); + } + + @Test + void givenAFluxIsCanceled_whenDoOnCancelAndDoFinally_thenMessagePrinted() throws InterruptedException { + + List result = new ArrayList<>(); + PrintStream mockPrintStream = mock(PrintStream.class); + System.setOut(mockPrintStream); + + Flux sensorData = Flux.interval(Duration.ofMillis(100)) + .doOnCancel(() -> System.out.println("Flux Canceled")) + .doFinally(signalType -> { + if (signalType == SignalType.CANCEL) { + System.out.println("Flux Completed due to Cancellation"); + } else { + System.out.println("Flux Completed due to Completion or Error"); + } + }) + .map(i -> ThreadLocalRandom.current() + .nextInt(1, 1001)) + .doOnNext(result::add); + + Disposable subscription = sensorData.subscribe(); + + Thread.sleep(1000); + subscription.dispose(); + + ArgumentCaptor captor = ArgumentCaptor.forClass(String.class); + Mockito.verify(mockPrintStream, times(2)) + .println(captor.capture()); + + assertThat(captor.getAllValues()).contains("Flux Canceled", "Flux Completed due to Cancellation"); + } + +} diff --git a/spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/databuffer/DataBufferToInputStreamUnitTest.java b/spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/databuffer/DataBufferToInputStreamUnitTest.java index f30b4a8a3b..975a2d8698 100644 --- a/spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/databuffer/DataBufferToInputStreamUnitTest.java +++ b/spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/databuffer/DataBufferToInputStreamUnitTest.java @@ -17,9 +17,12 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.net.URI; import java.util.stream.Collectors; import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class DataBufferToInputStreamUnitTest { private String getResponseStub() throws IOException { @@ -67,7 +70,7 @@ class DataBufferToInputStreamUnitTest { @Test public void testResponseAsInputStream() throws IOException, InterruptedException { - String mockUrl = Mockito.anyString(); + String mockUrl = "http://mockurl.com"; WebClient mockWebClient = getMockWebClient(); InputStream inputStream = DataBufferToInputStream.getResponseAsInputStream(mockWebClient, mockUrl); byte[] expectedBytes = IOUtils.toByteArray(getResponseStubAsInputStream()); diff --git a/spring-reactive-modules/spring-reactive-exceptions/pom.xml b/spring-reactive-modules/spring-reactive-exceptions/pom.xml index 024a8332c2..fc08e07659 100644 --- a/spring-reactive-modules/spring-reactive-exceptions/pom.xml +++ b/spring-reactive-modules/spring-reactive-exceptions/pom.xml @@ -8,10 +8,11 @@ spring-reactive-exceptions A module to hold demo examples related to exception in Spring Reactive - - com.baeldung.spring.reactive - spring-reactive-modules - 1.0.0-SNAPSHOT + + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 @@ -23,7 +24,6 @@ org.projectlombok lombok - true org.springframework.boot @@ -42,14 +42,6 @@ org.springframework.boot spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - diff --git a/spring-reactive-modules/spring-reactive-exceptions/src/main/resources/application.yaml b/spring-reactive-modules/spring-reactive-exceptions/src/main/resources/application.yaml index 5f3c8b82a9..50bcbff433 100644 --- a/spring-reactive-modules/spring-reactive-exceptions/src/main/resources/application.yaml +++ b/spring-reactive-modules/spring-reactive-exceptions/src/main/resources/application.yaml @@ -2,4 +2,6 @@ spring: codec: max-in-memory-size: 500KB +server: + port: 8080 host: http://localhost:${server.port} diff --git a/spring-security-modules/spring-security-web-boot-2/README.md b/spring-security-modules/spring-security-web-boot-2/README.md index f5fc3a890d..c768ba924b 100644 --- a/spring-security-modules/spring-security-web-boot-2/README.md +++ b/spring-security-modules/spring-security-web-boot-2/README.md @@ -14,4 +14,5 @@ The "REST With Spring" Classes: http://github.learnspringsecurity.com - [Spring Security: Exploring JDBC Authentication](https://www.baeldung.com/spring-security-jdbc-authentication) - [Spring Security Custom Logout Handler](https://www.baeldung.com/spring-security-custom-logout-handler) - [Redirecting Logged-in Users with Spring Security](https://www.baeldung.com/spring-security-redirect-logged-in) -- More articles: [[<-- prev]](/spring-security-modules/spring-security-web-boot-1) + +More articles: [[<-- prev]](/spring-security-modules/spring-security-web-boot-1) [[next -->]](/spring-security-modules/spring-security-web-boot-3) diff --git a/spring-security-modules/spring-security-web-boot-3/README.md b/spring-security-modules/spring-security-web-boot-3/README.md index 400039dbfe..830abd2c99 100644 --- a/spring-security-modules/spring-security-web-boot-3/README.md +++ b/spring-security-modules/spring-security-web-boot-3/README.md @@ -14,4 +14,5 @@ The "REST With Spring" Classes: http://github.learnspringsecurity.com - [Content Security Policy with Spring Security](https://www.baeldung.com/spring-security-csp) - [Enable Logging for Spring Security](https://www.baeldung.com/spring-security-enable-logging) - [Authentication With Spring Security and MongoDB](https://www.baeldung.com/spring-security-authentication-mongodb) -- More articles: [[<-- prev]](/spring-security-modules/spring-security-web-boot-2) + +More articles: [[<-- prev]](/spring-security-modules/spring-security-web-boot-2) [[next -->]](/spring-security-modules/spring-security-web-boot-4) diff --git a/spring-security-modules/spring-security-web-boot-4/README.md b/spring-security-modules/spring-security-web-boot-4/README.md index 26b19e7b33..af8ed4e76a 100644 --- a/spring-security-modules/spring-security-web-boot-4/README.md +++ b/spring-security-modules/spring-security-web-boot-4/README.md @@ -8,5 +8,6 @@ The "REST With Spring" Classes: http://github.learnspringsecurity.com ### Relevant Articles: - [Spring Security: Upgrading the Deprecated WebSecurityConfigurerAdapter](https://www.baeldung.com/spring-deprecated-websecurityconfigureradapter) -- More articles: [[<-- prev]](/spring-security-modules/spring-security-web-boot-3) - [Spring @EnableMethodSecurity Annotation](https://www.baeldung.com/spring-enablemethodsecurity) + +More articles: [[<-- prev]](/spring-security-modules/spring-security-web-boot-3) diff --git a/spring-security-modules/spring-security-web-boot-4/src/main/java/com/baeldung/securityfilterchain/configuration/SecurityConfig.java b/spring-security-modules/spring-security-web-boot-4/src/main/java/com/baeldung/securityfilterchain/configuration/SecurityConfig.java index 4d3bec2ad2..5a8f4c1c02 100644 --- a/spring-security-modules/spring-security-web-boot-4/src/main/java/com/baeldung/securityfilterchain/configuration/SecurityConfig.java +++ b/spring-security-modules/spring-security-web-boot-4/src/main/java/com/baeldung/securityfilterchain/configuration/SecurityConfig.java @@ -29,7 +29,7 @@ public class SecurityConfig { .antMatchers("/user/**") .hasAnyRole("USER", "ADMIN") .antMatchers("/login/**") - .anonymous() + .permitAll() .anyRequest() .authenticated() .and() diff --git a/spring-web-modules/spring-thymeleaf-5/src/main/java/com/baeldung/thymeleaf/attributes/AttributeController.java b/spring-web-modules/spring-thymeleaf-5/src/main/java/com/baeldung/thymeleaf/attributes/AttributeController.java new file mode 100644 index 0000000000..b7725fd992 --- /dev/null +++ b/spring-web-modules/spring-thymeleaf-5/src/main/java/com/baeldung/thymeleaf/attributes/AttributeController.java @@ -0,0 +1,30 @@ +package com.baeldung.thymeleaf.attributes; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping("/attributes") +public class AttributeController { + + private static final Logger logger = LoggerFactory.getLogger(AttributeController.class); + + @GetMapping + public String show(Model model) { + model.addAttribute("title", "Baeldung"); + model.addAttribute("email", "default@example.com"); + return "attributes/index"; + } + + @PostMapping + public String submit(String email) { + logger.info("Email: {}", email); + return "redirect:attributes"; + } + +} diff --git a/spring-web-modules/spring-thymeleaf-5/src/main/resources/templates/attributes/index.html b/spring-web-modules/spring-thymeleaf-5/src/main/resources/templates/attributes/index.html new file mode 100644 index 0000000000..ed55b61a8a --- /dev/null +++ b/spring-web-modules/spring-thymeleaf-5/src/main/resources/templates/attributes/index.html @@ -0,0 +1,19 @@ + + + + + Difference Between th:text and th:value in Thymeleaf + + + +

+ +
+ + +
+ + + \ No newline at end of file diff --git a/terraform/README.md b/terraform-modules/README.md similarity index 100% rename from terraform/README.md rename to terraform-modules/README.md diff --git a/terraform/best-practices/README.md b/terraform-modules/best-practices/README.md similarity index 100% rename from terraform/best-practices/README.md rename to terraform-modules/best-practices/README.md diff --git a/terraform/best-practices/ec2-simple/.gitignore b/terraform-modules/best-practices/ec2-simple/.gitignore similarity index 100% rename from terraform/best-practices/ec2-simple/.gitignore rename to terraform-modules/best-practices/ec2-simple/.gitignore diff --git a/terraform/best-practices/ec2-simple/SETUP.md b/terraform-modules/best-practices/ec2-simple/SETUP.md similarity index 100% rename from terraform/best-practices/ec2-simple/SETUP.md rename to terraform-modules/best-practices/ec2-simple/SETUP.md diff --git a/terraform/best-practices/ec2-simple/main.tf b/terraform-modules/best-practices/ec2-simple/main.tf similarity index 100% rename from terraform/best-practices/ec2-simple/main.tf rename to terraform-modules/best-practices/ec2-simple/main.tf diff --git a/terraform/best-practices/ec2-simple/providers.tf b/terraform-modules/best-practices/ec2-simple/providers.tf similarity index 100% rename from terraform/best-practices/ec2-simple/providers.tf rename to terraform-modules/best-practices/ec2-simple/providers.tf diff --git a/terraform/best-practices/ec2-simple/variables.tf b/terraform-modules/best-practices/ec2-simple/variables.tf similarity index 100% rename from terraform/best-practices/ec2-simple/variables.tf rename to terraform-modules/best-practices/ec2-simple/variables.tf diff --git a/terraform/best-practices/k8s-basic/.gitignore b/terraform-modules/best-practices/k8s-basic/.gitignore similarity index 100% rename from terraform/best-practices/k8s-basic/.gitignore rename to terraform-modules/best-practices/k8s-basic/.gitignore diff --git a/terraform/best-practices/k8s-basic/SETUP.md b/terraform-modules/best-practices/k8s-basic/SETUP.md similarity index 100% rename from terraform/best-practices/k8s-basic/SETUP.md rename to terraform-modules/best-practices/k8s-basic/SETUP.md diff --git a/terraform/best-practices/k8s-basic/main.tf b/terraform-modules/best-practices/k8s-basic/main.tf similarity index 100% rename from terraform/best-practices/k8s-basic/main.tf rename to terraform-modules/best-practices/k8s-basic/main.tf diff --git a/terraform/best-practices/k8s-basic/providers.tf b/terraform-modules/best-practices/k8s-basic/providers.tf similarity index 100% rename from terraform/best-practices/k8s-basic/providers.tf rename to terraform-modules/best-practices/k8s-basic/providers.tf diff --git a/terraform/best-practices/k8s-basic/variables.tf b/terraform-modules/best-practices/k8s-basic/variables.tf similarity index 100% rename from terraform/best-practices/k8s-basic/variables.tf rename to terraform-modules/best-practices/k8s-basic/variables.tf diff --git a/terraform/best-practices/k8s-modules/.gitignore b/terraform-modules/best-practices/k8s-modules/.gitignore similarity index 100% rename from terraform/best-practices/k8s-modules/.gitignore rename to terraform-modules/best-practices/k8s-modules/.gitignore diff --git a/terraform/best-practices/k8s-modules/SETUP.md b/terraform-modules/best-practices/k8s-modules/SETUP.md similarity index 100% rename from terraform/best-practices/k8s-modules/SETUP.md rename to terraform-modules/best-practices/k8s-modules/SETUP.md diff --git a/terraform/best-practices/k8s-modules/main.tf b/terraform-modules/best-practices/k8s-modules/main.tf similarity index 100% rename from terraform/best-practices/k8s-modules/main.tf rename to terraform-modules/best-practices/k8s-modules/main.tf diff --git a/terraform/best-practices/k8s-modules/modules/SvcCustomer/main.tf b/terraform-modules/best-practices/k8s-modules/modules/SvcCustomer/main.tf similarity index 100% rename from terraform/best-practices/k8s-modules/modules/SvcCustomer/main.tf rename to terraform-modules/best-practices/k8s-modules/modules/SvcCustomer/main.tf diff --git a/terraform/best-practices/k8s-modules/modules/SvcCustomer/outputs.tf b/terraform-modules/best-practices/k8s-modules/modules/SvcCustomer/outputs.tf similarity index 100% rename from terraform/best-practices/k8s-modules/modules/SvcCustomer/outputs.tf rename to terraform-modules/best-practices/k8s-modules/modules/SvcCustomer/outputs.tf diff --git a/terraform/best-practices/k8s-modules/modules/SvcCustomer/variables.tf b/terraform-modules/best-practices/k8s-modules/modules/SvcCustomer/variables.tf similarity index 100% rename from terraform/best-practices/k8s-modules/modules/SvcCustomer/variables.tf rename to terraform-modules/best-practices/k8s-modules/modules/SvcCustomer/variables.tf diff --git a/terraform/best-practices/k8s-modules/modules/SvcFeedback/main.tf b/terraform-modules/best-practices/k8s-modules/modules/SvcFeedback/main.tf similarity index 100% rename from terraform/best-practices/k8s-modules/modules/SvcFeedback/main.tf rename to terraform-modules/best-practices/k8s-modules/modules/SvcFeedback/main.tf diff --git a/terraform/best-practices/k8s-modules/modules/SvcFeedback/outputs.tf b/terraform-modules/best-practices/k8s-modules/modules/SvcFeedback/outputs.tf similarity index 100% rename from terraform/best-practices/k8s-modules/modules/SvcFeedback/outputs.tf rename to terraform-modules/best-practices/k8s-modules/modules/SvcFeedback/outputs.tf diff --git a/terraform/best-practices/k8s-modules/modules/SvcFeedback/variables.tf b/terraform-modules/best-practices/k8s-modules/modules/SvcFeedback/variables.tf similarity index 100% rename from terraform/best-practices/k8s-modules/modules/SvcFeedback/variables.tf rename to terraform-modules/best-practices/k8s-modules/modules/SvcFeedback/variables.tf diff --git a/terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/main.tf b/terraform-modules/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/main.tf similarity index 100% rename from terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/main.tf rename to terraform-modules/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/main.tf diff --git a/terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/outputs.tf b/terraform-modules/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/outputs.tf similarity index 100% rename from terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/outputs.tf rename to terraform-modules/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/outputs.tf diff --git a/terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/variables.tf b/terraform-modules/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/variables.tf similarity index 100% rename from terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/variables.tf rename to terraform-modules/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/variables.tf diff --git a/terraform/best-practices/k8s-modules/provider.tf b/terraform-modules/best-practices/k8s-modules/provider.tf similarity index 100% rename from terraform/best-practices/k8s-modules/provider.tf rename to terraform-modules/best-practices/k8s-modules/provider.tf diff --git a/terraform/hello-terraform/.gitignore b/terraform-modules/hello-terraform/.gitignore similarity index 100% rename from terraform/hello-terraform/.gitignore rename to terraform-modules/hello-terraform/.gitignore diff --git a/terraform/hello-terraform/main.tf b/terraform-modules/hello-terraform/main.tf similarity index 100% rename from terraform/hello-terraform/main.tf rename to terraform-modules/hello-terraform/main.tf diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/junit4vstestng/DivisibilityUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/junit/DivisibilityUnitTest.java similarity index 90% rename from core-java-modules/core-java/src/test/java/com/baeldung/junit4vstestng/DivisibilityUnitTest.java rename to testing-modules/junit-4/src/test/java/com/baeldung/junit/DivisibilityUnitTest.java index b8fe701f57..3bdc8787f5 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/junit4vstestng/DivisibilityUnitTest.java +++ b/testing-modules/junit-4/src/test/java/com/baeldung/junit/DivisibilityUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.junit4vstestng; +package com.baeldung.junit; import static org.junit.Assert.assertEquals; diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/junit4vstestng/RegistrationUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/junit/RegistrationUnitTest.java similarity index 89% rename from core-java-modules/core-java/src/test/java/com/baeldung/junit4vstestng/RegistrationUnitTest.java rename to testing-modules/junit-4/src/test/java/com/baeldung/junit/RegistrationUnitTest.java index 08a9f1e1c4..b52c565a9d 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/junit4vstestng/RegistrationUnitTest.java +++ b/testing-modules/junit-4/src/test/java/com/baeldung/junit/RegistrationUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.junit4vstestng; +package com.baeldung.junit; import org.junit.Test; import org.slf4j.Logger; diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/junit4vstestng/SignInUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/junit/SignInUnitTest.java similarity index 89% rename from core-java-modules/core-java/src/test/java/com/baeldung/junit4vstestng/SignInUnitTest.java rename to testing-modules/junit-4/src/test/java/com/baeldung/junit/SignInUnitTest.java index a49fb454ea..145eb0d835 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/junit4vstestng/SignInUnitTest.java +++ b/testing-modules/junit-4/src/test/java/com/baeldung/junit/SignInUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.junit4vstestng; +package com.baeldung.junit; import org.junit.Test; import org.slf4j.Logger; diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/junit4vstestng/StringCaseUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/junit/StringCaseUnitTest.java similarity index 91% rename from core-java-modules/core-java/src/test/java/com/baeldung/junit4vstestng/StringCaseUnitTest.java rename to testing-modules/junit-4/src/test/java/com/baeldung/junit/StringCaseUnitTest.java index 16a881f7e7..a76fe97161 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/junit4vstestng/StringCaseUnitTest.java +++ b/testing-modules/junit-4/src/test/java/com/baeldung/junit/StringCaseUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.junit4vstestng; +package com.baeldung.junit; import static org.junit.Assert.assertEquals; diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/junit4vstestng/ParametrizedUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/junitparams/ParametrizedUnitTest.java similarity index 92% rename from core-java-modules/core-java/src/test/java/com/baeldung/junit4vstestng/ParametrizedUnitTest.java rename to testing-modules/junit-4/src/test/java/com/baeldung/junitparams/ParametrizedUnitTest.java index b46d4e895d..4e5a59eb22 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/junit4vstestng/ParametrizedUnitTest.java +++ b/testing-modules/junit-4/src/test/java/com/baeldung/junitparams/ParametrizedUnitTest.java @@ -1,7 +1,6 @@ -package com.baeldung.junit4vstestng; +package com.baeldung.junitparams; import org.junit.Assert; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/junit4vstestng/SuiteUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/runfromjava/SuiteUnitTest.java similarity index 61% rename from core-java-modules/core-java/src/test/java/com/baeldung/junit4vstestng/SuiteUnitTest.java rename to testing-modules/junit-4/src/test/java/com/baeldung/runfromjava/SuiteUnitTest.java index 3e02309636..67093b8a62 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/junit4vstestng/SuiteUnitTest.java +++ b/testing-modules/junit-4/src/test/java/com/baeldung/runfromjava/SuiteUnitTest.java @@ -1,7 +1,9 @@ -package com.baeldung.junit4vstestng; +package com.baeldung.runfromjava; import org.junit.runner.RunWith; import org.junit.runners.Suite; +import com.baeldung.junit.RegistrationUnitTest; +import com.baeldung.junit.SignInUnitTest; @RunWith(Suite.class) @Suite.SuiteClasses({ RegistrationUnitTest.class, SignInUnitTest.class }) diff --git a/testing-modules/junit-5-advanced/pom.xml b/testing-modules/junit-5-advanced/pom.xml index bfc490b03e..5a65b0f6f3 100644 --- a/testing-modules/junit-5-advanced/pom.xml +++ b/testing-modules/junit-5-advanced/pom.xml @@ -33,6 +33,19 @@ ${assertj.version} test + + org.junit.platform + junit-platform-suite + ${junit-platform.version} + test + + + org.junit.platform + junit-platform-runner + ${junit-platform.version} + test + + @@ -45,6 +58,9 @@ -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar true + + **/testsuite/**/*UnitTest.java + @@ -53,6 +69,7 @@ 1.49 3.24.2 + 1.9.2 \ No newline at end of file diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/ClassOneUnitTest.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/ClassOneUnitTest.java new file mode 100644 index 0000000000..4ce092796e --- /dev/null +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/ClassOneUnitTest.java @@ -0,0 +1,13 @@ +package com.baeldung.testsuite; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ClassOneUnitTest { + + @Test + public void whenTrue_thenTrue() { + Assertions.assertTrue(true); + } + +} diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/ClassThreeUnitTest.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/ClassThreeUnitTest.java new file mode 100644 index 0000000000..b686ef5773 --- /dev/null +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/ClassThreeUnitTest.java @@ -0,0 +1,13 @@ +package com.baeldung.testsuite; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +public class ClassThreeUnitTest { + @Test + @Tag("slow") + public void whenTrue_thenTrue() { + Assertions.assertTrue(true); + } +} diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/package-info.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/package-info.java new file mode 100644 index 0000000000..53c8ea5e8a --- /dev/null +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/package-info.java @@ -0,0 +1,4 @@ +/** + * Dummy tests - showing Junit Suite functionality + */ +package com.baeldung.testsuite; \ No newline at end of file diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/subpackage/ClassTwoUnitTest.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/subpackage/ClassTwoUnitTest.java new file mode 100644 index 0000000000..bb63fcda63 --- /dev/null +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/subpackage/ClassTwoUnitTest.java @@ -0,0 +1,11 @@ +package com.baeldung.testsuite.subpackage; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ClassTwoUnitTest { + @Test + public void whenTrue_thenTrue() { + Assertions.assertTrue(true); + } +} diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitClassNamePatternsSuite.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitClassNamePatternsSuite.java new file mode 100644 index 0000000000..aa17e26069 --- /dev/null +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitClassNamePatternsSuite.java @@ -0,0 +1,14 @@ +package com.baeldung.testsuite.suites; + +import org.junit.platform.suite.api.ExcludeClassNamePatterns; +import org.junit.platform.suite.api.IncludeClassNamePatterns; +import org.junit.platform.suite.api.SelectPackages; +import org.junit.platform.suite.api.Suite; + +@Suite +@SelectPackages("com.baeldung.testsuite") +@IncludeClassNamePatterns("com.baeldung.testsuite.Class.*UnitTest") +@ExcludeClassNamePatterns("com.baeldung.testsuite.ClassTwoUnitTest") +public class JUnitClassNamePatternsSuite { + // runs ClassOneUnitTest and ClassThreeUnitTest +} \ No newline at end of file diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitExcludePackagesSuite.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitExcludePackagesSuite.java new file mode 100644 index 0000000000..47cd993f8a --- /dev/null +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitExcludePackagesSuite.java @@ -0,0 +1,12 @@ +package com.baeldung.testsuite.suites; + +import org.junit.platform.suite.api.ExcludePackages; +import org.junit.platform.suite.api.SelectPackages; +import org.junit.platform.suite.api.Suite; + +@Suite +@SelectPackages("com.baeldung.testsuite") +@ExcludePackages("com.baeldung.testsuite.subpackage") +public class JUnitExcludePackagesSuite { + // runs ClassOneUnitTest and ClassThreeUnitTest +} \ No newline at end of file diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitRunWithSuite.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitRunWithSuite.java new file mode 100644 index 0000000000..ad098fb305 --- /dev/null +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitRunWithSuite.java @@ -0,0 +1,16 @@ +package com.baeldung.testsuite.suites; + +import com.baeldung.testsuite.ClassOneUnitTest; +import com.baeldung.testsuite.subpackage.ClassTwoUnitTest; +import org.junit.platform.runner.JUnitPlatform; +import org.junit.platform.suite.api.SelectClasses; +import org.junit.platform.suite.api.SuiteDisplayName; +import org.junit.runner.RunWith; + +@RunWith(JUnitPlatform.class) +@SuiteDisplayName("My Test Suite") +@SelectClasses({ClassOneUnitTest.class, ClassTwoUnitTest.class}) +public class JUnitRunWithSuite { + // runs ClassOneUnitTest and ClassTwoUnitTest + // equivalent to JUnitSelectClassesSuite +} \ No newline at end of file diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitSelectClassesSuite.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitSelectClassesSuite.java new file mode 100644 index 0000000000..dc2b78ac53 --- /dev/null +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitSelectClassesSuite.java @@ -0,0 +1,14 @@ +package com.baeldung.testsuite.suites; + +import com.baeldung.testsuite.ClassOneUnitTest; +import com.baeldung.testsuite.subpackage.ClassTwoUnitTest; +import org.junit.platform.suite.api.SelectClasses; +import org.junit.platform.suite.api.Suite; +import org.junit.platform.suite.api.SuiteDisplayName; + +@Suite +@SuiteDisplayName("My Test Suite") +@SelectClasses({ClassOneUnitTest.class, ClassTwoUnitTest.class}) +public class JUnitSelectClassesSuite { + // runs ClassOneUnitTest and ClassTwoUnitTest +} \ No newline at end of file diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitSelectPackagesSuite.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitSelectPackagesSuite.java new file mode 100644 index 0000000000..26562a18d7 --- /dev/null +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitSelectPackagesSuite.java @@ -0,0 +1,10 @@ +package com.baeldung.testsuite.suites; + +import org.junit.platform.suite.api.SelectPackages; +import org.junit.platform.suite.api.Suite; + +@Suite +@SelectPackages({"com.baeldung.testsuite", "com.baeldung.testsuitetwo"}) +public class JUnitSelectPackagesSuite { + // runs ClassOneUnitTest, ClassTwoUnitTest and ClassThreeUnitTest +} \ No newline at end of file diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitTestExcludeTagsSuite.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitTestExcludeTagsSuite.java new file mode 100644 index 0000000000..5ae32fc0b5 --- /dev/null +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitTestExcludeTagsSuite.java @@ -0,0 +1,12 @@ +package com.baeldung.testsuite.suites; + +import org.junit.platform.suite.api.ExcludeTags; +import org.junit.platform.suite.api.SelectPackages; +import org.junit.platform.suite.api.Suite; + +@Suite +@SelectPackages("com.baeldung.testsuite") +@ExcludeTags("slow") +public class JUnitTestExcludeTagsSuite { + // runs ClassOneUnitTest, ClassTwoUnitTest +} \ No newline at end of file diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitTestIncludePackagesSuite.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitTestIncludePackagesSuite.java new file mode 100644 index 0000000000..b5442aff35 --- /dev/null +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitTestIncludePackagesSuite.java @@ -0,0 +1,12 @@ +package com.baeldung.testsuite.suites; + +import org.junit.platform.suite.api.IncludePackages; +import org.junit.platform.suite.api.SelectPackages; +import org.junit.platform.suite.api.Suite; + +@Suite +@SelectPackages("com.baeldung.testsuite") +@IncludePackages("com.baeldung.testsuite.subpackage") +public class JUnitTestIncludePackagesSuite { + // runs ClassTwoUnitTest +} \ No newline at end of file diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitTestIncludeTagsSuite.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitTestIncludeTagsSuite.java new file mode 100644 index 0000000000..1cfce4bd7a --- /dev/null +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitTestIncludeTagsSuite.java @@ -0,0 +1,12 @@ +package com.baeldung.testsuite.suites; + +import org.junit.platform.suite.api.IncludeTags; +import org.junit.platform.suite.api.SelectPackages; +import org.junit.platform.suite.api.Suite; + +@Suite +@SelectPackages("com.baeldung.testsuite") +@IncludeTags("slow") +public class JUnitTestIncludeTagsSuite { + // runs ClassTwoUnitTest +} \ No newline at end of file diff --git a/testing-modules/junit5-annotations/README.md b/testing-modules/junit5-annotations/README.md index 49d596607c..53e409151b 100644 --- a/testing-modules/junit5-annotations/README.md +++ b/testing-modules/junit5-annotations/README.md @@ -9,3 +9,4 @@ This module contains articles about JUnit 5 Annotations - [Guide to JUnit 5 Parameterized Tests](https://www.baeldung.com/parameterized-tests-junit-5) - [Writing Templates for Test Cases Using JUnit 5](https://www.baeldung.com/junit5-test-templates) - [JUnit 5 @Nested Test Classes](https://www.baeldung.com/junit-5-nested-test-classes) +- [A Guide to @Timeout Annotation in JUnit 5](https://www.baeldung.com/java-junit-5-timeout-annotation) diff --git a/testing-modules/selenium-junit-testng/README.md b/testing-modules/selenium-junit-testng/README.md index 65eb269056..ab8024ff45 100644 --- a/testing-modules/selenium-junit-testng/README.md +++ b/testing-modules/selenium-junit-testng/README.md @@ -8,6 +8,7 @@ - [Running Selenium Scripts with JMeter](https://www.baeldung.com/selenium-jmeter) - [Fixing Selenium WebDriver Executable Path Error](https://www.baeldung.com/java-selenium-webdriver-path-error) - [Handle Browser Tabs With Selenium](https://www.baeldung.com/java-handle-browser-tabs-selenium) +- [Implicit Wait vs Explicit Wait in Selenium Webdriver](https://www.baeldung.com/selenium-implicit-explicit-wait) #### Notes: - to run the live tests for the article *Fixing Selenium WebDriver Executable Path Error*, follow the manual setup described diff --git a/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/stale/RobustWebDriver.java b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/stale/RobustWebDriver.java new file mode 100644 index 0000000000..211480dce3 --- /dev/null +++ b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/stale/RobustWebDriver.java @@ -0,0 +1,86 @@ +package com.baeldung.selenium.stale; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +public class RobustWebDriver implements WebDriver { + + private final WebDriver originalWebDriver; + + public RobustWebDriver(WebDriver webDriver) { + this.originalWebDriver = webDriver; + } + + @Override + public void get(String url) { + this.originalWebDriver.get(url); + } + + @Override + public String getCurrentUrl() { + return this.originalWebDriver.getCurrentUrl(); + } + + @Override + public String getTitle() { + return this.originalWebDriver.getTitle(); + } + + @Override + public List findElements(By by) { + return this.originalWebDriver.findElements(by) + .stream().map(e -> new RobustWebElement(e, by, this)) + .collect(Collectors.toList()); + } + + @Override + public WebElement findElement(By by) { + return new RobustWebElement(this.originalWebDriver.findElement(by), by, this); + } + + @Override + public String getPageSource() { + return this.originalWebDriver.getPageSource(); + } + + @Override + public void close() { + this.originalWebDriver.close(); + + } + + @Override + public void quit() { + this.originalWebDriver.quit(); + } + + @Override + public Set getWindowHandles() { + return this.originalWebDriver.getWindowHandles(); + } + + @Override + public String getWindowHandle() { + return this.originalWebDriver.getWindowHandle(); + } + + @Override + public TargetLocator switchTo() { + return this.originalWebDriver.switchTo(); + } + + @Override + public Navigation navigate() { + return this.originalWebDriver.navigate(); + } + + @Override + public Options manage() { + return this.originalWebDriver.manage(); + } +} \ No newline at end of file diff --git a/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/stale/RobustWebElement.java b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/stale/RobustWebElement.java new file mode 100644 index 0000000000..fa65e60349 --- /dev/null +++ b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/stale/RobustWebElement.java @@ -0,0 +1,176 @@ +package com.baeldung.selenium.stale; + +import org.openqa.selenium.By; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.OutputType; +import org.openqa.selenium.Point; +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.StaleElementReferenceException; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; + +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.function.Function; + +public class RobustWebElement implements WebElement { + + private WebElement originalElement; + private final RobustWebDriver driver; + private final By by; + + private static final int MAX_RETRIES = 10; + private static final String SERE = "Element is no longer attached to the DOM"; + + public RobustWebElement(WebElement element, By by, RobustWebDriver driver) { + this.originalElement = element; + this.by = by; + this.driver = driver; + } + + @Override + public void click() { + executeMethodWithRetries(WebElement::click); + } + + @Override + public void submit() { + executeMethodWithRetries(WebElement::submit); + } + + @Override + public void sendKeys(CharSequence... keysToSend) { + executeMethodWithRetriesVoid(WebElement::sendKeys, keysToSend); + } + + @Override + public void clear() { + executeMethodWithRetries(WebElement::clear); + } + + @Override + public String getTagName() { + return executeMethodWithRetries(WebElement::getTagName); + } + + @Override + public String getAttribute(String name) { + return executeMethodWithRetries(WebElement::getAttribute, name); + } + + @Override + public boolean isSelected() { + return executeMethodWithRetries(WebElement::isSelected); + } + + @Override + public boolean isEnabled() { + return executeMethodWithRetries(WebElement::isEnabled); + } + + @Override + public String getText() { + return executeMethodWithRetries(WebElement::getText); + } + + @Override + public List findElements(By by) { + return executeMethodWithRetries(WebElement::findElements, by); + } + + @Override + public WebElement findElement(By by) { + return executeMethodWithRetries(WebElement::findElement, by); + } + + @Override + public boolean isDisplayed() { + return executeMethodWithRetries(WebElement::isDisplayed); + } + + @Override + public Point getLocation() { + return executeMethodWithRetries(WebElement::getLocation); + } + + @Override + public Dimension getSize() { + return executeMethodWithRetries(WebElement::getSize); + } + + @Override + public Rectangle getRect() { + return executeMethodWithRetries(WebElement::getRect); + } + + @Override + public String getCssValue(String propertyName) { + return executeMethodWithRetries(WebElement::getCssValue, propertyName); + } + + + @Override + public X getScreenshotAs(OutputType target) throws WebDriverException { + return executeMethodWithRetries(WebElement::getScreenshotAs, target); + } + + private void executeMethodWithRetries(Consumer method) { + int retries = 0; + while (retries < MAX_RETRIES) { + try { + WebElementUtils.callMethod(originalElement, method); + return; + } catch (StaleElementReferenceException ex) { + refreshElement(); + } + retries++; + } + throw new StaleElementReferenceException(SERE); + } + + private T executeMethodWithRetries(Function method) { + int retries = 0; + while (retries < MAX_RETRIES) { + try { + return WebElementUtils.callMethodWithReturn(originalElement, method); + } catch (StaleElementReferenceException ex) { + refreshElement(); + } + retries++; + } + throw new StaleElementReferenceException(SERE); + } + + private void executeMethodWithRetriesVoid(BiConsumer method, U parameter) { + int retries = 0; + while (retries < MAX_RETRIES) { + try { + WebElementUtils.callMethod(originalElement, method, parameter); + return; + } catch (StaleElementReferenceException ex) { + refreshElement(); + } + retries++; + } + throw new StaleElementReferenceException(SERE); + } + + private T executeMethodWithRetries(BiFunction method, U parameter) { + int retries = 0; + while (retries < MAX_RETRIES) { + try { + return WebElementUtils.callMethodWithReturn(originalElement, method, parameter); + } catch (StaleElementReferenceException ex) { + refreshElement(); + } + retries++; + } + throw new StaleElementReferenceException(SERE); + } + + private void refreshElement() { + this.originalElement = driver.findElement(by); + } +} \ No newline at end of file diff --git a/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/stale/WebElementUtils.java b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/stale/WebElementUtils.java new file mode 100644 index 0000000000..460cc02bf5 --- /dev/null +++ b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/stale/WebElementUtils.java @@ -0,0 +1,30 @@ +package com.baeldung.selenium.stale; + +import org.openqa.selenium.WebElement; + +import java.util.function.BiConsumer; +import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.function.Function; + +public class WebElementUtils { + + private WebElementUtils(){ + } + + public static void callMethod(WebElement element, Consumer method) { + method.accept(element); + } + + public static void callMethod(WebElement element, BiConsumer method, U parameter) { + method.accept(element, parameter); + } + + public static T callMethodWithReturn(WebElement element, Function method) { + return method.apply(element); + } + + public static T callMethodWithReturn(WebElement element, BiFunction method, U parameter) { + return method.apply(element, parameter); + } +} \ No newline at end of file diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/stale/RobustWebElementLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/stale/RobustWebElementLiveTest.java new file mode 100644 index 0000000000..3dea95ca82 --- /dev/null +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/stale/RobustWebElementLiveTest.java @@ -0,0 +1,58 @@ +package com.baeldung.selenium.stale; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; + +import java.time.Duration; + +final class RobustWebElementLiveTest { + + private static RobustWebDriver driver; + private static final int TIMEOUT = 10; + + private static final By LOCATOR_REFRESH = By.xpath("//a[.='click here']"); + private static final By LOCATOR_DYNAMIC_CONTENT = By.xpath( + "(//div[@id='content']//div[@class='large-10 columns'])[1]"); + + private static void setupChromeDriver() { + WebDriverManager.chromedriver().setup(); + final ChromeOptions options = new ChromeOptions(); + options.addArguments("--remote-allow-origins=*"); + driver = new RobustWebDriver(new ChromeDriver(options)); + options(); + } + + private static void options() { + driver.manage().window().maximize(); + driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(TIMEOUT)); + } + + @BeforeEach + public void init() { + setupChromeDriver(); + } + + @Test + void givenDynamicPage_whenRefreshingAndAccessingSavedElement_thenOK() { + driver.navigate().to("https://the-internet.herokuapp.com/dynamic_content?with_content=static"); + final WebElement element = driver.findElement(LOCATOR_DYNAMIC_CONTENT); + + driver.findElement(LOCATOR_REFRESH).click(); + Assertions.assertDoesNotThrow(element::getText); + } + + @AfterEach + void teardown() { + if (driver != null) { + driver.quit(); + driver = null; + } + } +} \ No newline at end of file diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/stale/StaleElementReferenceLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/stale/StaleElementReferenceLiveTest.java new file mode 100644 index 0000000000..9b42571891 --- /dev/null +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/stale/StaleElementReferenceLiveTest.java @@ -0,0 +1,102 @@ +package com.baeldung.selenium.stale; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.StaleElementReferenceException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; + +import java.time.Duration; + +final class StaleElementReferenceLiveTest { + + private static WebDriver driver; + private static final int TIMEOUT = 10; + + private static final By LOCATOR_REFRESH = By.xpath("//a[.='click here']"); + private static final By LOCATOR_DYNAMIC_CONTENT = By.xpath( + "(//div[@id='content']//div[@class='large-10 columns'])[1]"); + + private static void setupChromeDriver() { + WebDriverManager.chromedriver().setup(); + final ChromeOptions options = new ChromeOptions(); + options.addArguments("--remote-allow-origins=*"); + driver = new ChromeDriver(options); + options(); + } + + private static void options() { + driver.manage().window().maximize(); + driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(TIMEOUT)); + } + + @BeforeEach + public void init() { + setupChromeDriver(); + } + + @Test + void givenDynamicPage_whenRefreshingAndAccessingSavedElement_thenSERE() { + driver.navigate().to("https://the-internet.herokuapp.com/dynamic_content?with_content=static"); + final WebElement element = driver.findElement(LOCATOR_DYNAMIC_CONTENT); + + driver.findElement(LOCATOR_REFRESH).click(); + Assertions.assertThrows(StaleElementReferenceException.class, element::getText); + } + + @Test + void givenDynamicPage_whenRefreshingAndAccessingSavedElement_thenHandleSERE() { + driver.navigate().to("https://the-internet.herokuapp.com/dynamic_content?with_content=static"); + final WebElement element = driver.findElement(LOCATOR_DYNAMIC_CONTENT); + + if (!retryingFindClick(LOCATOR_REFRESH)) { + Assertions.fail("Element is still stale after 5 attempts"); + } + Assertions.assertDoesNotThrow(() -> retryingFindGetText(LOCATOR_DYNAMIC_CONTENT)); + } + + private boolean retryingFindClick(By locator) { + boolean result = false; + int attempts = 0; + while (attempts < 5) { + try { + driver.findElement(locator).click(); + result = true; + break; + } catch (StaleElementReferenceException ex) { + System.out.println(ex.getMessage()); + } + attempts++; + } + return result; + } + + private String retryingFindGetText(By locator) { + String result = null; + int attempts = 0; + while (attempts < 5) { + try { + result = driver.findElement(locator).getText(); + break; + } catch (StaleElementReferenceException ex) { + System.out.println(ex.getMessage()); + } + attempts++; + } + return result; + } + + @AfterEach + void teardown() { + if (driver != null) { + driver.quit(); + driver = null; + } + } +} \ No newline at end of file diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/wait/ExplicitWaitLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/wait/ExplicitWaitLiveTest.java new file mode 100644 index 0000000000..65943fbf5e --- /dev/null +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/wait/ExplicitWaitLiveTest.java @@ -0,0 +1,79 @@ +package com.baeldung.selenium.wait; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.ElementNotInteractableException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; + +import java.time.Duration; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +final class ExplicitWaitLiveTest { + + private static WebDriver driver; + private static WebDriverWait wait; + private static final int TIMEOUT = 10; + + private static final By LOCATOR_ABOUT = By.xpath("//a[starts-with(., 'About')]"); + private static final By LOCATOR_ABOUT_BAELDUNG = By.xpath("//h3[normalize-space()='About Baeldung']"); + private static final By LOCATOR_ABOUT_HEADER = By.xpath("//h1"); + + private static void setupChromeDriver() { + WebDriverManager.chromedriver().setup(); + final ChromeOptions options = new ChromeOptions(); + options.addArguments("--remote-allow-origins=*"); + driver = new ChromeDriver(options); + options(); + } + + private static void options() { + driver.manage().window().maximize(); + } + + @BeforeEach + public void init() { + setupChromeDriver(); + wait = new WebDriverWait(driver, Duration.ofSeconds(TIMEOUT)); + } + + @Test + void givenPage_whenNavigatingWithoutExplicitWait_thenElementNotInteractable() { + driver.navigate().to("https://www.baeldung.com/"); + + driver.findElement(LOCATOR_ABOUT).click(); + + assertThrows(ElementNotInteractableException.class, () -> driver.findElement(LOCATOR_ABOUT_BAELDUNG).click()); + } + + @Test + void givenPage_whenNavigatingWithExplicitWait_thenOK() { + final String expected = "About Baeldung"; + driver.navigate().to("https://www.baeldung.com/"); + + driver.findElement(LOCATOR_ABOUT).click(); + wait.until(ExpectedConditions.visibilityOfElementLocated(LOCATOR_ABOUT_BAELDUNG)); + + driver.findElement(LOCATOR_ABOUT_BAELDUNG).click(); + wait.until(ExpectedConditions.visibilityOfElementLocated(LOCATOR_ABOUT_HEADER)); + + final String actual = driver.findElement(LOCATOR_ABOUT_HEADER).getText(); + assertEquals(expected, actual); + } + + @AfterEach + void teardown() { + if (driver != null) { + driver.quit(); + driver = null; + } + } +} \ No newline at end of file diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/wait/FluentWaitLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/wait/FluentWaitLiveTest.java new file mode 100644 index 0000000000..c41e5619ac --- /dev/null +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/wait/FluentWaitLiveTest.java @@ -0,0 +1,83 @@ +package com.baeldung.selenium.wait; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.ElementNotInteractableException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.FluentWait; +import org.openqa.selenium.support.ui.Wait; + +import java.time.Duration; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +final class FluentWaitLiveTest { + + private static WebDriver driver; + private static Wait wait; + private static final int TIMEOUT = 10; + private static final int POLL_FREQUENCY = 250; + + private static final By LOCATOR_ABOUT = By.xpath("//a[starts-with(., 'About')]"); + private static final By LOCATOR_ABOUT_BAELDUNG = By.xpath("//h3[normalize-space()='About Baeldung']"); + private static final By LOCATOR_ABOUT_HEADER = By.xpath("//h1"); + + private static void setupChromeDriver() { + WebDriverManager.chromedriver().setup(); + final ChromeOptions options = new ChromeOptions(); + options.addArguments("--remote-allow-origins=*"); + driver = new ChromeDriver(options); + options(); + } + + private static void options() { + driver.manage().window().maximize(); + } + + @BeforeEach + public void init() { + setupChromeDriver(); + wait = new FluentWait<>(driver) + .withTimeout(Duration.ofSeconds(TIMEOUT)) + .pollingEvery(Duration.ofMillis(POLL_FREQUENCY)); + } + + @Test + void givenPage_whenNavigatingWithoutFluentWait_thenElementNotInteractable() { + driver.navigate().to("https://www.baeldung.com/"); + + driver.findElement(LOCATOR_ABOUT).click(); + + assertThrows(ElementNotInteractableException.class, () -> driver.findElement(LOCATOR_ABOUT_BAELDUNG).click()); + } + + @Test + void givenPage_whenNavigatingWithFluentWait_thenOK() { + final String expected = "About Baeldung"; + driver.navigate().to("https://www.baeldung.com/"); + + driver.findElement(LOCATOR_ABOUT).click(); + wait.until(ExpectedConditions.visibilityOfElementLocated(LOCATOR_ABOUT_BAELDUNG)); + + driver.findElement(LOCATOR_ABOUT_BAELDUNG).click(); + wait.until(ExpectedConditions.visibilityOfElementLocated(LOCATOR_ABOUT_HEADER)); + + final String actual = driver.findElement(LOCATOR_ABOUT_HEADER).getText(); + assertEquals(expected, actual); + } + + @AfterEach + void teardown() { + if (driver != null) { + driver.quit(); + driver = null; + } + } +} \ No newline at end of file diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/wait/ImplicitWaitLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/wait/ImplicitWaitLiveTest.java new file mode 100644 index 0000000000..86c401e13a --- /dev/null +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/wait/ImplicitWaitLiveTest.java @@ -0,0 +1,63 @@ +package com.baeldung.selenium.wait; + + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; + +import java.time.Duration; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +final class ImplicitWaitLiveTest { + + private static WebDriver driver; + private static final int TIMEOUT = 10; + + private static final By LOCATOR_ABOUT = By.xpath("//a[starts-with(., 'About')]"); + private static final By LOCATOR_ABOUT_BAELDUNG = By.xpath("//h3[normalize-space()='About Baeldung']"); + private static final By LOCATOR_ABOUT_HEADER = By.xpath("//h1"); + + private static void setupChromeDriver() { + WebDriverManager.chromedriver().setup(); + final ChromeOptions options = new ChromeOptions(); + options.addArguments("--remote-allow-origins=*"); + driver = new ChromeDriver(options); + options(); + } + + private static void options() { + driver.manage().window().maximize(); + driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(TIMEOUT)); + } + + @BeforeEach + public void init() { + setupChromeDriver(); + } + + @Test + void givenPage_whenNavigatingWithImplicitWait_ThenOK() { + final String expected = "About Baeldung"; + driver.navigate().to("https://www.baeldung.com/"); + + driver.findElement(LOCATOR_ABOUT).click(); + driver.findElement(LOCATOR_ABOUT_BAELDUNG).click(); + + final String actual = driver.findElement(LOCATOR_ABOUT_HEADER).getText(); + assertEquals(expected, actual); + } + + @AfterEach + void teardown() { + if (driver != null) { + driver.quit(); + driver = null; + } + } +} \ No newline at end of file