diff --git a/aws-lambda/.gitignore b/aws-lambda/.gitignore new file mode 100644 index 0000000000..9984c2e554 --- /dev/null +++ b/aws-lambda/.gitignore @@ -0,0 +1 @@ +.aws-sam/ diff --git a/aws-lambda/README.md b/aws-lambda/README.md index 759c9dd506..0ae188fc97 100644 --- a/aws-lambda/README.md +++ b/aws-lambda/README.md @@ -6,3 +6,4 @@ This module contains articles about AWS Lambda - [Using AWS Lambda with API Gateway](https://www.baeldung.com/aws-lambda-api-gateway) - [Introduction to AWS Serverless Application Model](https://www.baeldung.com/aws-serverless) - [How to Implement Hibernate in an AWS Lambda Function in Java](https://www.baeldung.com/java-aws-lambda-hibernate) +- [Writing an Enterprise-Grade AWS Lambda in Java](https://www.baeldung.com/java-enterprise-aws-lambda) diff --git a/aws-lambda/pom.xml b/aws-lambda/pom.xml index 5dc275141d..8014a87126 100644 --- a/aws-lambda/pom.xml +++ b/aws-lambda/pom.xml @@ -17,6 +17,7 @@ lambda shipping-tracker/ShippingFunction + todo-reminder/ToDoFunction diff --git a/aws-lambda/todo-reminder/ToDoFunction/pom.xml b/aws-lambda/todo-reminder/ToDoFunction/pom.xml new file mode 100644 index 0000000000..f80cbdf22f --- /dev/null +++ b/aws-lambda/todo-reminder/ToDoFunction/pom.xml @@ -0,0 +1,105 @@ + + 4.0.0 + helloworld + HelloWorld + 1.0 + jar + To Do Application Example. + + 1.8 + 1.8 + + + + + com.amazonaws + aws-lambda-java-core + 1.2.1 + + + com.amazonaws + aws-lambda-java-events + 3.6.0 + + + uk.org.webcompere + lightweight-config + 1.1.0 + + + com.amazonaws + aws-lambda-java-log4j2 + 1.2.0 + + + org.apache.logging.log4j + log4j-slf4j-impl + 2.13.2 + + + io.github.openfeign + feign-core + 11.2 + + + io.github.openfeign + feign-slf4j + 11.2 + + + io.github.openfeign + feign-gson + 11.2 + + + com.google.inject + guice + 5.0.1 + + + junit + junit + 4.13.1 + test + + + uk.org.webcompere + system-stubs-junit4 + 1.2.0 + test + + + org.mockito + mockito-core + 3.3.0 + test + + + org.assertj + assertj-core + 3.19.0 + test + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + + + + package + + shade + + + + + + + diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java new file mode 100644 index 0000000000..b322dabca8 --- /dev/null +++ b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java @@ -0,0 +1,43 @@ +package com.baeldung.lambda.todo; + +import java.io.*; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; + +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; +import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; +import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; +import com.baeldung.lambda.todo.config.ExecutionContext; +import com.baeldung.lambda.todo.service.PostService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Handler for requests to Lambda function. + */ +public class App implements RequestStreamHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(App.class); + + private String environmentName = System.getenv("ENV_NAME"); + private ExecutionContext executionContext = new ExecutionContext(); + + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { + context.getLogger().log("App starting\n"); + context.getLogger().log("Environment: " + + environmentName + "\n"); + + try { + PostService postService = executionContext.getPostService(); + executionContext.getToDoReaderService() + .getOldestToDo() + .ifPresent(postService::makePost); + } catch (Exception e) { + LOGGER.error("Failed: {}", e.getMessage(), e); + } + } +} diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java new file mode 100644 index 0000000000..0521dfe05c --- /dev/null +++ b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java @@ -0,0 +1,8 @@ +package com.baeldung.lambda.todo.api; + +import feign.RequestLine; + +public interface PostApi { + @RequestLine("POST /posts") + void makePost(PostItem item); +} diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java new file mode 100644 index 0000000000..96049e37d4 --- /dev/null +++ b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java @@ -0,0 +1,40 @@ +package com.baeldung.lambda.todo.api; + +public class PostItem { + private String title; + private String body; + private int userId; + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } + + public int getUserId() { + return userId; + } + + public void setUserId(int userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "PostItem{" + + "title='" + title + '\'' + + ", body='" + body + '\'' + + ", userId=" + userId + + '}'; + } +} diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java new file mode 100644 index 0000000000..bf75cd566d --- /dev/null +++ b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java @@ -0,0 +1,10 @@ +package com.baeldung.lambda.todo.api; + +import feign.RequestLine; + +import java.util.List; + +public interface ToDoApi { + @RequestLine("GET /todos") + List getAllTodos(); +} diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java new file mode 100644 index 0000000000..d43b7a947c --- /dev/null +++ b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java @@ -0,0 +1,50 @@ +package com.baeldung.lambda.todo.api; + +public class ToDoItem { + private int userId; + private int id; + private String title; + private boolean completed; + + public int getUserId() { + return userId; + } + + public void setUserId(int userId) { + this.userId = userId; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public boolean isCompleted() { + return completed; + } + + public void setCompleted(boolean completed) { + this.completed = completed; + } + + @Override + public String toString() { + return "ToDoItem{" + + "userId=" + userId + + ", id=" + id + + ", title='" + title + '\'' + + ", completed=" + completed + + '}'; + } +} diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java new file mode 100644 index 0000000000..f919ac4006 --- /dev/null +++ b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java @@ -0,0 +1,50 @@ +package com.baeldung.lambda.todo.config; + +public class Config { + private String toDoEndpoint; + private String postEndpoint; + private String environmentName; + + private Credentials toDoCredentials; + private Credentials postCredentials; + + public String getToDoEndpoint() { + return toDoEndpoint; + } + + public void setToDoEndpoint(String toDoEndpoint) { + this.toDoEndpoint = toDoEndpoint; + } + + public String getPostEndpoint() { + return postEndpoint; + } + + public void setPostEndpoint(String postEndpoint) { + this.postEndpoint = postEndpoint; + } + + public String getEnvironmentName() { + return environmentName; + } + + public void setEnvironmentName(String environmentName) { + this.environmentName = environmentName; + } + + public Credentials getToDoCredentials() { + return toDoCredentials; + } + + public void setToDoCredentials(Credentials toDoCredentials) { + this.toDoCredentials = toDoCredentials; + } + + public Credentials getPostCredentials() { + return postCredentials; + } + + public void setPostCredentials(Credentials postCredentials) { + this.postCredentials = postCredentials; + } +} diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java new file mode 100644 index 0000000000..a11399381c --- /dev/null +++ b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java @@ -0,0 +1,22 @@ +package com.baeldung.lambda.todo.config; + +public class Credentials { + private String username; + private String password; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java new file mode 100644 index 0000000000..b588187abd --- /dev/null +++ b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java @@ -0,0 +1,36 @@ +package com.baeldung.lambda.todo.config; + +import com.baeldung.lambda.todo.service.PostService; +import com.baeldung.lambda.todo.service.ToDoReaderService; +import com.google.inject.Guice; +import com.google.inject.Injector; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ExecutionContext { + private static final Logger LOGGER = + LoggerFactory.getLogger(ExecutionContext.class); + + private ToDoReaderService toDoReaderService; + private PostService postService; + + public ExecutionContext() { + LOGGER.info("Loading configuration"); + + try { + Injector injector = Guice.createInjector(new Services()); + this.toDoReaderService = injector.getInstance(ToDoReaderService.class); + this.postService = injector.getInstance(PostService.class); + } catch (Exception e) { + LOGGER.error("Could not start", e); + } + } + + public ToDoReaderService getToDoReaderService() { + return toDoReaderService; + } + + public PostService getPostService() { + return postService; + } +} diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java new file mode 100644 index 0000000000..c1d85012eb --- /dev/null +++ b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java @@ -0,0 +1,38 @@ +package com.baeldung.lambda.todo.config; + +import com.baeldung.lambda.todo.api.PostApi; +import com.baeldung.lambda.todo.api.ToDoApi; +import com.google.inject.AbstractModule; +import feign.Feign; +import feign.auth.BasicAuthRequestInterceptor; +import feign.gson.GsonDecoder; +import feign.gson.GsonEncoder; +import feign.slf4j.Slf4jLogger; +import uk.org.webcompere.lightweightconfig.ConfigLoader; + +import static feign.Logger.Level.FULL; + +public class Services extends AbstractModule { + @Override + protected void configure() { + Config config = ConfigLoader.loadYmlConfigFromResource("configuration.yml", Config.class); + + ToDoApi toDoApi = Feign.builder() + .decoder(new GsonDecoder()) + .logger(new Slf4jLogger()) + .logLevel(FULL) + .requestInterceptor(new BasicAuthRequestInterceptor(config.getToDoCredentials().getUsername(), config.getToDoCredentials().getPassword())) + .target(ToDoApi.class, config.getToDoEndpoint()); + + PostApi postApi = Feign.builder() + .encoder(new GsonEncoder()) + .logger(new Slf4jLogger()) + .logLevel(FULL) + .requestInterceptor(new BasicAuthRequestInterceptor(config.getPostCredentials().getUsername(), config.getPostCredentials().getPassword())) + .target(PostApi.class, config.getPostEndpoint()); + + bind(Config.class).toInstance(config); + bind(ToDoApi.class).toInstance(toDoApi); + bind(PostApi.class).toInstance(postApi); + } +} diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java new file mode 100644 index 0000000000..bb0a67dbd1 --- /dev/null +++ b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java @@ -0,0 +1,30 @@ +package com.baeldung.lambda.todo.service; + +import com.baeldung.lambda.todo.api.PostApi; +import com.baeldung.lambda.todo.api.PostItem; +import com.baeldung.lambda.todo.api.ToDoItem; +import com.google.inject.Inject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + + +public class PostService { + private static final Logger LOGGER = LogManager.getLogger(PostService.class); + private PostApi postApi; + + @Inject + public PostService(PostApi postApi) { + this.postApi = postApi; + } + + public void makePost(ToDoItem toDoItem) { + LOGGER.info("Posting about: {}", toDoItem); + PostItem item = new PostItem(); + item.setTitle("To Do is Out Of Date: " + toDoItem.getId()); + item.setUserId(toDoItem.getUserId()); + item.setBody("Not done: " + toDoItem.getTitle()); + + LOGGER.info("Post: {}", item); + postApi.makePost(item); + } +} diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java new file mode 100644 index 0000000000..5cd18ff46a --- /dev/null +++ b/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java @@ -0,0 +1,30 @@ +package com.baeldung.lambda.todo.service; + +import com.baeldung.lambda.todo.api.ToDoApi; +import com.baeldung.lambda.todo.api.ToDoItem; +import com.baeldung.lambda.todo.config.Config; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import javax.inject.Inject; +import java.util.Optional; + +public class ToDoReaderService { + // Log4j logger + private static final Logger LOGGER = LogManager.getLogger(ToDoReaderService.class); + + private ToDoApi toDoApi; + + @Inject + public ToDoReaderService(Config configuration, ToDoApi toDoApi) { + LOGGER.info("ToDo Endpoint on: {}", configuration.getToDoEndpoint()); + + this.toDoApi = toDoApi; + } + + public Optional getOldestToDo() { + return toDoApi.getAllTodos().stream() + .filter(item -> !item.isCompleted()) + .findFirst(); + } +} diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/resources/configuration.yml b/aws-lambda/todo-reminder/ToDoFunction/src/main/resources/configuration.yml new file mode 100644 index 0000000000..f67239bc23 --- /dev/null +++ b/aws-lambda/todo-reminder/ToDoFunction/src/main/resources/configuration.yml @@ -0,0 +1,9 @@ +toDoEndpoint: https://jsonplaceholder.typicode.com +postEndpoint: https://jsonplaceholder.typicode.com +environmentName: ${ENV_NAME} +toDoCredentials: + username: baeldung + password: ${TODO_PASSWORD:-password} +postCredentials: + username: baeldung + password: ${POST_PASSWORD:-password} diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/main/resources/log4j2.xml b/aws-lambda/todo-reminder/ToDoFunction/src/main/resources/log4j2.xml new file mode 100644 index 0000000000..b241e5d167 --- /dev/null +++ b/aws-lambda/todo-reminder/ToDoFunction/src/main/resources/log4j2.xml @@ -0,0 +1,15 @@ + + + + + + %d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1} - %m%n + + + + + + + + + diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppTest.java b/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppTest.java new file mode 100644 index 0000000000..cbdc8c22cb --- /dev/null +++ b/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppTest.java @@ -0,0 +1,58 @@ +package com.baeldung.lambda.todo; + +import com.amazonaws.services.lambda.runtime.Context; +import com.baeldung.lambda.todo.config.Config; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Answers; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import uk.org.webcompere.lightweightconfig.ConfigLoader; +import uk.org.webcompere.systemstubs.rules.EnvironmentVariablesRule; +import uk.org.webcompere.systemstubs.stream.input.LinesAltStream; +import uk.org.webcompere.systemstubs.stream.output.NoopStream; + +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.verify; + +@RunWith(MockitoJUnitRunner.class) +public class AppTest { + + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private Context mockContext; + + @Rule + public EnvironmentVariablesRule environmentVariablesRule = new EnvironmentVariablesRule(); + + private InputStream fakeInputStream = new LinesAltStream(); + private OutputStream fakeOutputStream = new NoopStream(); + + @Test + public void whenTheEnvironmentVariableIsSet_thenItIsLogged() throws Exception { + environmentVariablesRule.set("ENV_NAME", "unitTest"); + new App().handleRequest(fakeInputStream, fakeOutputStream, mockContext); + + verify(mockContext.getLogger()) + .log("Environment: unitTest\n"); + } + + @Test + public void givenEnvironmentVariableIsNotSet_thenUseDefault() { + String setting = Optional.ofNullable(System.getenv("SETTING")) + .orElse("default"); + + assertThat(setting).isEqualTo("default"); + } + + @Test + public void givenConfiguration_canLoadIntoPojo() { + environmentVariablesRule.set("ENV_NAME", "unitTest"); + Config config = ConfigLoader.loadYmlConfigFromResource("configuration.yml", Config.class); + assertThat(config.getEnvironmentName()).isEqualTo("unitTest"); + } +} \ No newline at end of file diff --git a/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceTest.java b/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceTest.java new file mode 100644 index 0000000000..634c5257ff --- /dev/null +++ b/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceTest.java @@ -0,0 +1,24 @@ +package com.baeldung.lambda.todo.service; + +import com.baeldung.lambda.todo.config.Config; +import org.junit.Rule; +import org.junit.Test; +import uk.org.webcompere.systemstubs.rules.SystemOutRule; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + +public class ToDoReaderServiceTest { + + @Rule + public SystemOutRule systemOutRule = new SystemOutRule(); + + @Test + public void whenTheServiceStarts_thenItOutputsEndpoint() { + Config config = new Config(); + config.setToDoEndpoint("https://todo-endpoint.com"); + ToDoReaderService service = new ToDoReaderService(config, null); + + assertThat(systemOutRule.getLinesNormalized()) + .contains("ToDo Endpoint on: https://todo-endpoint.com"); + } +} \ No newline at end of file diff --git a/aws-lambda/todo-reminder/template.yaml b/aws-lambda/todo-reminder/template.yaml new file mode 100644 index 0000000000..f32ee392c5 --- /dev/null +++ b/aws-lambda/todo-reminder/template.yaml @@ -0,0 +1,22 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: todo-reminder application + +Parameters: + EnvironmentName: + Type: String + Default: dev + +Resources: + ToDoFunction: + Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction + Properties: + Timeout: 20 + CodeUri: ToDoFunction + Handler: com.baeldung.lambda.todo.App::handleRequest + Runtime: java8 + MemorySize: 512 + Environment: # More info about Env Vars: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#environment-object + Variables: + PARAM1: VALUE + ENV_NAME: !Ref EnvironmentName \ No newline at end of file diff --git a/core-java-modules/core-java-11-2/README.md b/core-java-modules/core-java-11-2/README.md index c87936b07d..ca9a306b82 100644 --- a/core-java-modules/core-java-11-2/README.md +++ b/core-java-modules/core-java-11-2/README.md @@ -7,3 +7,4 @@ This module contains articles about Java 11 core features - [Guide to Java Reflection](http://www.baeldung.com/java-reflection) - [Guide to Java 8’s Collectors](https://www.baeldung.com/java-8-collectors) - [New Features in Java 11](https://www.baeldung.com/java-11-new-features) +- [Getting the Java Version at Runtime](https://www.baeldung.com/get-java-version-runtime) diff --git a/core-java-modules/core-java-9-improvements/src/test/java/com/baeldung/java9/io/conversion/InputStreamToByteArrayUnitTest.java b/core-java-modules/core-java-9-improvements/src/test/java/com/baeldung/java9/io/conversion/InputStreamToByteArrayUnitTest.java index b64709be09..3450ac5627 100644 --- a/core-java-modules/core-java-9-improvements/src/test/java/com/baeldung/java9/io/conversion/InputStreamToByteArrayUnitTest.java +++ b/core-java-modules/core-java-9-improvements/src/test/java/com/baeldung/java9/io/conversion/InputStreamToByteArrayUnitTest.java @@ -15,24 +15,43 @@ public class InputStreamToByteArrayUnitTest { @Test public final void givenUsingPlainJavaOnFixedSizeStream_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException { - final InputStream initialStream = new ByteArrayInputStream(new byte[] { 0, 1, 2 }); - final byte[] targetArray = new byte[initialStream.available()]; - initialStream.read(targetArray); + final InputStream is = new ByteArrayInputStream(new byte[] { 0, 1, 2 }); + final byte[] targetArray = new byte[is.available()]; + + is.read(targetArray); } @Test public final void givenUsingPlainJavaOnUnknownSizeStream_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException { - final InputStream is = new ByteArrayInputStream(new byte[] { 0, 1, 2 }); - + final InputStream is = new ByteArrayInputStream(new byte[] { 0, 1, 2, 3, 4, 5, 6 }); final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + int nRead; - final byte[] data = new byte[1024]; + final byte[] data = new byte[4]; + while ((nRead = is.read(data, 0, data.length)) != -1) { buffer.write(data, 0, nRead); } buffer.flush(); - final byte[] byteArray = buffer.toByteArray(); + final byte[] targetArray = buffer.toByteArray(); + } + + @Test + public final void givenUsingPlainJava9OnUnknownSizeStream_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException { + final InputStream is = new ByteArrayInputStream(new byte[] { 0, 1, 2, 3, 4, 5, 6 }); + final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + + int nRead; + final byte[] data = new byte[4]; + + while ((nRead = is.readNBytes(data, 0, data.length)) != 0) { + System.out.println("here " + nRead); + buffer.write(data, 0, nRead); + } + + buffer.flush(); + final byte[] targetArray = buffer.toByteArray(); } @Test diff --git a/core-java-modules/core-java-9-jigsaw/pom.xml b/core-java-modules/core-java-9-jigsaw/pom.xml index 0797003174..a26a88f4b0 100644 --- a/core-java-modules/core-java-9-jigsaw/pom.xml +++ b/core-java-modules/core-java-9-jigsaw/pom.xml @@ -34,4 +34,4 @@ 1.9 - + \ No newline at end of file diff --git a/core-java-modules/core-java-9-streams/pom.xml b/core-java-modules/core-java-9-streams/pom.xml index e59cc347c7..aeaf2c7f57 100644 --- a/core-java-modules/core-java-9-streams/pom.xml +++ b/core-java-modules/core-java-9-streams/pom.xml @@ -7,7 +7,7 @@ 0.1.0-SNAPSHOT core-java-9-streams jar - + com.baeldung.core-java-modules core-java-modules @@ -25,4 +25,4 @@ - + \ No newline at end of file diff --git a/core-java-modules/core-java-arrays-guides/README.md b/core-java-modules/core-java-arrays-guides/README.md index 7338ff9523..00bb6b53c8 100644 --- a/core-java-modules/core-java-arrays-guides/README.md +++ b/core-java-modules/core-java-arrays-guides/README.md @@ -8,3 +8,4 @@ This module contains complete guides about arrays in Java - [What is \[Ljava.lang.Object;?](https://www.baeldung.com/java-tostring-array) - [Guide to ArrayStoreException](https://www.baeldung.com/java-arraystoreexception) - [Creating a Generic Array in Java](https://www.baeldung.com/java-generic-array) +- [Maximum Size of Java Arrays](https://www.baeldung.com/java-arrays-max-size) diff --git a/core-java-modules/core-java-arrays-guides/src/main/java/com/baeldung/array/MaxSizeArray.java b/core-java-modules/core-java-arrays-guides/src/main/java/com/baeldung/array/MaxSizeArray.java new file mode 100644 index 0000000000..76a6a9290a --- /dev/null +++ b/core-java-modules/core-java-arrays-guides/src/main/java/com/baeldung/array/MaxSizeArray.java @@ -0,0 +1,15 @@ +package com.baeldung.array; + +public class MaxSizeArray { + + public static void main(String... strings) { + for (int i = 2; i >= 0; i--) { + try { + int[] arr = new int[Integer.MAX_VALUE - i]; + System.out.println("Max-Size : "+ arr.length); + } catch (Throwable t) { + t.printStackTrace(); + } + } + } +} diff --git a/core-java-modules/core-java-arrays-guides/src/test/java/com/baeldung/arrays/MaxArrySizeUnitTest.java b/core-java-modules/core-java-arrays-guides/src/test/java/com/baeldung/arrays/MaxArrySizeUnitTest.java new file mode 100644 index 0000000000..ab79e83247 --- /dev/null +++ b/core-java-modules/core-java-arrays-guides/src/test/java/com/baeldung/arrays/MaxArrySizeUnitTest.java @@ -0,0 +1,30 @@ +package com.baeldung.arrays; + +import org.junit.Assert; +import org.junit.Test; + +public class MaxArrySizeUnitTest { + + @Test + public void whenInitialArrayMoreThanMaxSize_thenThrowArray() { + boolean initalized = false; + try { + int[] arr = new int[Integer.MAX_VALUE - 1]; + initalized = true; + } catch (Throwable e) { + Assert.assertTrue(e.getMessage().contains("Requested array size exceeds VM limit")); + } + Assert.assertFalse(initalized); + } + + @Test + public void whenInitialArrayLessThanMaxSize_thenThrowArray() { + int[] arr = null; + try { + arr = new int[Integer.MAX_VALUE - 2]; + } catch (Throwable e) { + Assert.assertTrue(e.getMessage().contains("Java heap space")); + } + } + +} diff --git a/core-java-modules/core-java-exceptions-3/README.md b/core-java-modules/core-java-exceptions-3/README.md index e1372381a8..f79eb41a8b 100644 --- a/core-java-modules/core-java-exceptions-3/README.md +++ b/core-java-modules/core-java-exceptions-3/README.md @@ -8,3 +8,4 @@ - [Localizing Exception Messages in Java](https://www.baeldung.com/java-localize-exception-messages) - [Explanation of ClassCastException in Java](https://www.baeldung.com/java-classcastexception) - [NoSuchFieldError in Java](https://www.baeldung.com/java-nosuchfielderror) +- [IllegalAccessError in Java](https://www.baeldung.com/java-illegalaccesserror) diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/Class1.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/Class1.java new file mode 100644 index 0000000000..d50d2bc5f5 --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/Class1.java @@ -0,0 +1,8 @@ +package com.baeldung.exceptions.illegalaccesserror; + +public class Class1 { + + public void bar() { + System.out.println("SUCCESS"); + } +} diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/Class2.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/Class2.java new file mode 100644 index 0000000000..766ceccb6b --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/Class2.java @@ -0,0 +1,10 @@ +package com.baeldung.exceptions.illegalaccesserror; + +public class Class2 { + + public void foo() { + Class1 c1 = new Class1(); + c1.bar(); + } +} + \ No newline at end of file diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorExample.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorExample.java new file mode 100644 index 0000000000..2cc1abbb1d --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorExample.java @@ -0,0 +1,20 @@ +package com.baeldung.exceptions.illegalaccesserror; + +public class IllegalAccessErrorExample { + + interface Baeldung { + public default void foobar() { + System.out.println("This is a default method."); + } + } + + class Super { + private void foobar() { + System.out.println("SuperClass method foobar"); + } + } + + class MySubClass extends Super implements Baeldung { + + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorSolved.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorSolved.java new file mode 100644 index 0000000000..8f6a4c14a4 --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorSolved.java @@ -0,0 +1,20 @@ +package com.baeldung.exceptions.illegalaccesserror; + +public class IllegalAccessErrorSolved { + + interface BaeldungSolved { + public default void foobar() { + System.out.println("This is a default method."); + } + } + + class SuperSolved { + public void foobar() { + System.out.println("SuperClass method foobar"); + } + } + + class MySubClassSolved extends SuperSolved implements BaeldungSolved { + + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorExampleUnitTest.java b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorExampleUnitTest.java new file mode 100644 index 0000000000..201e782229 --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorExampleUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.exceptions.illegalaccesserror; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class IllegalAccessErrorExampleUnitTest { + + @Test() + public void givenInterfaceDefaultMethOverriddenPrivateAccess_whenInvoked_thenIllegalAccessError() { + Assertions.assertThrows(IllegalAccessError.class, () -> { + new IllegalAccessErrorExample().new MySubClass().foobar(); + }); + } + + @Test() + public void givenClass1Class2_whenSameClassDefintion_thenNoIllegalAccessError() { + Assertions.assertDoesNotThrow(() -> { + new Class2().foo(); + }); + } +} diff --git a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorSolvedUnitTest.java b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorSolvedUnitTest.java new file mode 100644 index 0000000000..ad150334d4 --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorSolvedUnitTest.java @@ -0,0 +1,14 @@ +package com.baeldung.exceptions.illegalaccesserror; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class IllegalAccessErrorSolvedUnitTest { + + @Test() + public void givenInterfaceDefaultMethOverriddenNonPrivateAccess_whenInvoked_thenNoIllegalAccessError() { + Assertions.assertDoesNotThrow(() -> { + new IllegalAccessErrorSolved().new MySubClassSolved().foobar(); + }); + } +} diff --git a/core-java-modules/core-java-io-4/src/main/java/com/baeldung/deserialization/vulnerabilities/BadThing.java b/core-java-modules/core-java-io-4/src/main/java/com/baeldung/deserialization/vulnerabilities/BadThing.java new file mode 100644 index 0000000000..ce13a9c372 --- /dev/null +++ b/core-java-modules/core-java-io-4/src/main/java/com/baeldung/deserialization/vulnerabilities/BadThing.java @@ -0,0 +1,28 @@ +package com.baeldung.deserialization.vulnerabilities; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.lang.reflect.Method; + +public class BadThing implements Serializable { + private static final long serialVersionUID = 0L; + + Object looselyDefinedThing; + String methodName; + + private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { + ois.defaultReadObject(); + try { + Method method = looselyDefinedThing.getClass().getMethod(methodName); + method.invoke(looselyDefinedThing); + } catch (Exception e) { + // handle error... + } + } + + private void writeObject(ObjectOutputStream oos) throws IOException { + oos.defaultWriteObject(); + } +} diff --git a/core-java-modules/core-java-io-4/src/main/java/com/baeldung/deserialization/vulnerabilities/MyCustomAttackObject.java b/core-java-modules/core-java-io-4/src/main/java/com/baeldung/deserialization/vulnerabilities/MyCustomAttackObject.java new file mode 100644 index 0000000000..9b4e2d4b76 --- /dev/null +++ b/core-java-modules/core-java-io-4/src/main/java/com/baeldung/deserialization/vulnerabilities/MyCustomAttackObject.java @@ -0,0 +1,14 @@ +package com.baeldung.deserialization.vulnerabilities; + +import java.io.IOException; +import java.io.Serializable; + +public class MyCustomAttackObject implements Serializable { + public static void methodThatTriggersAttack() { + try { + Runtime.getRuntime().exec("echo \"Oh, no! I've been hacked\""); + } catch (IOException e) { + // handle error... + } + } +} diff --git a/core-java-modules/core-java-io-4/src/test/java/com/baeldung/deserialization/vulnerabilities/BadThingUnitTest.java b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/deserialization/vulnerabilities/BadThingUnitTest.java new file mode 100644 index 0000000000..ea2180d178 --- /dev/null +++ b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/deserialization/vulnerabilities/BadThingUnitTest.java @@ -0,0 +1,40 @@ +package com.baeldung.deserialization.vulnerabilities; + +import org.junit.Test; +import org.junit.jupiter.api.DisplayName; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + +public class BadThingUnitTest { + + @Test + @DisplayName("When a BadThing object is deserialized, then code execution in MyCustomAttackObject is run.") + public void givenABadThingObject_whenItsDeserialized_thenExecutionIsRun() throws Exception { + BadThing bt = new BadThing(); + + bt.looselyDefinedThing = new MyCustomAttackObject(); + bt.methodName = "methodThatTriggersAttack"; + + byte[] serializedObject = serialize(bt); + + try (InputStream bis = new ByteArrayInputStream(serializedObject); + ObjectInputStream ois = new ObjectInputStream(bis)) { + + ois.readObject(); // malicious code is run + } + } + + private static byte[] serialize(Object object) throws Exception { + try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos)) { + + oos.writeObject(object); + oos.flush(); + return bos.toByteArray(); + } + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/pom.xml b/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/pom.xml index 13d0b2d201..774319a067 100644 --- a/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/pom.xml +++ b/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/pom.xml @@ -45,4 +45,4 @@ 1.0 - \ No newline at end of file + diff --git a/core-java-modules/core-java-lang-4/README.md b/core-java-modules/core-java-lang-4/README.md index 8b8dff4bd1..e1023513eb 100644 --- a/core-java-modules/core-java-lang-4/README.md +++ b/core-java-modules/core-java-lang-4/README.md @@ -5,3 +5,4 @@ This module contains articles about core features in the Java language - [The Java final Keyword – Impact on Performance](https://www.baeldung.com/java-final-performance) - [The package-info.java File](https://www.baeldung.com/java-package-info) - [What are Compile-time Constants in Java?](https://www.baeldung.com/java-compile-time-constants) +- [Java Objects.hash() vs Objects.hashCode()](https://www.baeldung.com/java-objects-hash-vs-objects-hashcode) diff --git a/core-java-modules/core-java-lang-oop-patterns/README.md b/core-java-modules/core-java-lang-oop-patterns/README.md index 178a556a96..df68a1413a 100644 --- a/core-java-modules/core-java-lang-oop-patterns/README.md +++ b/core-java-modules/core-java-lang-oop-patterns/README.md @@ -7,3 +7,4 @@ This module contains articles about Object-oriented programming (OOP) patterns i - [Inheritance and Composition (Is-a vs Has-a relationship) in Java](https://www.baeldung.com/java-inheritance-composition) - [Immutable Objects in Java](https://www.baeldung.com/java-immutable-object) - [How to Make a Deep Copy of an Object in Java](https://www.baeldung.com/java-deep-copy) +- [Using an Interface vs. Abstract Class in Java](https://www.baeldung.com/java-interface-vs-abstract-class) diff --git a/core-java-modules/core-java-lang-operators-2/README.md b/core-java-modules/core-java-lang-operators-2/README.md new file mode 100644 index 0000000000..46c874f361 --- /dev/null +++ b/core-java-modules/core-java-lang-operators-2/README.md @@ -0,0 +1,5 @@ +## Core Java Operators + +This module contains articles about Java operators + +## Relevant Articles: diff --git a/core-java-modules/core-java-lang-operators-2/pom.xml b/core-java-modules/core-java-lang-operators-2/pom.xml new file mode 100644 index 0000000000..1e7e659e6d --- /dev/null +++ b/core-java-modules/core-java-lang-operators-2/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + core-java-lang-operators-2 + 0.1.0-SNAPSHOT + core-java-lang-operators-2 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + ../ + + + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + + + core-java-lang-operators-2 + + + src/main/resources + true + + + + + + + 3.10.0 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-lang-operators-2/src/test/java/com/baeldung/oroperators/BitwiseAndLogicalOROperatorUnitTest.java b/core-java-modules/core-java-lang-operators-2/src/test/java/com/baeldung/oroperators/BitwiseAndLogicalOROperatorUnitTest.java new file mode 100644 index 0000000000..c04638991d --- /dev/null +++ b/core-java-modules/core-java-lang-operators-2/src/test/java/com/baeldung/oroperators/BitwiseAndLogicalOROperatorUnitTest.java @@ -0,0 +1,4 @@ +package com.baeldung.oroperators; + +public class BitwiseAndLogicalOROperatorUnitTest { +} diff --git a/core-java-modules/core-java-networking-3/README.md b/core-java-modules/core-java-networking-3/README.md index 09470fe88c..730231525f 100644 --- a/core-java-modules/core-java-networking-3/README.md +++ b/core-java-modules/core-java-networking-3/README.md @@ -5,4 +5,5 @@ This module contains articles about networking in Java ### Relevant Articles - [Finding a Free Port in Java](https://www.baeldung.com/java-free-port) +- [Downloading Email Attachments in Java](https://www.baeldung.com/java-download-email-attachments) - [[<-- Prev]](/core-java-modules/core-java-networking-2) diff --git a/core-java-modules/core-java-networking-3/pom.xml b/core-java-modules/core-java-networking-3/pom.xml index 35e88b3b92..0ad800e173 100644 --- a/core-java-modules/core-java-networking-3/pom.xml +++ b/core-java-modules/core-java-networking-3/pom.xml @@ -36,16 +36,29 @@ ${assertj.version} test + + junit + junit + 4.11 + test + + + com.sun.mail + javax.mail + 1.6.2 + core-java-networking-3 - - - org.apache.maven.plugins - maven-compiler-plugin - - + + + + org.apache.maven.plugins + maven-compiler-plugin + + + diff --git a/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/downloadattachments/DownloadEmailAttachments.java b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/downloadattachments/DownloadEmailAttachments.java new file mode 100644 index 0000000000..4030f3b983 --- /dev/null +++ b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/downloadattachments/DownloadEmailAttachments.java @@ -0,0 +1,112 @@ +package com.baeldung.downloadattachments; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +import javax.mail.Address; +import javax.mail.Folder; +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.Multipart; +import javax.mail.NoSuchProviderException; +import javax.mail.Part; +import javax.mail.Session; +import javax.mail.Store; +import javax.mail.internet.MimeBodyPart; + +public class DownloadEmailAttachments { + private String downloadDirectory; + + public void setSaveDirectory(String dir) { + this.downloadDirectory = dir; + } + + public void downloadEmailAttachments(String host, String port, String userName, String password) throws NoSuchProviderException, MessagingException, IOException { + Properties properties = setMailServerProperties(host, port); + Store store = setSessionStoreProperties(userName, password, properties); + Folder inbox = store.getFolder("INBOX"); + inbox.open(Folder.READ_ONLY); + Message[] arrayMessages = inbox.getMessages(); + for (int i = 0; i < arrayMessages.length; i++) { + Message message = arrayMessages[i]; + Address[] fromAddress = message.getFrom(); + String from = fromAddress[0].toString(); + String subject = message.getSubject(); + String sentDate = message.getSentDate().toString(); + List attachments = new ArrayList(); + if (message.getContentType().contains("multipart")) { + attachments = downloadAttachments(message); + } + + System.out.println("Message #" + (i + 1) + ":"); + System.out.println(" From: " + from); + System.out.println(" Subject: " + subject); + System.out.println(" Sent Date: " + sentDate); + System.out.println(" Attachments: " + attachments); + } + inbox.close(false); + store.close(); + } + + public List downloadAttachments(Message message) throws IOException, MessagingException { + List downloadedAttachments = new ArrayList(); + Multipart multiPart = (Multipart) message.getContent(); + int numberOfParts = multiPart.getCount(); + for (int partCount = 0; partCount < numberOfParts; partCount++) { + MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(partCount); + if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) { + String file = part.getFileName(); + part.saveFile(downloadDirectory + File.separator + part.getFileName()); + downloadedAttachments.add(file); + } + } + + return downloadedAttachments; + } + + public Store setSessionStoreProperties(String userName, String password, Properties properties) throws NoSuchProviderException, MessagingException { + Session session = Session.getDefaultInstance(properties); + + Store store = session.getStore("pop3"); + store.connect(userName, password); + return store; + } + + public Properties setMailServerProperties(String host, String port) { + Properties properties = new Properties(); + + properties.put("mail.pop3.host", host); + properties.put("mail.pop3.port", port); + + properties.setProperty("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); + properties.setProperty("mail.pop3.socketFactory.fallback", "false"); + properties.setProperty("mail.pop3.socketFactory.port", String.valueOf(port)); + return properties; + } + + public static void main(String[] args) { + String host = "pop.gmail.com"; + String port = "995"; + String userName = "your_email"; + String password = "your_password"; + + String saveDirectory = "valid_folder_path"; + + DownloadEmailAttachments receiver = new DownloadEmailAttachments(); + receiver.setSaveDirectory(saveDirectory); + try { + receiver.downloadEmailAttachments(host, port, userName, password); + } catch (NoSuchProviderException ex) { + System.out.println("No provider for pop3."); + ex.printStackTrace(); + } catch (MessagingException ex) { + System.out.println("Could not connect to the message store"); + ex.printStackTrace(); + } catch (IOException ex) { + ex.printStackTrace(); + } + } +} diff --git a/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/downloadattachments/DownloadEmailAttachmentsLiveTest.java b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/downloadattachments/DownloadEmailAttachmentsLiveTest.java new file mode 100644 index 0000000000..050790e6be --- /dev/null +++ b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/downloadattachments/DownloadEmailAttachmentsLiveTest.java @@ -0,0 +1,25 @@ +package com.baeldung.downloadattachments; + +import static org.junit.Assert.fail; +import org.junit.Test; + +public class DownloadEmailAttachmentsLiveTest { + @Test + public void when_Run_then_downloadAttachments() { + + String host = "pop.gmail.com"; + String port = "995"; + String userName = "your_email"; + String password = "your_password"; + + String saveDirectory = "valid_folder_path"; + + DownloadEmailAttachments receiver = new DownloadEmailAttachments(); + receiver.setSaveDirectory(saveDirectory); + try { + receiver.downloadEmailAttachments(host, port, userName, password); + } catch (Exception ex) { + fail("Exception: " + ex); + } + } +} diff --git a/core-java-modules/core-java-reflection-2/README.md b/core-java-modules/core-java-reflection-2/README.md index 3195cddc42..4c888bdf58 100644 --- a/core-java-modules/core-java-reflection-2/README.md +++ b/core-java-modules/core-java-reflection-2/README.md @@ -5,3 +5,4 @@ - [Checking If a Method is Static Using Reflection in Java](https://www.baeldung.com/java-check-method-is-static) - [Checking if a Java Class is ‘abstract’ Using Reflection](https://www.baeldung.com/java-reflection-is-class-abstract) - [Invoking a Private Method in Java](https://www.baeldung.com/java-call-private-method) +- [Finding All Classes in a Java Package](https://www.baeldung.com/java-find-all-classes-in-package) diff --git a/core-java-modules/core-java-reflection-2/pom.xml b/core-java-modules/core-java-reflection-2/pom.xml index 74a7328c16..347f986275 100644 --- a/core-java-modules/core-java-reflection-2/pom.xml +++ b/core-java-modules/core-java-reflection-2/pom.xml @@ -22,6 +22,16 @@ ${spring.version} test + + org.reflections + reflections + 0.9.12 + + + com.google.guava + guava + 30.1.1-jre + diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/AccessingAllClassesInPackage.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/AccessingAllClassesInPackage.java new file mode 100644 index 0000000000..dfbfaca270 --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/AccessingAllClassesInPackage.java @@ -0,0 +1,58 @@ +package com.baeldung.reflection.access.packages; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Set; +import java.util.stream.Collectors; + +import org.reflections.Reflections; +import org.reflections.scanners.SubTypesScanner; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.reflect.ClassPath; + +@SuppressWarnings("rawtypes") +public class AccessingAllClassesInPackage { + + private static final Logger LOG = LoggerFactory.getLogger(AccessingAllClassesInPackage.class); + + public Set findAllClassesUsingClassLoader(String packageName) { + InputStream stream = ClassLoader.getSystemClassLoader() + .getResourceAsStream(packageName.replaceAll("[.]", "/")); + BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); + return reader.lines() + .filter(line -> line.endsWith(".class")) + .map(line -> getClass(line, packageName)) + .collect(Collectors.toSet()); + } + + private Class getClass(String className, String packageName) { + try { + return Class.forName(packageName + "." + className.substring(0, className.lastIndexOf('.'))); + } catch (ClassNotFoundException e) { + LOG.error("<>"); + } + return null; + } + + public Set findAllClassesUsingReflectionsLibrary(String packageName) { + Reflections reflections = new Reflections(packageName, new SubTypesScanner(false)); + return reflections.getSubTypesOf(Object.class) + .stream() + .collect(Collectors.toSet()); + } + + public Set findAllClassesUsingGoogleGuice(String packageName) throws IOException { + return ClassPath.from(ClassLoader.getSystemClassLoader()) + .getAllClasses() + .stream() + .filter(clazz -> clazz.getPackageName() + .equalsIgnoreCase(packageName)) + .map(clazz -> clazz.load()) + .collect(Collectors.toSet()); + } + +} diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/ClassExample.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/ClassExample.java new file mode 100644 index 0000000000..d1ff027770 --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/ClassExample.java @@ -0,0 +1,6 @@ +package com.baeldung.reflection.access.packages.search; + +public class ClassExample { + class NestedClassExample { + } +} diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/InterfaceExample.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/InterfaceExample.java new file mode 100644 index 0000000000..340c552da8 --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/InterfaceExample.java @@ -0,0 +1,4 @@ +package com.baeldung.reflection.access.packages.search; + +public interface InterfaceExample { +} diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/Searchable.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/Searchable.java new file mode 100644 index 0000000000..6f4180a136 --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/Searchable.java @@ -0,0 +1,5 @@ +package com.baeldung.reflection.access.packages.search; + +public @interface Searchable { + +} diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/package-info.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/package-info.java new file mode 100644 index 0000000000..f920000b92 --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/package-info.java @@ -0,0 +1,2 @@ +@Searchable +package com.baeldung.reflection.access.packages.search; \ No newline at end of file diff --git a/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/access/packages/AccessingAllClassesInPackageUnitTest.java b/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/access/packages/AccessingAllClassesInPackageUnitTest.java new file mode 100644 index 0000000000..5bee2c0f3e --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/access/packages/AccessingAllClassesInPackageUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.reflection.access.packages; + +import java.io.IOException; +import java.util.Set; + +import org.junit.Rule; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.rules.ExpectedException; + +@SuppressWarnings("rawtypes") +public class AccessingAllClassesInPackageUnitTest { + @Rule + public final ExpectedException exception = ExpectedException.none(); + + private static final String PACKAGE_NAME = "com.baeldung.reflection.access.packages.search"; + + @Test + public void when_findAllClassesUsingClassLoader_thenSuccess() { + AccessingAllClassesInPackage instance = new AccessingAllClassesInPackage(); + Set classes = instance.findAllClassesUsingClassLoader(PACKAGE_NAME); + Assertions.assertEquals(5, classes.size()); + } + + @Test + public void when_findAllClassesUsingReflectionsLibrary_thenSuccess() { + AccessingAllClassesInPackage instance = new AccessingAllClassesInPackage(); + Set classes = instance.findAllClassesUsingReflectionsLibrary(PACKAGE_NAME); + Assertions.assertEquals(5, classes.size()); + } + + @Test + public void when_findAllClassesUsingGoogleGuice_thenSuccess() throws IOException { + AccessingAllClassesInPackage instance = new AccessingAllClassesInPackage(); + Set classes = instance.findAllClassesUsingGoogleGuice(PACKAGE_NAME); + Assertions.assertEquals(5, classes.size()); + } + +} diff --git a/core-java-modules/core-java-regex/README.md b/core-java-modules/core-java-regex/README.md index 92321fa656..bc28f4b732 100644 --- a/core-java-modules/core-java-regex/README.md +++ b/core-java-modules/core-java-regex/README.md @@ -13,3 +13,4 @@ - [Regular Expressions \s and \s+ in Java](https://www.baeldung.com/java-regex-s-splus) - [Validate Phone Numbers With Java Regex](https://www.baeldung.com/java-regex-validate-phone-numbers) - [How to Count the Number of Matches for a Regex?](https://www.baeldung.com/java-count-regex-matches) +- [Find All Numbers in a String in Java](https://www.baeldung.com/java-find-numbers-in-string) diff --git a/core-java-modules/core-java-regex/src/test/java/com/baeldung/ignore/pattern/metacharacters/IgnoringPatternMetacharactersUnitTest.java b/core-java-modules/core-java-regex/src/test/java/com/baeldung/ignore/pattern/metacharacters/IgnoringPatternMetacharactersUnitTest.java new file mode 100644 index 0000000000..921876c0d5 --- /dev/null +++ b/core-java-modules/core-java-regex/src/test/java/com/baeldung/ignore/pattern/metacharacters/IgnoringPatternMetacharactersUnitTest.java @@ -0,0 +1,54 @@ +package com.baeldung.ignore.pattern.metacharacters; + +import static org.junit.Assert.assertEquals; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.junit.Test; + +public class IgnoringPatternMetacharactersUnitTest { + private static final String dollarAmounts = "$100.25, $100.50, $150.50, $100.50, $100.75"; + private static final String patternStr = "$100.50"; + + @Test + public void givenPatternStringHasMetacharacters_whenPatternMatchedWithoutEscapingMetacharacters_thenNoMatchesFound() { + Pattern pattern = Pattern.compile(patternStr); + Matcher matcher = pattern.matcher(dollarAmounts); + + int matches = 0; + while (matcher.find()) { + matches++; + } + + assertEquals(0, matches); + } + + @Test + public void givenPatternStringHasMetacharacters_whenPatternCompiledUsingManuallyMetaEscapedPattern_thenMatchingSuccessful() { + String metaEscapedPatternStr = "\\Q" + patternStr + "\\E"; + Pattern pattern = Pattern.compile(metaEscapedPatternStr); + Matcher matcher = pattern.matcher(dollarAmounts); + + int matches = 0; + while (matcher.find()) { + matches++; + } + + assertEquals(2, matches); + } + + @Test + public void givenPatternStringHasMetacharacters_whenPatternCompiledUsingLiteralPatternFromQuote_thenMatchingSuccessful() { + String literalPatternStr = Pattern.quote(patternStr); + Pattern pattern = Pattern.compile(literalPatternStr); + Matcher matcher = pattern.matcher(dollarAmounts); + + int matches = 0; + while (matcher.find()) { + matches++; + } + + assertEquals(2, matches); + } +} diff --git a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/countdigits/CountDigitsUnitTest.java b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/countdigits/CountDigitsUnitTest.java new file mode 100644 index 0000000000..e90d2e9f26 --- /dev/null +++ b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/countdigits/CountDigitsUnitTest.java @@ -0,0 +1,77 @@ +package com.baeldung.regex.countdigits; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.junit.jupiter.api.Test; + +import com.google.common.base.CharMatcher; + +/** + * Unit Test to count the number of digits in a String + */ +class CountDigitsUnitTest { + + // Guava CharMatcher to match digits + private static final CharMatcher DIGIT_CHAR_MATCHER = CharMatcher.inRange('0', '9'); + + private static final String STR_WITH_ALL_DIGITS = "970987678607608"; + private static final String STR_WITH_SINGLE_DIGITS_SEP_BY_NON_DIGITS = "9kjl()4f*(&6~3dfd8&5dfd8a"; + private static final String STR_WITH_SEQUENCES_OF_1_OR_MORE_DIGITS_SEP_BY_NON_DIGITS + = "64.6lk.l~453lkdsf9wg038.68*()(k;95786fsd7986"; + + private static int countDigits(String stringToSearch) { + Matcher countEmailMatcher = Pattern.compile("\\d").matcher(stringToSearch); + + int count = 0; + while (countEmailMatcher.find()) { + count++; + } + + return count; + } + + @Test + void givenStrOfAllDigits_whenRegexMatchByDigit_thenFifteenDigitsCounted() { + int count = countDigits(STR_WITH_ALL_DIGITS); + + assertThat(count).isEqualTo(15); + } + + @Test + void givenStrWithSingleDigitsSepByNonDigits_whenRegexMatchByDigit_thenSevenDigitsCounted() { + int count = countDigits(STR_WITH_SINGLE_DIGITS_SEP_BY_NON_DIGITS); + + assertThat(count).isEqualTo(7); + } + + @Test + void givenStrWithOneOrMoreDigitsSepByNonDigits_whenRegexMatchByDigit_thenTwentyOneDigitsCounted() { + int count = countDigits(STR_WITH_SEQUENCES_OF_1_OR_MORE_DIGITS_SEP_BY_NON_DIGITS); + + assertThat(count).isEqualTo(21); + } + + @Test + void givenStrOfAllDigits_whenGuavaCharMatchByDigit_thenFifteenDigitsCounted() { + int count = DIGIT_CHAR_MATCHER.countIn(STR_WITH_ALL_DIGITS); + + assertThat(count).isEqualTo(15); + } + + @Test + void givenStrWithSingleDigitsSepByNonDigits_whenGuavaCharMatchByDigit_thenSevenDigitsCounted() { + int count = DIGIT_CHAR_MATCHER.countIn(STR_WITH_SINGLE_DIGITS_SEP_BY_NON_DIGITS); + + assertThat(count).isEqualTo(7); + } + + @Test + void givenStrWithOneOrMoreDigitsSepByNonDigits_whenGuavaCharMatchByDigit_thenTwentyOneDigitsCounted() { + int count = DIGIT_CHAR_MATCHER.countIn(STR_WITH_SEQUENCES_OF_1_OR_MORE_DIGITS_SEP_BY_NON_DIGITS); + + assertThat(count).isEqualTo(21); + } +} diff --git a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/findnumbers/FindNumbersUnitTest.java b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/findnumbers/FindNumbersUnitTest.java new file mode 100644 index 0000000000..128a326ae2 --- /dev/null +++ b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/findnumbers/FindNumbersUnitTest.java @@ -0,0 +1,128 @@ +package com.baeldung.regex.findnumbers; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.DoubleStream; +import java.util.stream.LongStream; + +import org.junit.jupiter.api.Test; + +/** + * Unit Test to find Integers, Decimal Numbers, and Scientific Notation and Hexadecimal Numbers in a String + */ +class FindNumbersUnitTest { + + private static List findIntegers(String stringToSearch) { + Pattern integerPattern = Pattern.compile("-?\\d+"); + Matcher matcher = integerPattern.matcher(stringToSearch); + + List integerList = new ArrayList<>(); + while (matcher.find()) { + integerList.add(matcher.group()); + } + + return integerList; + } + + private static List findDecimalNums(String stringToSearch) { + Pattern decimalNumPattern = Pattern.compile("-?\\d+(\\.\\d+)?"); + Matcher matcher = decimalNumPattern.matcher(stringToSearch); + + List decimalNumList = new ArrayList<>(); + while (matcher.find()) { + decimalNumList.add(matcher.group()); + } + + return decimalNumList; + } + + @Test + void givenStrOfAllDigits_whenRegexMatchByInt_thenWholeStrMatchedAsOneInt() { + List integersFound = findIntegers("970987678607608"); + + assertThat(integersFound).containsExactly("970987678607608"); + } + + @Test + void givenStrWithIntegersSepByPeriods_whenRegexMatchByInt_thenExpectedIntsFound() { + List integersFound = findIntegers("3453..5.-23532...32432.-2363.3454......345.-34."); + + assertThat(integersFound).containsExactly("3453", "5", "-23532", "32432", "-2363", "3454", "345", "-34"); + } + + @Test + void givenStrWithIntegersSepByNonDigits_whenRegexMatchByInt_thenExpectedIntsFound() { + List integersFound = findIntegers("646lkl~4-53l-k34.fdsf.-ds-35.45f9wg3868*()(k;-95786fsd79-86"); + + assertThat(integersFound).containsExactly("646", "4", "-53", "34", "-35", "45", "9", "3868", "-95786", "79", "-86"); + } + + @Test + void givenStrOfAllDigits_whenRegexMatchByDecNum_thenWholeStrMatchedAsOneDecimalNumber() { + List decimalNumsFound = findDecimalNums("970987678607608"); + + assertThat(decimalNumsFound).containsExactly("970987678607608"); + } + + @Test + void givenStrOfDecNumsSepByNonDigits_whenRegexMatchByDecNum_thenExpectedNumsFound() { + List decimalNumsFound = findDecimalNums(".7854.455wo.rdy(do.g)-3.-553.00.53;good^night%o3456sdcardR%3567.4%£cat"); + + assertThat(decimalNumsFound).containsExactly("7854.455", "-3", "-553.00", "53", "3456", "3567.4"); + } + + @Test + void givenStrWithRandomDigitsDashesAndPeriods_whenRegexMatchByDecNum_thenExpectedNumsFound() { + List decimalNumsFound = findDecimalNums(".-..90834.345.--493-..-85.-875.345-.-.-355.345...345.-.636-5.6-3."); + + assertThat(decimalNumsFound).containsExactly("90834.345", "-493", "-85", "-875.345", "-355.345", "345", "636", "-5.6", "-3"); + } + + @Test + void givenStrOfIntsSepByNonDigits_whenRegexMatchByInt_thenExpectedValuesFound() { + LongStream integerValuesFound = findIntegers(".7854.455wo.rdy(do.g)-3.ght%o34.56") + .stream().mapToLong(Long::valueOf); + + assertThat(integerValuesFound).containsExactly(7854L, 455L, -3L, 34L, 56L); + } + + @Test + void givenStrOfDecNumsSepByNonDigits_whenRegexMatchByDecNum_thenExpectedValuesFound() { + DoubleStream decimalNumValuesFound = findDecimalNums(".7854.455wo.rdy(do.g)-3.ght%o34.56") + .stream().mapToDouble(Double::valueOf); + + assertThat(decimalNumValuesFound).containsExactly(7854.455, -3.0, 34.56); + } + + @Test + void givenStrOfSciNotationNumsSepByNonDigits_whenRegexMatchBySciNotNum_thenExpectedNumsFound() { + String strToSearch = "}s1.25E-3>,/@l2e109he-70.96E+105d£d_-8.7312E-102=#;,.d919.3822e+31e]"; + + Matcher matcher = Pattern.compile("-?\\d+(\\.\\d+)?[eE][+-]?\\d+") + .matcher(strToSearch); + List sciNotationNums = new ArrayList<>(); + while (matcher.find()) { + sciNotationNums.add(matcher.group()); + } + + assertThat(sciNotationNums).containsExactly("1.25E-3", "2e109", "-70.96E+105", "-8.7312E-102", "919.3822e+31"); + } + + @Test + void givenStrOfHexNumsSepByNonDigits_whenRegexMatchByHexNum_thenExpectedNumsFound() { + String strToSearch = "}saF851Bq-3f6Cm>,/@j-2Ad9eE>70ae19.>"; + + Matcher matcher = Pattern.compile("-?[0-9a-fA-F]+") + .matcher(strToSearch); + List hexNums = new ArrayList<>(); + while (matcher.find()) { + hexNums.add(matcher.group()); + } + + assertThat(hexNums).containsExactly("aF851B", "-3f6C", "-2Ad9eE", "70ae19"); + } +} diff --git a/core-java-modules/core-java-security-3/README.md b/core-java-modules/core-java-security-3/README.md new file mode 100644 index 0000000000..970faaac88 --- /dev/null +++ b/core-java-modules/core-java-security-3/README.md @@ -0,0 +1,8 @@ +## Core Java Security + +This module contains articles about core Java Security + +### Relevant Articles: + +- [Secret Key and String Conversion in Java](https://www.baeldung.com/java-secret-key-to-string) +- More articles: [[<-- prev]](/core-java-modules/core-java-security-2) diff --git a/core-java-modules/core-java-security-3/pom.xml b/core-java-modules/core-java-security-3/pom.xml new file mode 100644 index 0000000000..2520cee7f8 --- /dev/null +++ b/core-java-modules/core-java-security-3/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + core-java-security-2 + 0.1.0-SNAPSHOT + core-java-security-2 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + ../ + + + + + commons-codec + commons-codec + ${commons-codec.version} + + + org.bouncycastle + bcprov-jdk15on + ${bouncycastle.version} + + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + + javax.xml.bind + jaxb-api + ${jaxb-api.version} + + + + + + 1.60 + 1.11 + + 3.18.0 + 2.3.1 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-security-3/src/main/java/com/baeldung/secretkeyandstringconversion/ConversionClassUtil.java b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/secretkeyandstringconversion/ConversionClassUtil.java new file mode 100644 index 0000000000..8fdf682666 --- /dev/null +++ b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/secretkeyandstringconversion/ConversionClassUtil.java @@ -0,0 +1,53 @@ +package com.baeldung.secretkeyandstringconversion; + +import java.security.NoSuchAlgorithmException; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.KeySpec; +import java.util.Base64; + +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.PBEKeySpec; +import javax.crypto.spec.SecretKeySpec; + +public class ConversionClassUtil { + + /* Generating Secret key */ + + // Generating Secret Key using KeyGenerator class with 256 + public static SecretKey generateKey(int n) throws NoSuchAlgorithmException { + KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); + keyGenerator.init(n); + SecretKey originalKey = keyGenerator.generateKey(); + return originalKey; + } + + // Generating Secret Key using password and salt + public static SecretKey getKeyFromPassword(String password, String salt) + throws NoSuchAlgorithmException, InvalidKeySpecException { + SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); + KeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), 65536, 256); + SecretKey originalKey = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES"); + return originalKey; + } + + /* Converting Secret key into String */ + public static String convertSecretKeyToString(SecretKey secretKey) throws NoSuchAlgorithmException { + // Converting the Secret Key into byte array + byte[] rawData = secretKey.getEncoded(); + // Getting String - Base64 encoded version of the Secret Key + String encodedKey = Base64.getEncoder().encodeToString(rawData); + return encodedKey; + } + + /* Converting String into Secret key into */ + public static SecretKey convertStringToSecretKeyto(String encodedKey) { + // Decoding the Base64 encoded string into byte array + byte[] decodedKey = Base64.getDecoder().decode(encodedKey); + // Rebuilding the Secret Key using SecretKeySpec Class + SecretKey originalKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES"); + return originalKey; + } + +} diff --git a/core-java-modules/core-java-security-3/src/test/java/com/baeldung/secretkeyandstringconversion/ConversionClassUtilUnitTest.java b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/secretkeyandstringconversion/ConversionClassUtilUnitTest.java new file mode 100644 index 0000000000..7a912dbf26 --- /dev/null +++ b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/secretkeyandstringconversion/ConversionClassUtilUnitTest.java @@ -0,0 +1,44 @@ +package com.baeldung.secretkeyandstringconversion; + +import java.security.NoSuchAlgorithmException; +import java.security.spec.InvalidKeySpecException; + +import javax.crypto.SecretKey; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ConversionClassUtilUnitTest { + + @Test + void givenPasswordAndSalt_whenCreateSecreKeyCheckConversion_thenSuccess() + throws NoSuchAlgorithmException, InvalidKeySpecException { + // given + String password = "Baeldung@2021"; + String salt = "@$#baelDunG@#^$*"; + + // when + SecretKey encodedKey = ConversionClassUtil.getKeyFromPassword(password, salt); + String encodedString = ConversionClassUtil.convertSecretKeyToString(encodedKey); + SecretKey decodeKey = ConversionClassUtil.convertStringToSecretKeyto(encodedString); + + // then + Assertions.assertEquals(encodedKey, decodeKey); + } + + @Test + void givenSize_whenCreateSecreKeyCheckConversion_thenSuccess() + throws NoSuchAlgorithmException, InvalidKeySpecException { + // given + int size = 256; + + // when + SecretKey encodedKey = ConversionClassUtil.generateKey(size); + String encodedString = ConversionClassUtil.convertSecretKeyToString(encodedKey); + SecretKey decodeKey = ConversionClassUtil.convertStringToSecretKeyto(encodedString); + + // then + Assertions.assertEquals(encodedKey, decodeKey); + } + +} diff --git a/core-java-modules/core-java-streams-3/README.md b/core-java-modules/core-java-streams-3/README.md index 26b4dfe975..48ebf145d2 100644 --- a/core-java-modules/core-java-streams-3/README.md +++ b/core-java-modules/core-java-streams-3/README.md @@ -12,4 +12,5 @@ This module contains articles about the Stream API in Java. - [Should We Close a Java Stream?](https://www.baeldung.com/java-stream-close) - [Returning Stream vs. Collection](https://www.baeldung.com/java-return-stream-collection) - [Convert a Java Enumeration Into a Stream](https://www.baeldung.com/java-enumeration-to-stream) +- [When to Use a Parallel Stream in Java](https://www.baeldung.com/java-when-to-use-parallel-stream) - More articles: [[<-- prev>]](/../core-java-streams-2) diff --git a/core-java-modules/core-java-streams-3/pom.xml b/core-java-modules/core-java-streams-3/pom.xml index 659f1937f2..01b83f229a 100644 --- a/core-java-modules/core-java-streams-3/pom.xml +++ b/core-java-modules/core-java-streams-3/pom.xml @@ -27,6 +27,17 @@ ${lombok.version} provided + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + test + org.assertj @@ -44,11 +55,30 @@ true + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + + + + + + 1.18.20 3.6.1 + 1.29 \ No newline at end of file diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/BenchmarkRunner.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/BenchmarkRunner.java new file mode 100644 index 0000000000..461d728ad0 --- /dev/null +++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/BenchmarkRunner.java @@ -0,0 +1,9 @@ +package com.baeldung.streams.parallel; + +public class BenchmarkRunner { + + public static void main(String[] args) throws Exception { + org.openjdk.jmh.Main.main(args); + } + +} diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/DifferentSourceSplitting.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/DifferentSourceSplitting.java new file mode 100644 index 0000000000..9ad569df30 --- /dev/null +++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/DifferentSourceSplitting.java @@ -0,0 +1,54 @@ +package com.baeldung.streams.parallel; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.IntStream; + +public class DifferentSourceSplitting { + + private static final List arrayListOfNumbers = new ArrayList<>(); + private static final List linkedListOfNumbers = new LinkedList<>(); + + static { + IntStream.rangeClosed(1, 1_000_000).forEach(i -> { + arrayListOfNumbers.add(i); + linkedListOfNumbers.add(i); + }); + } + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + public static void differentSourceArrayListSequential() { + arrayListOfNumbers.stream().reduce(0, Integer::sum); + } + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + public static void differentSourceArrayListParallel() { + arrayListOfNumbers.parallelStream().reduce(0, Integer::sum); + } + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + public static void differentSourceLinkedListSequential() { + linkedListOfNumbers.stream().reduce(0, Integer::sum); + } + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + public static void differentSourceLinkedListParallel() { + linkedListOfNumbers.parallelStream().reduce(0, Integer::sum); + } + +} diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MemoryLocalityCosts.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MemoryLocalityCosts.java new file mode 100644 index 0000000000..bc5cbf491b --- /dev/null +++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MemoryLocalityCosts.java @@ -0,0 +1,52 @@ +package com.baeldung.streams.parallel; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; + +import java.util.Arrays; +import java.util.concurrent.TimeUnit; +import java.util.stream.IntStream; + +public class MemoryLocalityCosts { + + private static final int[] intArray = new int[1_000_000]; + private static final Integer[] integerArray = new Integer[1_000_000]; + + static { + IntStream.rangeClosed(1, 1_000_000).forEach(i -> { + intArray[i-1] = i; + integerArray[i-1] = i; + }); + } + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + public static void localityIntArraySequential() { + Arrays.stream(intArray).reduce(0, Integer::sum); + } + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + public static void localityIntArrayParallel() { + Arrays.stream(intArray).parallel().reduce(0, Integer::sum); + } + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + public static void localityIntegerArraySequential() { + Arrays.stream(integerArray).reduce(0, Integer::sum); + } + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + public static void localityIntegerArrayParallel() { + Arrays.stream(integerArray).parallel().reduce(0, Integer::sum); + } + +} diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MergingCosts.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MergingCosts.java new file mode 100644 index 0000000000..a9919dbe72 --- /dev/null +++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MergingCosts.java @@ -0,0 +1,52 @@ +package com.baeldung.streams.parallel; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class MergingCosts { + + private static final List arrayListOfNumbers = new ArrayList<>(); + + static { + IntStream.rangeClosed(1, 1_000_000).forEach(i -> { + arrayListOfNumbers.add(i); + }); + } + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + public static void mergingCostsSumSequential() { + arrayListOfNumbers.stream().reduce(0, Integer::sum); + } + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + public static void mergingCostsSumParallel() { + arrayListOfNumbers.stream().parallel().reduce(0, Integer::sum); + } + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + public static void mergingCostsGroupingSequential() { + arrayListOfNumbers.stream().collect(Collectors.toSet()); + } + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + public static void mergingCostsGroupingParallel() { + arrayListOfNumbers.stream().parallel().collect(Collectors.toSet()); + } + +} diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/ParallelStream.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/ParallelStream.java new file mode 100644 index 0000000000..f236f418e8 --- /dev/null +++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/ParallelStream.java @@ -0,0 +1,15 @@ +package com.baeldung.streams.parallel; + +import java.util.Arrays; +import java.util.List; + +public class ParallelStream { + + public static void main(String[] args) { + List listOfNumbers = Arrays.asList(1, 2, 3, 4); + listOfNumbers.parallelStream().forEach(number -> + System.out.println(number + " " + Thread.currentThread().getName()) + ); + } + +} diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SequentialStream.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SequentialStream.java new file mode 100644 index 0000000000..01379130fa --- /dev/null +++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SequentialStream.java @@ -0,0 +1,15 @@ +package com.baeldung.streams.parallel; + +import java.util.Arrays; +import java.util.List; + +public class SequentialStream { + + public static void main(String[] args) { + List listOfNumbers = Arrays.asList(1, 2, 3, 4); + listOfNumbers.stream().forEach(number -> + System.out.println(number + " " + Thread.currentThread().getName()) + ); + } + +} diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SplittingCosts.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SplittingCosts.java new file mode 100644 index 0000000000..d1e878df1f --- /dev/null +++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SplittingCosts.java @@ -0,0 +1,27 @@ +package com.baeldung.streams.parallel; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; + +import java.util.concurrent.TimeUnit; +import java.util.stream.IntStream; + +public class SplittingCosts { + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + public static void sourceSplittingIntStreamSequential() { + IntStream.rangeClosed(1, 100).reduce(0, Integer::sum); + } + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + public static void sourceSplittingIntStreamParallel() { + IntStream.rangeClosed(1, 100).parallel().reduce(0, Integer::sum); + } + +} diff --git a/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/parallel/ForkJoinUnitTest.java b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/parallel/ForkJoinUnitTest.java new file mode 100644 index 0000000000..f9aab8ed6c --- /dev/null +++ b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/parallel/ForkJoinUnitTest.java @@ -0,0 +1,46 @@ +package com.baeldung.streams.parallel; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ForkJoinPool; + +import static org.assertj.core.api.Assertions.assertThat; + +class ForkJoinUnitTest { + + @Test + void givenSequentialStreamOfNumbers_whenReducingSumWithIdentityFive_thenResultIsCorrect() { + List listOfNumbers = Arrays.asList(1, 2, 3, 4); + int sum = listOfNumbers.stream().reduce(5, Integer::sum); + assertThat(sum).isEqualTo(15); + } + + @Test + void givenParallelStreamOfNumbers_whenReducingSumWithIdentityFive_thenResultIsNotCorrect() { + List listOfNumbers = Arrays.asList(1, 2, 3, 4); + int sum = listOfNumbers.parallelStream().reduce(5, Integer::sum); + assertThat(sum).isNotEqualTo(15); + } + + @Test + void givenParallelStreamOfNumbers_whenReducingSumWithIdentityZero_thenResultIsCorrect() { + List listOfNumbers = Arrays.asList(1, 2, 3, 4); + int sum = listOfNumbers.parallelStream().reduce(0, Integer::sum) + 5; + assertThat(sum).isEqualTo(15); + } + + @Test + public void givenParallelStreamOfNumbers_whenUsingCustomThreadPool_thenResultIsCorrect() + throws InterruptedException, ExecutionException { + List listOfNumbers = Arrays.asList(1, 2, 3, 4); + ForkJoinPool customThreadPool = new ForkJoinPool(4); + int sum = customThreadPool.submit( + () -> listOfNumbers.parallelStream().reduce(0, Integer::sum)).get(); + customThreadPool.shutdown(); + assertThat(sum).isEqualTo(10); + } + +} diff --git a/core-java-modules/core-java-string-conversions-2/README.md b/core-java-modules/core-java-string-conversions-2/README.md index afdd7e5760..3bd3ba927e 100644 --- a/core-java-modules/core-java-string-conversions-2/README.md +++ b/core-java-modules/core-java-string-conversions-2/README.md @@ -6,4 +6,5 @@ This module contains articles about string conversions from/to another type. - [Java String Conversions](https://www.baeldung.com/java-string-conversions) - [Convert String to Byte Array and Reverse in Java](https://www.baeldung.com/java-string-to-byte-array) - [Convert Character Array to String in Java](https://www.baeldung.com/java-char-array-to-string) +- [Converting String to BigDecimal in Java](https://www.baeldung.com/java-string-to-bigdecimal) - More articles: [[<-- prev]](/core-java-string-conversions) diff --git a/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/stringtobigdecimal/StringToBigDecimalConversionUnitTest.java b/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/stringtobigdecimal/StringToBigDecimalConversionUnitTest.java new file mode 100644 index 0000000000..cd8ef6c70f --- /dev/null +++ b/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/stringtobigdecimal/StringToBigDecimalConversionUnitTest.java @@ -0,0 +1,74 @@ +package com.baeldung.stringtobigdecimal; + +import static org.junit.Assert.assertEquals; + +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.text.ParseException; + +import org.junit.Test; + +public class StringToBigDecimalConversionUnitTest { + + @Test + public void givenValidString_WhenBigDecimalObjectWithStringParameter_ThenResultIsDecimalObject() { + BigDecimal bigDecimal = new BigDecimal("123"); + assertEquals(new BigDecimal(123), bigDecimal); + } + + @Test(expected = NullPointerException.class) + public void givenNullString_WhenBigDecimalObjectWithStringParameter_ThenNullPointerExceptionIsThrown() { + String bigDecimal = null; + new BigDecimal(bigDecimal); + } + + @Test(expected = NumberFormatException.class) + public void givenInalidString_WhenBigDecimalObjectWithStringParameter_ThenNumberFormatExceptionIsThrown() { + new BigDecimal("&"); + } + + @Test + public void givenValidString_WhenValueOfDoubleFromString_ThenResultIsDecimalObject() { + BigDecimal bigDecimal = BigDecimal.valueOf(Double.valueOf("123.42")); + assertEquals(new BigDecimal(123.42).setScale(2, BigDecimal.ROUND_HALF_UP), bigDecimal); + } + + @Test(expected = NullPointerException.class) + public void givenNullString_WhenValueOfDoubleFromString_ThenNullPointerExceptionIsThrown() { + BigDecimal.valueOf(Double.valueOf(null)); + } + + @Test(expected = NumberFormatException.class) + public void givenInalidString_WhenValueOfDoubleFromString_ThenNumberFormatExceptionIsThrown() { + BigDecimal.valueOf(Double.valueOf("&")); + } + + @Test + public void givenValidString_WhenDecimalFormatOfString_ThenResultIsDecimalObject() throws ParseException { + BigDecimal bigDecimal = new BigDecimal(10692467440017.111).setScale(3, BigDecimal.ROUND_HALF_UP); + + DecimalFormatSymbols symbols = new DecimalFormatSymbols(); + symbols.setGroupingSeparator(','); + symbols.setDecimalSeparator('.'); + String pattern = "#,##0.0#"; + DecimalFormat decimalFormat = new DecimalFormat(pattern, symbols); + decimalFormat.setParseBigDecimal(true); + + // parse the string value + BigDecimal parsedStringValue = (BigDecimal) decimalFormat.parse("10,692,467,440,017.111"); + + assertEquals(bigDecimal, parsedStringValue); + } + + @Test(expected = NullPointerException.class) + public void givenNullString_WhenDecimalFormatOfString_ThenNullPointerExceptionIsThrown() throws ParseException { + new DecimalFormat("#").parse(null); + } + + @Test(expected = ParseException.class) + public void givenInalidString_WhenDecimalFormatOfString_ThenNumberFormatExceptionIsThrown() throws ParseException { + new DecimalFormat("#").parse("&"); + } + +} diff --git a/core-java-modules/core-java-string-operations-3/README.md b/core-java-modules/core-java-string-operations-3/README.md index bc4af852ed..ad4ada3a68 100644 --- a/core-java-modules/core-java-string-operations-3/README.md +++ b/core-java-modules/core-java-string-operations-3/README.md @@ -3,3 +3,4 @@ - [Version Comparison in Java](https://www.baeldung.com/java-comparing-versions) - [Java (String) or .toString()?](https://www.baeldung.com/java-string-casting-vs-tostring) - [Split Java String by Newline](https://www.baeldung.com/java-string-split-by-newline) +- [Split a String in Java and Keep the Delimiters](https://www.baeldung.com/java-split-string-keep-delimiters) diff --git a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/splitkeepdelimiters/SplitAndKeepDelimitersUnitTest.java b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/splitkeepdelimiters/SplitAndKeepDelimitersUnitTest.java new file mode 100644 index 0000000000..ede8be4c05 --- /dev/null +++ b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/splitkeepdelimiters/SplitAndKeepDelimitersUnitTest.java @@ -0,0 +1,59 @@ +package com.baeldung.splitkeepdelimiters; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.Test; + +import com.google.common.base.Splitter; + +public class SplitAndKeepDelimitersUnitTest { + + private final String positivelookAheadRegex = "((?=@))"; + private final String positivelookBehindRegex = "((?<=@))"; + private final String positivelookAroundRegex = "((?=@)|(?<=@))"; + private final String positiveLookAroundMultiDelimiterRegex = "((?=:|#|@)|(?<=:|#|@))"; + + private String text = "Hello@World@This@Is@A@Java@Program"; + private String textMixed = "@HelloWorld@This:Is@A#Java#Program"; + private String textMixed2 = "pg@no;10@hello;world@this;is@a#10words;Java#Program"; + + @Test + public void givenString_splitAndKeepDelimiters_using_javaLangString() { + + assertThat(text.split(positivelookAheadRegex)).containsExactly("Hello", "@World", "@This", "@Is", "@A", "@Java", "@Program"); + + assertThat(text.split(positivelookBehindRegex)).containsExactly("Hello@", "World@", "This@", "Is@", "A@", "Java@", "Program"); + + assertThat(text.split(positivelookAroundRegex)).containsExactly("Hello", "@", "World", "@", "This", "@", "Is", "@", "A", "@", "Java", "@", "Program"); + + assertThat(textMixed.split(positiveLookAroundMultiDelimiterRegex)).containsExactly("@", "HelloWorld", "@", "This", ":", "Is", "@", "A", "#", "Java", "#", "Program"); + + } + + @Test + public void givenString_splitAndKeepDelimiters_using_ApacheCommonsLang3StringUtils() { + + assertThat(StringUtils.splitByCharacterType(textMixed2)).containsExactly("pg", "@", "no", ";", "10", "@", "hello", ";", "world", "@", "this", ";", "is", "@", "a", "#", "10", "words", ";", "J", "ava", "#", "P", "rogram"); + + } + + @Test + public void givenString_splitAndKeepDelimiters_using_GuavaSplitter() { + + assertThat(Splitter.onPattern(positivelookAroundRegex) + .splitToList(text)).containsExactly("Hello", "@", "World", "@", "This", "@", "Is", "@", "A", "@", "Java", "@", "Program"); + + assertThat(Splitter.on(Pattern.compile(positivelookAroundRegex)) + .splitToList(text)).containsExactly("Hello", "@", "World", "@", "This", "@", "Is", "@", "A", "@", "Java", "@", "Program"); + + assertThat(Splitter.onPattern(positiveLookAroundMultiDelimiterRegex) + .splitToList(textMixed)).containsExactly("@", "HelloWorld", "@", "This", ":", "Is", "@", "A", "#", "Java", "#", "Program"); + + assertThat(Splitter.on(Pattern.compile(positiveLookAroundMultiDelimiterRegex)) + .splitToList(textMixed)).containsExactly("@", "HelloWorld", "@", "This", ":", "Is", "@", "A", "#", "Java", "#", "Program"); + + } +} diff --git a/core-java-modules/core-java-strings/pom.xml b/core-java-modules/core-java-strings/pom.xml index 137499de6b..aca0bb3346 100644 --- a/core-java-modules/core-java-strings/pom.xml +++ b/core-java-modules/core-java-strings/pom.xml @@ -57,6 +57,7 @@ 3.6.1 61.1 + 15 \ No newline at end of file diff --git a/core-java-modules/core-java-strings/src/main/java/com/baeldung/multiline/MultiLineString.java b/core-java-modules/core-java-strings/src/main/java/com/baeldung/multiline/MultiLineString.java index 987bc751cd..5d333799c4 100644 --- a/core-java-modules/core-java-strings/src/main/java/com/baeldung/multiline/MultiLineString.java +++ b/core-java-modules/core-java-strings/src/main/java/com/baeldung/multiline/MultiLineString.java @@ -64,4 +64,11 @@ public class MultiLineString { return new String(Files.readAllBytes(Paths.get("src/main/resources/stephenking.txt"))); } + public String textBlocks() { + return """ + Get busy living + or + get busy dying. + --Stephen King"""; + } } diff --git a/core-java-modules/core-java-strings/src/test/java/com/baeldung/multiline/MultiLineStringUnitTest.java b/core-java-modules/core-java-strings/src/test/java/com/baeldung/multiline/MultiLineStringUnitTest.java index 04d318c71b..66bc0a655b 100644 --- a/core-java-modules/core-java-strings/src/test/java/com/baeldung/multiline/MultiLineStringUnitTest.java +++ b/core-java-modules/core-java-strings/src/test/java/com/baeldung/multiline/MultiLineStringUnitTest.java @@ -16,6 +16,7 @@ public class MultiLineStringUnitTest { assertEquals(ms.stringJoin(), ms.stringBuilder()); assertEquals(ms.stringBuilder(), ms.guavaJoiner()); assertEquals(ms.guavaJoiner(), ms.loadFromFile()); + assertEquals(ms.loadFromFile(), ms.textBlocks()); } } diff --git a/core-java-modules/core-java/README.md b/core-java-modules/core-java/README.md index b0e740e3b5..14857d5d87 100644 --- a/core-java-modules/core-java/README.md +++ b/core-java-modules/core-java/README.md @@ -11,3 +11,4 @@ - [What is the serialVersionUID?](http://www.baeldung.com/java-serial-version-uid) - [A Guide to the ResourceBundle](http://www.baeldung.com/java-resourcebundle) - [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties) +- [Deserialization Vulnerabilities in Java](https://www.baeldung.com/java-deserialization-vulnerabilities) diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index b4aae7949f..b801d44a08 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -86,6 +86,7 @@ core-java-lang-oop-methods core-java-lang-oop-others core-java-lang-operators + core-java-lang-operators-2 core-java-lang-syntax core-java-lang-syntax-2 core-java-networking @@ -111,7 +112,6 @@ core-java-string-operations core-java-string-operations-2 core-java-string-operations-3 - core-java-strings core-java-sun core-java-regex pre-jpms diff --git a/gradle/.gitignore b/gradle/.gitignore index da88288c09..01d29dfced 100644 --- a/gradle/.gitignore +++ b/gradle/.gitignore @@ -1 +1,7 @@ /.gradle/ + +**/build/** +/build/ + +# exclude jar for gradle wrapper +!**/gradle/wrapper/*.jar diff --git a/gradle/gradle-cucumber/README.md b/gradle/gradle-cucumber/README.md new file mode 100644 index 0000000000..a92593e959 --- /dev/null +++ b/gradle/gradle-cucumber/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Using Cucumber with Gradle](https://www.baeldung.com/java-cucumber-gradle) diff --git a/gradle/gradle-cucumber/build.gradle b/gradle/gradle-cucumber/build.gradle new file mode 100644 index 0000000000..e643e680c3 --- /dev/null +++ b/gradle/gradle-cucumber/build.gradle @@ -0,0 +1,68 @@ +import org.gradle.api.tasks.testing.logging.TestLogEvent + +plugins { + id 'java' + id 'se.thinkcode.cucumber-runner' version '0.0.8' +} + +ext { + junitVersion = '5.7.2' + cucumberVersion = '6.10.4' +} + +group 'com.baeldung' +version '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +java { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 +} + +dependencies { + testImplementation "org.junit.jupiter:junit-jupiter-api:${junitVersion}" + testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${junitVersion}" + + testImplementation "io.cucumber:cucumber-java:${cucumberVersion}" + + testImplementation "io.cucumber:cucumber-junit:${cucumberVersion}" + testImplementation "org.junit.vintage:junit-vintage-engine:${junitVersion}" +} + +configurations { + cucumberRuntime { + extendsFrom testImplementation + } +} + +task cucumberCli() { + dependsOn assemble, testClasses + doLast { + javaexec { + main = "io.cucumber.core.cli.Main" + classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output + args = [ + '--plugin', 'pretty', + '--plugin', 'html:target/cucumber-report.html', + '--glue', 'com.baeldung.cucumber', + 'src/test/resources'] + } + } +} + +cucumber { + main = 'io.cucumber.core.cli.Main' +} + +test { + useJUnitPlatform() + + testLogging { + events TestLogEvent.FAILED, TestLogEvent.PASSED, TestLogEvent.SKIPPED + } + + systemProperties(project.gradle.startParameter.systemPropertiesArgs) +} diff --git a/gradle/gradle-cucumber/gradle/wrapper/gradle-wrapper.jar b/gradle/gradle-cucumber/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000..e708b1c023 Binary files /dev/null and b/gradle/gradle-cucumber/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/gradle-cucumber/gradle/wrapper/gradle-wrapper.properties b/gradle/gradle-cucumber/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..da9702f9e7 --- /dev/null +++ b/gradle/gradle-cucumber/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradle/gradle-cucumber/gradlew b/gradle/gradle-cucumber/gradlew new file mode 100755 index 0000000000..4f906e0c81 --- /dev/null +++ b/gradle/gradle-cucumber/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or 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 UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$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 "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# 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 + ;; + 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" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradle/gradle-cucumber/gradlew.bat b/gradle/gradle-cucumber/gradlew.bat new file mode 100644 index 0000000000..ac1b06f938 --- /dev/null +++ b/gradle/gradle-cucumber/gradlew.bat @@ -0,0 +1,89 @@ +@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%" == "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%"=="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! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/gradle/gradle-cucumber/settings.gradle b/gradle/gradle-cucumber/settings.gradle new file mode 100644 index 0000000000..9b3cf0ebc7 --- /dev/null +++ b/gradle/gradle-cucumber/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'gradle-cucumber' diff --git a/gradle/gradle-cucumber/src/main/java/com/baeldung/Account.java b/gradle/gradle-cucumber/src/main/java/com/baeldung/Account.java new file mode 100644 index 0000000000..48f1b031a2 --- /dev/null +++ b/gradle/gradle-cucumber/src/main/java/com/baeldung/Account.java @@ -0,0 +1,18 @@ +package com.baeldung; + +public class Account { + + private Double balance; + + public Account(Double initialBalance) { + this.balance = initialBalance; + } + + public void credit(Double amount) { + balance += amount; + } + + public Double getBalance() { + return balance; + } +} diff --git a/gradle/gradle-cucumber/src/test/java/com/baeldung/cucumber/RunCucumberTest.java b/gradle/gradle-cucumber/src/test/java/com/baeldung/cucumber/RunCucumberTest.java new file mode 100644 index 0000000000..38c01f5487 --- /dev/null +++ b/gradle/gradle-cucumber/src/test/java/com/baeldung/cucumber/RunCucumberTest.java @@ -0,0 +1,14 @@ +package com.baeldung.cucumber; + +import io.cucumber.junit.Cucumber; +import io.cucumber.junit.CucumberOptions; +import org.junit.runner.RunWith; + +@RunWith(Cucumber.class) +@CucumberOptions( + plugin = {"pretty", "html:target/cucumber-report.html"}, + features = {"src/test/resources"} +) +public class RunCucumberTest { + +} diff --git a/gradle/gradle-cucumber/src/test/java/com/baeldung/cucumber/StepDefinitions.java b/gradle/gradle-cucumber/src/test/java/com/baeldung/cucumber/StepDefinitions.java new file mode 100644 index 0000000000..a3d0d7961b --- /dev/null +++ b/gradle/gradle-cucumber/src/test/java/com/baeldung/cucumber/StepDefinitions.java @@ -0,0 +1,28 @@ +package com.baeldung.cucumber; + +import com.baeldung.Account; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class StepDefinitions { + + private Account account; + + @Given("account balance is {double}") + public void givenAccountBalance(Double initialBalance) { + account = new Account(initialBalance); + } + + @When("the account is credited with {double}") + public void whenAccountIsCredited(Double amount) { + account.credit(amount); + } + + @Then("account should have a balance of {double}") + public void thenAccountShouldHaveBalance(Double expectedBalance) { + assertEquals(expectedBalance, account.getBalance()); + } +} diff --git a/gradle/gradle-cucumber/src/test/resources/features/account_credited.feature b/gradle/gradle-cucumber/src/test/resources/features/account_credited.feature new file mode 100644 index 0000000000..bd7940d1a5 --- /dev/null +++ b/gradle/gradle-cucumber/src/test/resources/features/account_credited.feature @@ -0,0 +1,6 @@ +Feature: Account is credited with amount + + Scenario: Credit amount + Given account balance is 0.0 + When the account is credited with 10.0 + Then account should have a balance of 10.0 diff --git a/gradle/gradle-jacoco/build.gradle b/gradle/gradle-jacoco/build.gradle new file mode 100644 index 0000000000..ef9e0a9c7c --- /dev/null +++ b/gradle/gradle-jacoco/build.gradle @@ -0,0 +1,54 @@ + +plugins { + id 'java' + id 'jacoco' +} + +ext { + junitVersion = '5.7.2' + lombokVersion = '1.18.20' +} + +group 'com.com.baeldung' +version '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +java { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 +} + +dependencies { + testImplementation "org.junit.jupiter:junit-jupiter-api:${junitVersion}" + testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${junitVersion}" + + compileOnly "org.projectlombok:lombok:${lombokVersion}" + annotationProcessor "org.projectlombok:lombok:${lombokVersion}" +} + +test { + useJUnitPlatform() + + finalizedBy jacocoTestReport // report is always generated after tests run +} + +jacocoTestReport { + dependsOn test // tests are required to run before generating the report + + afterEvaluate { + classDirectories.setFrom(files(classDirectories.files.collect { + fileTree(dir: it, exclude: [ + "com/baeldung/**/ExcludedPOJO.class", + "com/baeldung/**/*DTO.*", + "**/config/*" + ]) + })) + } +} + +jacoco { + toolVersion = "0.8.6" +} diff --git a/gradle/gradle-jacoco/gradle/wrapper/gradle-wrapper.jar b/gradle/gradle-jacoco/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000..e708b1c023 Binary files /dev/null and b/gradle/gradle-jacoco/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/gradle-jacoco/gradle/wrapper/gradle-wrapper.properties b/gradle/gradle-jacoco/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..da9702f9e7 --- /dev/null +++ b/gradle/gradle-jacoco/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradle/gradle-jacoco/gradlew b/gradle/gradle-jacoco/gradlew new file mode 100755 index 0000000000..4f906e0c81 --- /dev/null +++ b/gradle/gradle-jacoco/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or 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 UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$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 "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# 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 + ;; + 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" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradle/gradle-jacoco/gradlew.bat b/gradle/gradle-jacoco/gradlew.bat new file mode 100644 index 0000000000..ac1b06f938 --- /dev/null +++ b/gradle/gradle-jacoco/gradlew.bat @@ -0,0 +1,89 @@ +@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%" == "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%"=="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! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/gradle/gradle-jacoco/lombok.config b/gradle/gradle-jacoco/lombok.config new file mode 100644 index 0000000000..7a21e88040 --- /dev/null +++ b/gradle/gradle-jacoco/lombok.config @@ -0,0 +1 @@ +lombok.addLombokGeneratedAnnotation = true diff --git a/gradle/gradle-jacoco/settings.gradle b/gradle/gradle-jacoco/settings.gradle new file mode 100644 index 0000000000..b0ed8f1486 --- /dev/null +++ b/gradle/gradle-jacoco/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'gradle-jacoco' diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/config/AppConfig.java b/gradle/gradle-jacoco/src/main/java/com/baeldung/config/AppConfig.java new file mode 100644 index 0000000000..d103f4b4f5 --- /dev/null +++ b/gradle/gradle-jacoco/src/main/java/com/baeldung/config/AppConfig.java @@ -0,0 +1,11 @@ +package com.baeldung.config; + +import com.baeldung.service.ProductService; + +public class AppConfig { + + public ProductService productService() { + return new ProductService(); + } + +} diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/domain/Product.java b/gradle/gradle-jacoco/src/main/java/com/baeldung/domain/Product.java new file mode 100644 index 0000000000..c64b6d2eae --- /dev/null +++ b/gradle/gradle-jacoco/src/main/java/com/baeldung/domain/Product.java @@ -0,0 +1,12 @@ +package com.baeldung.domain; + +import lombok.Builder; +import lombok.Data; + +@Builder +@Data +public class Product { + private int id; + private String name; + +} diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/dto/ExcludedPOJO.java b/gradle/gradle-jacoco/src/main/java/com/baeldung/dto/ExcludedPOJO.java new file mode 100644 index 0000000000..0f7278459e --- /dev/null +++ b/gradle/gradle-jacoco/src/main/java/com/baeldung/dto/ExcludedPOJO.java @@ -0,0 +1,4 @@ +package com.baeldung.dto; + +public class ExcludedPOJO { +} diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/dto/ProductDTO.java b/gradle/gradle-jacoco/src/main/java/com/baeldung/dto/ProductDTO.java new file mode 100644 index 0000000000..0ae1659c14 --- /dev/null +++ b/gradle/gradle-jacoco/src/main/java/com/baeldung/dto/ProductDTO.java @@ -0,0 +1,4 @@ +package com.baeldung.dto; + +public class ProductDTO { +} diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/generated/Customer.java b/gradle/gradle-jacoco/src/main/java/com/baeldung/generated/Customer.java new file mode 100644 index 0000000000..e7bb837a5c --- /dev/null +++ b/gradle/gradle-jacoco/src/main/java/com/baeldung/generated/Customer.java @@ -0,0 +1,11 @@ +package com.baeldung.generated; + +@Generated +public class Customer { + // everything in this class will be excluded from jacoco report because of @Generated + + @Override + public String toString() { + return "Customer{}"; + } +} diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/generated/Generated.java b/gradle/gradle-jacoco/src/main/java/com/baeldung/generated/Generated.java new file mode 100644 index 0000000000..865df8ca8a --- /dev/null +++ b/gradle/gradle-jacoco/src/main/java/com/baeldung/generated/Generated.java @@ -0,0 +1,15 @@ +package com.baeldung.generated; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Documented +@Retention(RUNTIME) +@Target({TYPE, METHOD}) +public @interface Generated { +} \ No newline at end of file diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/service/CustomerService.java b/gradle/gradle-jacoco/src/main/java/com/baeldung/service/CustomerService.java new file mode 100644 index 0000000000..e6dbe8df5e --- /dev/null +++ b/gradle/gradle-jacoco/src/main/java/com/baeldung/service/CustomerService.java @@ -0,0 +1,16 @@ +package com.baeldung.service; + +import com.baeldung.generated.Generated; + +public class CustomerService { + + //this method will be excluded from coverage due to @Generated. + @Generated + public String getProductId() { + return "An ID"; + } + + public String getCustomerName() { + return "some name"; + } +} diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/service/ProductService.java b/gradle/gradle-jacoco/src/main/java/com/baeldung/service/ProductService.java new file mode 100644 index 0000000000..5f73ddc7fd --- /dev/null +++ b/gradle/gradle-jacoco/src/main/java/com/baeldung/service/ProductService.java @@ -0,0 +1,9 @@ +package com.baeldung.service; + +public class ProductService { + private static final double DISCOUNT = 0.25; + + public double getSalePrice(double originalPrice) { + return originalPrice - originalPrice * DISCOUNT; + } +} diff --git a/gradle/gradle-jacoco/src/test/java/com/baeldung/service/CustomerServiceUnitTest.java b/gradle/gradle-jacoco/src/test/java/com/baeldung/service/CustomerServiceUnitTest.java new file mode 100644 index 0000000000..63dd2c755a --- /dev/null +++ b/gradle/gradle-jacoco/src/test/java/com/baeldung/service/CustomerServiceUnitTest.java @@ -0,0 +1,14 @@ +package com.baeldung.service; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class CustomerServiceUnitTest { + + @Test + public void givenCustomer_whenGetCustomer_thenReturnNewCustomer() { + CustomerService customerService = new CustomerService(); + assertNotNull(customerService.getCustomerName()); + } +} diff --git a/gradle/gradle-jacoco/src/test/java/com/baeldung/service/ProductServiceUnitTest.java b/gradle/gradle-jacoco/src/test/java/com/baeldung/service/ProductServiceUnitTest.java new file mode 100644 index 0000000000..a9d216785a --- /dev/null +++ b/gradle/gradle-jacoco/src/test/java/com/baeldung/service/ProductServiceUnitTest.java @@ -0,0 +1,15 @@ +package com.baeldung.service; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ProductServiceUnitTest { + + @Test + public void givenOriginalPrice_whenGetSalePrice_thenReturnsDiscountedPrice() { + ProductService productService = new ProductService(); + double salePrice = productService.getSalePrice(100); + assertEquals(salePrice, 75); + } +} diff --git a/gradle/gradle-jacoco/src/test/resources/features/account_credited.feature b/gradle/gradle-jacoco/src/test/resources/features/account_credited.feature new file mode 100644 index 0000000000..bd7940d1a5 --- /dev/null +++ b/gradle/gradle-jacoco/src/test/resources/features/account_credited.feature @@ -0,0 +1,6 @@ +Feature: Account is credited with amount + + Scenario: Credit amount + Given account balance is 0.0 + When the account is credited with 10.0 + Then account should have a balance of 10.0 diff --git a/jws/pom.xml b/jws/pom.xml index be42798fd1..3d2f67c691 100644 --- a/jws/pom.xml +++ b/jws/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.example jws @@ -66,4 +67,4 @@ 3.0.2 - + \ No newline at end of file diff --git a/kubernetes/k8s-intro/pom.xml b/kubernetes/k8s-intro/pom.xml index 61722cb2c8..5da137ebb6 100644 --- a/kubernetes/k8s-intro/pom.xml +++ b/kubernetes/k8s-intro/pom.xml @@ -17,6 +17,7 @@ client-java 11.0.0 + ch.qos.logback logback-classic diff --git a/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/RunJob.java b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/RunJob.java new file mode 100644 index 0000000000..0c73dfb203 --- /dev/null +++ b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/RunJob.java @@ -0,0 +1,152 @@ +/** + * + */ +package com.baeldung.kubernetes.intro; + +import java.util.Collections; +import java.util.concurrent.TimeUnit; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import io.kubernetes.client.custom.V1Patch; +import io.kubernetes.client.custom.V1Patch.V1PatchAdapter; +import io.kubernetes.client.openapi.ApiClient; +import io.kubernetes.client.openapi.apis.BatchV1Api; +import io.kubernetes.client.openapi.apis.CoreV1Api; +import io.kubernetes.client.openapi.models.V1DeleteOptions; +import io.kubernetes.client.openapi.models.V1DeleteOptionsBuilder; +import io.kubernetes.client.openapi.models.V1Job; +import io.kubernetes.client.openapi.models.V1JobBuilder; +import io.kubernetes.client.openapi.models.V1JobSpec; +import io.kubernetes.client.openapi.models.V1JobSpecBuilder; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1ObjectMetaBuilder; +import io.kubernetes.client.openapi.models.V1Status; +import io.kubernetes.client.util.Config; +import io.kubernetes.client.util.PatchUtils; +import okhttp3.OkHttpClient; +import okhttp3.logging.HttpLoggingInterceptor; + +/** + * @author Philippe + * + */ +public class RunJob { + + private static Logger log = LoggerFactory.getLogger(RunJob.class); + + public static void main(String[] args) throws Exception { + + // Create client with logginginterceptor + ApiClient client = Config.defaultClient(); + HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> log.info(message)); + interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); + OkHttpClient newClient = client.getHttpClient() + .newBuilder() + .addInterceptor(interceptor) + .readTimeout(0, TimeUnit.SECONDS) + .build(); + client.setHttpClient(newClient); + + // Create Job Spec + BatchV1Api api = new BatchV1Api(client); + String ns = "report-jobs"; + V1Job body = new V1JobBuilder() + .withNewMetadata() + .withNamespace(ns) + .withName("payroll-report-job") + .endMetadata() + .withNewSpec() + .withCompletions(2) + .withParallelism(1) + .withNewTemplate() + .withNewMetadata() + .addToLabels("name", "payroll-report") + .endMetadata() + .editOrNewSpec() + .addNewContainer() + .withName("main") + .withImage("alpine") + .addNewCommand("/bin/sh") + .addNewArg("-c") + .addNewArg("sleep 10") + .endContainer() + .withRestartPolicy("Never") + .endSpec() + .endTemplate() + .endSpec() + .build(); + + // Send to K8S + V1Job createdJob = api.createNamespacedJob(ns, body, null, null, null); + log.info("job: uid={}", createdJob.getMetadata().getUid()); + + // Let's change its parallelism value + V1Job patchedJob = new V1JobBuilder(createdJob) + .withNewMetadata() + .withName(createdJob.getMetadata().getName()) + .withNamespace(createdJob.getMetadata().getNamespace()) + .endMetadata() + .editSpec() + .withParallelism(2) + .endSpec() + .build(); + + String patchedJobJSON = client.getJSON().serialize(patchedJob); + V1Patch patch = new V1Patch(patchedJobJSON); + + PatchUtils.patch( + V1Job.class, + () -> api.patchNamespacedJobCall( + createdJob.getMetadata().getName(), + createdJob.getMetadata().getNamespace(), + patch, + null, + null, + "acme", + true, + null), + V1Patch.PATCH_FORMAT_APPLY_YAML, + api.getApiClient()); + + while(!jobCompleted(api,createdJob)) { + log.info("[I75] still running..."); + Thread.sleep(1000); + } + + V1Status response = api.deleteNamespacedJob( + createdJob.getMetadata().getName(), + createdJob.getMetadata().getNamespace(), + null, + null, + null, + null, + null, + null ) ; + + log.info("[I122] response={}", response); + } + + private static boolean jobCompleted(BatchV1Api api, V1Job createdJob) throws Exception { + + V1Job job = api.readNamespacedJob( + createdJob.getMetadata().getName(), + createdJob.getMetadata().getNamespace(), + null,null,null); + + if ( job.getStatus() == null ) { + return false; + } + + log.info("[I88] Status: active={}, succeeded={}, failed={}", + job.getStatus().getActive(), + job.getStatus().getSucceeded(), + job.getStatus().getFailed() + ); + Integer active = job.getStatus().getActive(); + + return active == null || active == 0 ; + } + +} diff --git a/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/RunJobLiveTest.java b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/RunJobLiveTest.java new file mode 100644 index 0000000000..d6621db2d4 --- /dev/null +++ b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/RunJobLiveTest.java @@ -0,0 +1,10 @@ +package com.baeldung.kubernetes.intro; + +import org.junit.jupiter.api.Test; + +class RunJobLiveTest { + @Test + void whenWatchPods_thenSuccess() throws Exception { + RunJob.main(new String[] {}); + } +} diff --git a/libraries-4/pom.xml b/libraries-4/pom.xml index decd467de9..756bfbd3a8 100644 --- a/libraries-4/pom.xml +++ b/libraries-4/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 libraries-4 diff --git a/libraries-5/pom.xml b/libraries-5/pom.xml index ff6c208f5f..a3ca204995 100644 --- a/libraries-5/pom.xml +++ b/libraries-5/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 libraries-5 diff --git a/libraries-6/pom.xml b/libraries-6/pom.xml index 6db3b1b77b..289597adc9 100644 --- a/libraries-6/pom.xml +++ b/libraries-6/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 libraries-6 @@ -112,12 +112,12 @@ renjin-script-engine ${renjin.version} - + com.googlecode.libphonenumber libphonenumber ${libphonenumber.version} - + diff --git a/libraries-data-3/README.md b/libraries-data-3/README.md new file mode 100644 index 0000000000..fffdf65252 --- /dev/null +++ b/libraries-data-3/README.md @@ -0,0 +1,10 @@ +## Data Libraries + +This module contains articles about libraries for data processing in Java. + +### Relevant articles +- [Kafka Streams vs Kafka Consumer]() +- More articles: [[<-- prev]](/../libraries-data-2) + +##### Building the project +You can build the project from the command line using: *mvn clean install*, or in an IDE. If you have issues with the derive4j imports in your IDE, you have to add the folder: *target/generated-sources/annotations* to the project build path in your IDE. diff --git a/libraries-data-3/log4j.properties b/libraries-data-3/log4j.properties new file mode 100644 index 0000000000..2173c5d96f --- /dev/null +++ b/libraries-data-3/log4j.properties @@ -0,0 +1 @@ +log4j.rootLogger=INFO, stdout diff --git a/libraries-data-3/pom.xml b/libraries-data-3/pom.xml new file mode 100644 index 0000000000..bfc39e537e --- /dev/null +++ b/libraries-data-3/pom.xml @@ -0,0 +1,59 @@ + + + 4.0.0 + libraries-data-3 + libraries-data-3 + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.apache.kafka + kafka-clients + ${kafka.version} + test + test + + + org.apache.kafka + kafka-streams + ${kafka.version} + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + slf4j-log4j12 + ${slf4j.version} + + + org.assertj + assertj-core + ${assertj.version} + test + + + org.testcontainers + kafka + ${testcontainers-kafka.version} + test + + + + + 3.6.2 + 1.7.25 + 2.8.0 + 1.15.3 + + + \ No newline at end of file diff --git a/libraries-data-3/src/test/java/com/baeldung/kafka/streams/KafkaStreamsLiveTest.java b/libraries-data-3/src/test/java/com/baeldung/kafka/streams/KafkaStreamsLiveTest.java new file mode 100644 index 0000000000..0d4c0606e3 --- /dev/null +++ b/libraries-data-3/src/test/java/com/baeldung/kafka/streams/KafkaStreamsLiveTest.java @@ -0,0 +1,279 @@ +package com.baeldung.kafka.streams; + +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.common.serialization.Serde; +import org.apache.kafka.common.serialization.Serdes; +import org.apache.kafka.common.utils.Bytes; +import org.apache.kafka.streams.KafkaStreams; +import org.apache.kafka.streams.KeyValue; +import org.apache.kafka.streams.StoreQueryParameters; +import org.apache.kafka.streams.StreamsBuilder; +import org.apache.kafka.streams.StreamsConfig; +import org.apache.kafka.streams.Topology; +import org.apache.kafka.streams.kstream.Consumed; +import org.apache.kafka.streams.kstream.Grouped; +import org.apache.kafka.streams.kstream.JoinWindows; +import org.apache.kafka.streams.kstream.KGroupedStream; +import org.apache.kafka.streams.kstream.KGroupedTable; +import org.apache.kafka.streams.kstream.KStream; +import org.apache.kafka.streams.kstream.KTable; +import org.apache.kafka.streams.kstream.Materialized; +import org.apache.kafka.streams.kstream.Produced; +import org.apache.kafka.streams.kstream.TimeWindows; +import org.apache.kafka.streams.state.KeyValueIterator; +import org.apache.kafka.streams.state.KeyValueStore; +import org.apache.kafka.streams.state.QueryableStoreTypes; +import org.apache.kafka.streams.state.ReadOnlyKeyValueStore; +import org.apache.kafka.streams.state.StoreBuilder; +import org.apache.kafka.streams.state.Stores; +import org.apache.kafka.streams.state.WindowStore; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Test; +import org.testcontainers.containers.KafkaContainer; +import org.testcontainers.utility.DockerImageName; + +import java.time.Duration; +import java.util.Arrays; +import java.util.Locale; +import java.util.Properties; + +import static org.apache.kafka.clients.consumer.ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG; +import static org.apache.kafka.clients.producer.ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG; +import static org.apache.kafka.clients.producer.ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG; + +public class KafkaStreamsLiveTest { + private final String LEFT_TOPIC = "left-stream-topic"; + private final String RIGHT_TOPIC = "right-stream-topic"; + private final String LEFT_RIGHT_TOPIC = "left-right-stream-topic"; + + private KafkaProducer producer = createKafkaProducer(); + private Properties streamsConfiguration = new Properties(); + + static final String TEXT_LINES_TOPIC = "TextLinesTopic"; + + private final String TEXT_EXAMPLE_1 = "test test and test"; + private final String TEXT_EXAMPLE_2 = "test filter filter this sentence"; + + @ClassRule + public static KafkaContainer kafka = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:5.4.3")); + + @Before + public void setUp() { + streamsConfiguration.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, kafka.getBootstrapServers()); + streamsConfiguration.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName()); + streamsConfiguration.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName()); + streamsConfiguration.put(StreamsConfig.COMMIT_INTERVAL_MS_CONFIG, 1000); + streamsConfiguration.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); + } + + @Test + public void shouldTestKafkaTableLatestWord() throws InterruptedException { + String inputTopic = "topicTable"; + + final StreamsBuilder builder = new StreamsBuilder(); + + KTable textLinesTable = builder.table(inputTopic, + Consumed.with(Serdes.String(), Serdes.String())); + + textLinesTable.toStream().foreach((word, count) -> System.out.println("Latest word: " + word + " -> " + count)); + + final Topology topology = builder.build(); + streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG, "latest-word-id"); + KafkaStreams streams = new KafkaStreams(topology, streamsConfiguration); + + streams.cleanUp(); + streams.start(); + producer.send(new ProducerRecord(inputTopic, "1", TEXT_EXAMPLE_1)); + producer.send(new ProducerRecord(inputTopic, "2", TEXT_EXAMPLE_2)); + + Thread.sleep(2000); + streams.close(); + } + + @Test + public void shouldTestWordCountKafkaStreams() throws InterruptedException { + String wordCountTopic = "wordCountTopic"; + + final StreamsBuilder builder = new StreamsBuilder(); + KStream textLines = builder.stream(wordCountTopic, + Consumed.with(Serdes.String(), Serdes.String())); + + KTable wordCounts = textLines + .flatMapValues(value -> Arrays.asList(value.toLowerCase(Locale.ROOT) + .split("\\W+"))) + .groupBy((key, word) -> word) + .count(Materialized.> as("counts-store")); + + wordCounts.toStream().foreach((word, count) -> System.out.println("Word: " + word + " -> " + count)); + + wordCounts.toStream().to("outputTopic", + Produced.with(Serdes.String(), Serdes.Long())); + + streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG, "wordcount-stream-table-id"); + final Topology topology = builder.build(); + KafkaStreams streams = new KafkaStreams(topology, streamsConfiguration); + + streams.cleanUp(); + streams.start(); + + producer.send(new ProducerRecord(wordCountTopic, "1", TEXT_EXAMPLE_1)); + producer.send(new ProducerRecord(wordCountTopic, "2", TEXT_EXAMPLE_2)); + + Thread.sleep(2000); + streams.close(); + } + + // Filter, map + @Test + public void shouldTestStatelessTransformations() throws InterruptedException { + String wordCountTopic = "wordCountTopic"; + + //when + final StreamsBuilder builder = new StreamsBuilder(); + KStream textLines = builder.stream(wordCountTopic, + Consumed.with(Serdes.String(), Serdes.String())); + + final KStream textLinesUpperCase = + textLines + .map((key, value) -> KeyValue.pair(value, value.toUpperCase())) + .filter((key, value) -> value.contains("FILTER")); + + KTable wordCounts = textLinesUpperCase + .flatMapValues(value -> Arrays.asList(value.split("\\W+"))) + .groupBy((key, word) -> word) + .count(Materialized.> as("counts-store")); + + wordCounts.toStream().foreach((word, count) -> System.out.println("Word: " + word + " -> " + count)); + + streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG, "wordcount-filter-map-id"); + final Topology topology = builder.build(); + KafkaStreams streams = new KafkaStreams(topology, streamsConfiguration); + + streams.cleanUp(); + streams.start(); + + producer.send(new ProducerRecord(wordCountTopic, "1", TEXT_EXAMPLE_1)); + producer.send(new ProducerRecord(wordCountTopic, "2", TEXT_EXAMPLE_2)); + + Thread.sleep(2000); + streams.close(); + + } + + @Test + public void shouldTestAggregationStatefulTransformations() throws InterruptedException { + String aggregationTopic = "aggregationTopic"; + + final StreamsBuilder builder = new StreamsBuilder(); + final KStream input = builder.stream(aggregationTopic, + Consumed.with(Serdes.ByteArray(), Serdes.String())); + final KTable aggregated = input + .groupBy((key, value) -> (value != null && value.length() > 0) ? value.substring(0, 2).toLowerCase() : "", + Grouped.with(Serdes.String(), Serdes.String())) + .aggregate(() -> 0L, (aggKey, newValue, aggValue) -> aggValue + newValue.length(), + Materialized.with(Serdes.String(), Serdes.Long())); + + aggregated.toStream().foreach((word, count) -> System.out.println("Word: " + word + " -> " + count)); + + streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG, "aggregation-id"); + final Topology topology = builder.build(); + KafkaStreams streams = new KafkaStreams(topology, streamsConfiguration); + + streams.cleanUp(); + streams.start(); + + producer.send(new ProducerRecord(aggregationTopic, "1", "one")); + producer.send(new ProducerRecord(aggregationTopic, "2", "two")); + producer.send(new ProducerRecord(aggregationTopic, "3", "three")); + producer.send(new ProducerRecord(aggregationTopic, "4", "four")); + producer.send(new ProducerRecord(aggregationTopic, "5", "five")); + + Thread.sleep(5000); + streams.close(); + + } + + @Test + public void shouldTestWindowingJoinStatefulTransformations() throws InterruptedException { + final StreamsBuilder builder = new StreamsBuilder(); + + KStream leftSource = builder.stream(LEFT_TOPIC); + KStream rightSource = builder.stream(RIGHT_TOPIC); + + KStream leftRightSource = leftSource.outerJoin(rightSource, + (leftValue, rightValue) -> "left=" + leftValue + ", right=" + rightValue, + JoinWindows.of(Duration.ofSeconds(5))) + .groupByKey() + .reduce(((key, lastValue) -> lastValue)) + .toStream(); + + leftRightSource.foreach((key, value) -> System.out.println("(key= " + key + ") -> (" + value + ")")); + + final Topology topology = builder.build(); + streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG, "windowing-join-id"); + KafkaStreams streams = new KafkaStreams(topology, streamsConfiguration); + + streams.cleanUp(); + streams.start(); + + producer.send(new ProducerRecord(LEFT_TOPIC, "1", "left")); + producer.send(new ProducerRecord(RIGHT_TOPIC, "2", "right")); + + Thread.sleep(2000); + streams.close(); + } + + @Test + public void shouldTestWordCountWithInteractiveQueries() throws InterruptedException { + + final Serde stringSerde = Serdes.String(); + final StreamsBuilder builder = new StreamsBuilder(); + final KStream + textLines = builder.stream(TEXT_LINES_TOPIC, Consumed.with(Serdes.String(), Serdes.String())); + + final KGroupedStream groupedByWord = textLines + .flatMapValues(value -> Arrays.asList(value.toLowerCase().split("\\W+"))) + .groupBy((key, word) -> word, Grouped.with(stringSerde, stringSerde)); + + groupedByWord.count(Materialized.>as("WordCountsStore") + .withValueSerde(Serdes.Long())); + + streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG, "wordcount-interactive-queries"); + + final KafkaStreams streams = new KafkaStreams(builder.build(), streamsConfiguration); + streams.cleanUp(); + streams.start(); + + producer.send(new ProducerRecord(TEXT_LINES_TOPIC, "1", TEXT_EXAMPLE_1)); + producer.send(new ProducerRecord(TEXT_LINES_TOPIC, "2", TEXT_EXAMPLE_2)); + + Thread.sleep(2000); + ReadOnlyKeyValueStore keyValueStore = + streams.store(StoreQueryParameters.fromNameAndType( + "WordCountsStore", QueryableStoreTypes.keyValueStore())); + + KeyValueIterator range = keyValueStore.all(); + while (range.hasNext()) { + KeyValue next = range.next(); + System.out.println("Count for " + next.key + ": " + next.value); + } + + streams.close(); + } + + private static KafkaProducer createKafkaProducer() { + + Properties props = new Properties(); + props.put(BOOTSTRAP_SERVERS_CONFIG, kafka.getBootstrapServers()); + props.put(KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer"); + props.put(VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer"); + + return new KafkaProducer(props); + + } +} + + diff --git a/libraries-http-2/src/main/java/com/baeldung/okhttp/interceptors/ErrorResponseInterceptor.java b/libraries-http-2/src/main/java/com/baeldung/okhttp/interceptors/ErrorResponseInterceptor.java index f6c6673705..02f45e1282 100644 --- a/libraries-http-2/src/main/java/com/baeldung/okhttp/interceptors/ErrorResponseInterceptor.java +++ b/libraries-http-2/src/main/java/com/baeldung/okhttp/interceptors/ErrorResponseInterceptor.java @@ -21,7 +21,12 @@ public class ErrorResponseInterceptor implements Interceptor { Gson gson = new Gson(); String body = gson.toJson(new ErrorMessage(response.code(), "The response from the server was not OK")); ResponseBody responseBody = ResponseBody.create(body, APPLICATION_JSON); - + + ResponseBody originalBody = response.body(); + if (originalBody != null) { + originalBody.close(); + } + return response.newBuilder() .body(responseBody) .build(); diff --git a/libraries/pom.xml b/libraries/pom.xml index 13f91fddd0..40cc1b4671 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 libraries libraries @@ -335,7 +336,8 @@ benchmarks - + org.openjdk.jmh.Main diff --git a/logging-modules/log4j/src/main/java/com/baeldung/log4j/NoAppenderExample.java b/logging-modules/log4j/src/main/java/com/baeldung/log4j/NoAppenderExample.java new file mode 100644 index 0000000000..9bd8a06537 --- /dev/null +++ b/logging-modules/log4j/src/main/java/com/baeldung/log4j/NoAppenderExample.java @@ -0,0 +1,18 @@ +package com.baeldung.log4j; + +import org.apache.log4j.Logger; + +public class NoAppenderExample { + + private final static Logger logger = Logger.getLogger(NoAppenderExample.class); + + public static void main(String[] args) { + + //Setup default appender + //BasicConfigurator.configure(); + + //Define path to configuration file + //PropertyConfigurator.configure("src\\main\\resources\\log4j.properties"); + logger.info("Info log message"); + } +} diff --git a/logging-modules/log4j/src/main/resources/log4j.properties b/logging-modules/log4j/src/main/resources/log4j.properties new file mode 100644 index 0000000000..b10ba2b7d4 --- /dev/null +++ b/logging-modules/log4j/src/main/resources/log4j.properties @@ -0,0 +1,5 @@ +log4j.rootLogger=INFO, stdout +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{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n \ No newline at end of file diff --git a/logging-modules/log4j/src/main/resources/log4j.xml b/logging-modules/log4j/src/main/resources/log4j.xml index 562d6920f9..3004649edf 100644 --- a/logging-modules/log4j/src/main/resources/log4j.xml +++ b/logging-modules/log4j/src/main/resources/log4j.xml @@ -90,6 +90,8 @@ + + diff --git a/lombok/pom.xml b/lombok/pom.xml index 334d1defc9..c5758ea8df 100644 --- a/lombok/pom.xml +++ b/lombok/pom.xml @@ -73,8 +73,6 @@ - - 1.18.10 1.0.0.Final diff --git a/mapstruct/src/main/java/com/baeldung/mapper/SimpleDestinationMapperUsingInjectedService.java b/mapstruct/src/main/java/com/baeldung/mapper/SimpleDestinationMapperUsingInjectedService.java new file mode 100644 index 0000000000..22e6499711 --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/mapper/SimpleDestinationMapperUsingInjectedService.java @@ -0,0 +1,22 @@ +package com.baeldung.mapper; + +import com.baeldung.dto.SimpleSource; +import com.baeldung.entity.SimpleDestination; +import com.baeldung.service.SimpleService; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.springframework.beans.factory.annotation.Autowired; + +@Mapper(componentModel = "spring") +public abstract class SimpleDestinationMapperUsingInjectedService { + + @Autowired + protected SimpleService simpleService; + + @Mapping(target = "name", expression = "java(simpleService.enrichName(source.getName()))") + public abstract SimpleDestination sourceToDestination(SimpleSource source); + + public abstract SimpleSource destinationToSource(SimpleDestination destination); + + +} diff --git a/mapstruct/src/main/java/com/baeldung/service/SimpleService.java b/mapstruct/src/main/java/com/baeldung/service/SimpleService.java new file mode 100644 index 0000000000..14b6c09592 --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/service/SimpleService.java @@ -0,0 +1,11 @@ +package com.baeldung.service; + +import org.springframework.stereotype.Service; + +@Service +public class SimpleService { + + public String enrichName(String name) { + return "-:: " + name + " ::-"; + } +} diff --git a/mapstruct/src/test/java/com/baeldung/mapper/SimpleDestinationMapperUsingInjectedIntegrationTest.java b/mapstruct/src/test/java/com/baeldung/mapper/SimpleDestinationMapperUsingInjectedIntegrationTest.java new file mode 100644 index 0000000000..3bfbc60de6 --- /dev/null +++ b/mapstruct/src/test/java/com/baeldung/mapper/SimpleDestinationMapperUsingInjectedIntegrationTest.java @@ -0,0 +1,35 @@ +package com.baeldung.mapper; + +import com.baeldung.dto.SimpleSource; +import com.baeldung.entity.SimpleDestination; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("classpath:applicationContext.xml") +public class SimpleDestinationMapperUsingInjectedIntegrationTest { + + @Autowired + private SimpleDestinationMapperUsingInjectedService mapper; + + @Test + public void givenSourceToDestination_whenMaps_thenNameEnriched() { + // Given + SimpleSource source = new SimpleSource(); + source.setName("Bob"); + source.setDescription("The Builder"); + + // When + SimpleDestination destination = mapper.sourceToDestination(source); + + // Then + assertThat(destination).isNotNull(); + assertThat(destination.getName()).isEqualTo("-:: Bob ::-"); + assertThat(destination.getDescription()).isEqualTo("The Builder"); + } +} \ No newline at end of file diff --git a/maven-modules/maven-copy-files/README.md b/maven-modules/maven-copy-files/README.md new file mode 100644 index 0000000000..1e3a75cb0b --- /dev/null +++ b/maven-modules/maven-copy-files/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Copying Files With Maven](https://www.baeldung.com/maven-copy-files) diff --git a/maven-modules/maven-pom-types/README.md b/maven-modules/maven-pom-types/README.md new file mode 100644 index 0000000000..40119f68c1 --- /dev/null +++ b/maven-modules/maven-pom-types/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Difference Between Super, Simplest, and Effective POM](https://www.baeldung.com/maven-super-simplest-effective-pom) diff --git a/maven-modules/maven-pom-types/effective-pom.xml b/maven-modules/maven-pom-types/effective-pom.xml new file mode 100644 index 0000000000..a2f8460809 --- /dev/null +++ b/maven-modules/maven-pom-types/effective-pom.xml @@ -0,0 +1,238 @@ + + + 4.0.0 + com.baeldung + maven-pom-types + 1.0-SNAPSHOT + + + + false + + central + Central Repository + https://repo.maven.apache.org/maven2 + + + + + + never + + + false + + central + Central Repository + https://repo.maven.apache.org/maven2 + + + + C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\src\main\java + C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\src\main\scripts + + C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\src\test\java + + C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\customTarget\classes + + C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\customTarget\test-classes + + + + C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\src\main\resources + + + + + C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\src\test\resources + + + C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\customTarget + simplestPOM-1.0-SNAPSHOT + + + + maven-antrun-plugin + 1.3 + + + maven-assembly-plugin + 2.2-beta-5 + + + maven-dependency-plugin + 2.8 + + + maven-release-plugin + 2.5.3 + + + + + + maven-clean-plugin + 2.5 + + + default-clean + clean + + clean + + + + + + maven-resources-plugin + 2.6 + + + default-testResources + process-test-resources + + testResources + + + + default-resources + process-resources + + resources + + + + + + maven-jar-plugin + 2.4 + + + default-jar + package + + jar + + + + + + maven-compiler-plugin + 3.1 + + + default-compile + compile + + compile + + + + default-testCompile + test-compile + + testCompile + + + + + + maven-surefire-plugin + 2.12.4 + + + default-test + test + + test + + + + + + maven-install-plugin + 2.4 + + + default-install + install + + install + + + + + + maven-deploy-plugin + 2.7 + + + default-deploy + deploy + + deploy + + + + + + maven-site-plugin + 3.3 + + + default-site + site + + site + + + + C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\customTarget\site + + + + org.apache.maven.plugins + maven-project-info-reports-plugin + + + + + + default-deploy + site-deploy + + deploy + + + + C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\customTarget\site + + + + org.apache.maven.plugins + maven-project-info-reports-plugin + + + + + + + C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\customTarget\site + + + + org.apache.maven.plugins + maven-project-info-reports-plugin + + + + + + + + C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\customTarget\site + + + diff --git a/maven-modules/maven-pom-types/pom-4.0.0.xml b/maven-modules/maven-pom-types/pom-4.0.0.xml new file mode 100644 index 0000000000..24b15984af --- /dev/null +++ b/maven-modules/maven-pom-types/pom-4.0.0.xml @@ -0,0 +1,148 @@ + + + + + + + 4.0.0 + + + + central + Central Repository + https://repo.maven.apache.org/maven2 + default + + false + + + + + + + central + Central Repository + https://repo.maven.apache.org/maven2 + default + + false + + + never + + + + + + ${project.basedir}/target + ${project.build.directory}/classes + ${project.artifactId}-${project.version} + ${project.build.directory}/test-classes + + ${project.basedir}/src/main/java + ${project.basedir}/src/main/scripts + + ${project.basedir}/src/test/java + + + + ${project.basedir}/src/main/resources + + + + + ${project.basedir}/src/test/resources + + + + + + + + maven-antrun-plugin + 1.3 + + + maven-assembly-plugin + 2.2-beta-5 + + + maven-dependency-plugin + 2.8 + + + maven-release-plugin + 2.5.3 + + + + + + + ${project.build.directory}/site + + + + + + release-profile + + + + performRelease + true + + + + + + + true + maven-source-plugin + + + attach-sources + + jar-no-fork + + + + + + true + maven-javadoc-plugin + + + attach-javadocs + + jar + + + + + + true + maven-deploy-plugin + + true + + + + + + + + + diff --git a/maven-modules/maven-pom-types/pom.xml b/maven-modules/maven-pom-types/pom.xml new file mode 100644 index 0000000000..98fbc828a0 --- /dev/null +++ b/maven-modules/maven-pom-types/pom.xml @@ -0,0 +1,9 @@ + + + 4.0.0 + com.baeldung + maven-pom-types + 1.0-SNAPSHOT + \ No newline at end of file diff --git a/maven-modules/maven-printing-plugins/README.md b/maven-modules/maven-printing-plugins/README.md new file mode 100644 index 0000000000..862c4bcdd1 --- /dev/null +++ b/maven-modules/maven-printing-plugins/README.md @@ -0,0 +1,7 @@ +## Maven Printing Plugins + +This module contains articles about printing from Maven plugins. + +### Relevant Articles + +- [How to Display a Message in Maven](https://www.baeldung.com/maven-print-message-during-execution) diff --git a/maven-modules/maven-printing-plugins/pom.xml b/maven-modules/maven-printing-plugins/pom.xml index 6ea1ab2a84..805c3c1633 100644 --- a/maven-modules/maven-printing-plugins/pom.xml +++ b/maven-modules/maven-printing-plugins/pom.xml @@ -49,9 +49,11 @@ echo - Hello, world - Embed a line break: ${line.separator} - ArtifactId is ${project.artifactId} + + Hello, world + Embed a line break: ${line.separator} + ArtifactId is ${project.artifactId} + INFO /logs/log-echo.txt true diff --git a/netflix-modules/mantis/pom.xml b/netflix-modules/mantis/pom.xml index 474b8f6dbf..1f8b377b94 100644 --- a/netflix-modules/mantis/pom.xml +++ b/netflix-modules/mantis/pom.xml @@ -19,7 +19,6 @@ org.springframework.boot spring-boot-starter - 2.1.3.RELEASE io.mantisrx @@ -35,36 +34,31 @@ com.fasterxml.jackson.core jackson-databind - 2.10.2 net.andreinc.mockneat mockneat - 0.3.8 + 0.4.2 org.projectlombok lombok - 1.18.12 org.springframework spring-webflux - 5.0.9.RELEASE test io.projectreactor.netty reactor-netty - 0.9.12.RELEASE test - - SpringLibReleaseRepo - https://repo.spring.io/libs-release/ + jcenter + https://jcenter.bintray.com/ diff --git a/parent-spring-5/pom.xml b/parent-spring-5/pom.xml index b70ca2bd0f..6bedf9fb67 100644 --- a/parent-spring-5/pom.xml +++ b/parent-spring-5/pom.xml @@ -30,7 +30,7 @@ - 5.3.3 + 5.3.7 5.2.3.RELEASE 1.5.10.RELEASE diff --git a/patterns/.gitignore b/patterns/.gitignore new file mode 100644 index 0000000000..1d420f6aaf --- /dev/null +++ b/patterns/.gitignore @@ -0,0 +1 @@ +/product-service/ diff --git a/patterns/design-patterns-behavioral/pom.xml b/patterns/design-patterns-behavioral/pom.xml index 93e07bb477..bc032a0f8f 100644 --- a/patterns/design-patterns-behavioral/pom.xml +++ b/patterns/design-patterns-behavioral/pom.xml @@ -26,6 +26,11 @@ ${lombok.version} provided + + com.google.code.findbugs + annotations + ${findbugs.annotations.version} + org.apache.commons commons-lang3 @@ -41,6 +46,7 @@ 16.0.2 + 3.0.1 3.9.1 diff --git a/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/FindBugsAnnotations.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/FindBugsAnnotations.java index 697d5e4959..594516e3f2 100644 --- a/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/FindBugsAnnotations.java +++ b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/FindBugsAnnotations.java @@ -1,12 +1,12 @@ package com.baeldung.nulls; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import edu.umd.cs.findbugs.annotations.NonNull; +import edu.umd.cs.findbugs.annotations.Nullable; public class FindBugsAnnotations { - public void accept(@NotNull Object param) { + public void accept(@NonNull Object param) { System.out.println(param.toString()); } @@ -14,7 +14,7 @@ public class FindBugsAnnotations { System.out.println("Printing " + param); } - @NotNull + @NonNull public Object process() throws Exception { Object result = doSomething(); if (result == null) { diff --git a/patterns/enterprise-patterns/pom.xml b/patterns/enterprise-patterns/pom.xml new file mode 100644 index 0000000000..3637072c58 --- /dev/null +++ b/patterns/enterprise-patterns/pom.xml @@ -0,0 +1,62 @@ + + + 4.0.0 + + com.baeldung + patterns + 1.0.0-SNAPSHOT + + + enterprise-patterns + pom + + + 3.7.4 + + + + + org.apache.camel.springboot + camel-spring-boot-starter + + + org.apache.camel.springboot + camel-activemq-starter + + + + + org.springframework.boot + spring-boot-starter-test + 2.2.2.RELEASE + + + org.apache.camel + camel-test-spring-junit5 + test + + + + + + + org.apache.camel.springboot + camel-spring-boot-dependencies + ${camel.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/patterns/enterprise-patterns/wire-tap/README.md b/patterns/enterprise-patterns/wire-tap/README.md new file mode 100644 index 0000000000..5f2aaf0d5a --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/README.md @@ -0,0 +1,34 @@ +# Wire Tap Pattern + +The application shows you how to use a Wire Tap to monitor, debug or troubleshoot messages flowing through the system, without permanently consuming them off, or making any changes to the expected message in the output channel. + +This example shows how to implement this with a simple Apache Camel application using Spring Boot and Apache ActiveMq. +For convenience, we are using in-memory activeMq. + + + +### Configuring and using the Connection Factory + +1. Create CamelContext. +2. Connect to embedded (or remote) ActiveMQ JMS broker. +3. Add JMS queue to CamelContext. +4. Load file orders (xml/csv) from src/data into the JMS queue. +5. Based on the extension of the incoming file message, route to the respective queues. +6. Test that the destination route is working. +7. Audit the received file (order) from the wire tap queue. + +### How to run the example: + + mvn spring-boot:run + + +The Wire Tap processor, by default, makes a shallow copy of the Camel Exchange instance. The copy of the exchange is sent to the endpoint specified in the wireTap statement. The body of the wire tapped message contains the same object as that in the original message which means any change to the internal state of that object during the wire tap route may also end up changing the main message’s body. + +To solve this, we need to create a deep copy of the object before passing it to the wire tap destination. Wire Tap EIP provides us with a mechanism to perform a “deep” copy of the message, by implementing the org.apache.camel.Processor class. This needs to be be called using onPrepare statement right after wireTap. +For more details, check out the AmqApplicationUnitTest.class. + +### Relevant Articles: + +- [Wire tap (Enterprise Integration Pattern)](https://drafts.baeldung.com/?p=103346&preview=true) +- [Intro to Apache camel](https://www.baeldung.com/apache-camel-intro) + diff --git a/patterns/enterprise-patterns/wire-tap/pom.xml b/patterns/enterprise-patterns/wire-tap/pom.xml new file mode 100644 index 0000000000..9169c4ac91 --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + wire-tap + 1.0 + jar + + + enterprise-patterns + com.baeldung + 1.0.0-SNAPSHOT + + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/patterns/enterprise-patterns/wire-tap/src/data/.camel/msg1.xml b/patterns/enterprise-patterns/wire-tap/src/data/.camel/msg1.xml new file mode 100644 index 0000000000..0a6fa64552 --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/src/data/.camel/msg1.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/src/data/msg.xml b/patterns/enterprise-patterns/wire-tap/src/data/msg.xml new file mode 100644 index 0000000000..0a6fa64552 --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/src/data/msg.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/AmqApplication.java b/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/AmqApplication.java new file mode 100644 index 0000000000..eacef86d75 --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/AmqApplication.java @@ -0,0 +1,70 @@ +package com.baeldung; + +import org.apache.activemq.ActiveMQConnectionFactory; +import org.apache.camel.CamelContext; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.RoutesBuilder; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.jms.JmsComponent; +import org.apache.camel.impl.DefaultCamelContext; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class AmqApplication { + + public static void main(String[] args) throws Exception { + SpringApplication.run(AmqApplication.class, args); + + try (CamelContext context = new DefaultCamelContext()) { + ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory( + "vm://localhost?broker.persistent=false"); + connectionFactory.setTrustAllPackages(true); + context.addComponent("direct", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory)); + addRoute(context); + + try (ProducerTemplate template = context.createProducerTemplate()) { + context.start(); + + MyPayload payload = new MyPayload("One"); + template.sendBody("direct:source", payload); + Thread.sleep(10000); + } finally { + context.stop(); + } + } + } + + private static void addRoute(CamelContext context) throws Exception { + context.addRoutes(newExchangeRoute()); + } + + static RoutesBuilder traditionalWireTapRoute() { + return new RouteBuilder() { + public void configure() { + + from("direct:source").log("Main route: Send '${body}' to tap router").wireTap("direct:tap").delay(1000) + .log("Main route: Add 'two' to '${body}'").bean(MyBean.class, "addTwo").to("direct:destination") + .log("Main route: Output '${body}'"); + + from("direct:tap").log("Tap Wire route: received '${body}'") + .log("Tap Wire route: Add 'three' to '${body}'").bean(MyBean.class, "addThree") + .log("Tap Wire route: Output '${body}'"); + + from("direct:destination").log("Output at destination: '${body}'"); + } + }; + } + + static RoutesBuilder newExchangeRoute() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + + from("direct:source").wireTap("direct:tap").onPrepare(new MyPayloadClonePrepare()).end().delay(1000); + + from("direct:tap").bean(MyBean.class, "addThree"); + } + }; + } + +} diff --git a/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyBean.java b/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyBean.java new file mode 100644 index 0000000000..62c45725b0 --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyBean.java @@ -0,0 +1,14 @@ +package com.baeldung; + +public class MyBean { + + public MyPayload addTwo(MyPayload body) { + body.setValue(body.getValue() + " and two"); + return body; + } + + public MyPayload addThree(MyPayload body) { + body.setValue(body.getValue() + " and three"); + return body; + } +} diff --git a/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyPayload.java b/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyPayload.java new file mode 100644 index 0000000000..84d6a22733 --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyPayload.java @@ -0,0 +1,31 @@ +package com.baeldung; + +import java.io.Serializable; + +public class MyPayload implements Serializable { + + private static final long serialVersionUID = 1L; + private String value; + + public MyPayload(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String toString() { + return value; + } + + public MyPayload deepClone() { + MyPayload myPayload = new MyPayload(value); + return myPayload; + } + +} diff --git a/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyPayloadClonePrepare.java b/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyPayloadClonePrepare.java new file mode 100644 index 0000000000..938194bc1a --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyPayloadClonePrepare.java @@ -0,0 +1,15 @@ +package com.baeldung; + +import java.util.Date; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; + +public class MyPayloadClonePrepare implements Processor { + + public void process(Exchange exchange) throws Exception { + MyPayload myPayload = exchange.getIn().getBody(MyPayload.class); + exchange.getIn().setBody(myPayload.deepClone()); + exchange.getIn().setHeader("date", new Date()); + } +} diff --git a/patterns/enterprise-patterns/wire-tap/src/main/resources/application.properties b/patterns/enterprise-patterns/wire-tap/src/main/resources/application.properties new file mode 100644 index 0000000000..a74f494fa5 --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/src/main/resources/application.properties @@ -0,0 +1,9 @@ +# to keep the JVM running +camel.springboot.main-run-controller = true + +#configure the URL of the remote ActiveMQ broker +#camel.component.activemq.broker-url=tcp://localhost:61616 +#spring.activemq.broker-url=tcp://localhost:61616 + +spring.activemq.in-memory=true +spring.activemq.pool.enabled=false \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/src/main/resources/log4j.properties b/patterns/enterprise-patterns/wire-tap/src/main/resources/log4j.properties new file mode 100644 index 0000000000..28aa51259a --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/src/main/resources/log4j.properties @@ -0,0 +1,16 @@ +# Root logger option +log4j.rootLogger=INFO, file, console + +log4j.logger.com.javarticles=INFO, file + +# Direct log messages to a log file +log4j.appender.file=org.apache.log4j.FileAppender +log4j.appender.file.File=javarticles.log +log4j.appender.file.layout=org.apache.log4j.PatternLayout +log4j.appender.file.layout.ConversionPattern=%d | %p | %F %L | %m%n + +# Direct log messages to stdout +log4j.appender.console=org.apache.log4j.ConsoleAppender +log4j.appender.console.Target=System.out +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern=%d{HH:mm}| %p | %F %L | %m%n \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-10-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-10-1-1-1 new file mode 100644 index 0000000000..25b70e3283 --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-10-1-1-1 @@ -0,0 +1 @@ +Test Message: 8 \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-11-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-11-1-1-1 new file mode 100644 index 0000000000..3948af158c --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-11-1-1-1 @@ -0,0 +1 @@ +Test Message: 9 \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-2-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-2-1-1-1 new file mode 100644 index 0000000000..262fbf6de5 --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-2-1-1-1 @@ -0,0 +1 @@ +Test Message: 0 \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-3-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-3-1-1-1 new file mode 100644 index 0000000000..64a5c33134 --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-3-1-1-1 @@ -0,0 +1 @@ +Test Message: 1 \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-4-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-4-1-1-1 new file mode 100644 index 0000000000..de22e70d38 --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-4-1-1-1 @@ -0,0 +1 @@ +Test Message: 2 \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-5-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-5-1-1-1 new file mode 100644 index 0000000000..d400e1afeb --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-5-1-1-1 @@ -0,0 +1 @@ +Test Message: 3 \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-6-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-6-1-1-1 new file mode 100644 index 0000000000..660c960fcb --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-6-1-1-1 @@ -0,0 +1 @@ +Test Message: 4 \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-7-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-7-1-1-1 new file mode 100644 index 0000000000..c97f21578a --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-7-1-1-1 @@ -0,0 +1 @@ +Test Message: 5 \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-8-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-8-1-1-1 new file mode 100644 index 0000000000..be38d662ff --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-8-1-1-1 @@ -0,0 +1 @@ +Test Message: 6 \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-9-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-9-1-1-1 new file mode 100644 index 0000000000..518e4227fc --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-9-1-1-1 @@ -0,0 +1 @@ +Test Message: 7 \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-10-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-10-1-1-1 new file mode 100644 index 0000000000..25b70e3283 --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-10-1-1-1 @@ -0,0 +1 @@ +Test Message: 8 \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-11-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-11-1-1-1 new file mode 100644 index 0000000000..3948af158c --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-11-1-1-1 @@ -0,0 +1 @@ +Test Message: 9 \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-2-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-2-1-1-1 new file mode 100644 index 0000000000..262fbf6de5 --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-2-1-1-1 @@ -0,0 +1 @@ +Test Message: 0 \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-3-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-3-1-1-1 new file mode 100644 index 0000000000..64a5c33134 --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-3-1-1-1 @@ -0,0 +1 @@ +Test Message: 1 \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-4-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-4-1-1-1 new file mode 100644 index 0000000000..de22e70d38 --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-4-1-1-1 @@ -0,0 +1 @@ +Test Message: 2 \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-5-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-5-1-1-1 new file mode 100644 index 0000000000..d400e1afeb --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-5-1-1-1 @@ -0,0 +1 @@ +Test Message: 3 \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-6-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-6-1-1-1 new file mode 100644 index 0000000000..660c960fcb --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-6-1-1-1 @@ -0,0 +1 @@ +Test Message: 4 \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-7-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-7-1-1-1 new file mode 100644 index 0000000000..c97f21578a --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-7-1-1-1 @@ -0,0 +1 @@ +Test Message: 5 \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-8-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-8-1-1-1 new file mode 100644 index 0000000000..be38d662ff --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-8-1-1-1 @@ -0,0 +1 @@ +Test Message: 6 \ No newline at end of file diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-9-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-9-1-1-1 new file mode 100644 index 0000000000..518e4227fc --- /dev/null +++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-9-1-1-1 @@ -0,0 +1 @@ +Test Message: 7 \ No newline at end of file diff --git a/patterns/pom.xml b/patterns/pom.xml index 3bde26cae2..6e92ad2813 100644 --- a/patterns/pom.xml +++ b/patterns/pom.xml @@ -28,6 +28,7 @@ intercepting-filter solid clean-architecture + enterprise-patterns diff --git a/persistence-modules/java-jpa-3/README.md b/persistence-modules/java-jpa-3/README.md index 9c9e040825..c024d7c540 100644 --- a/persistence-modules/java-jpa-3/README.md +++ b/persistence-modules/java-jpa-3/README.md @@ -10,3 +10,6 @@ This module contains articles about the Java Persistence API (JPA) in Java. - [JPA CascadeType.REMOVE vs orphanRemoval](https://www.baeldung.com/jpa-cascade-remove-vs-orphanremoval) - [A Guide to MultipleBagFetchException in Hibernate](https://www.baeldung.com/java-hibernate-multiplebagfetchexception) - [How to Convert a Hibernate Proxy to a Real Entity Object](https://www.baeldung.com/hibernate-proxy-to-real-entity-object) +- [Returning an Auto-Generated Id with JPA](https://www.baeldung.com/jpa-get-auto-generated-id) +- [How to Return Multiple Entities In JPA Query](https://www.baeldung.com/jpa-return-multiple-entities) +- [Defining Unique Constraints in JPA](https://www.baeldung.com/jpa-unique-constraints) diff --git a/persistence-modules/java-jpa-3/pom.xml b/persistence-modules/java-jpa-3/pom.xml index 11673935b1..d81bfca5bd 100644 --- a/persistence-modules/java-jpa-3/pom.xml +++ b/persistence-modules/java-jpa-3/pom.xml @@ -68,6 +68,12 @@ ${assertj.version} test + + junit + junit + ${junit.version} + test + diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/IdGeneration/User.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/IdGeneration/User.java new file mode 100644 index 0000000000..88e742adce --- /dev/null +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/IdGeneration/User.java @@ -0,0 +1,41 @@ +package com.baeldung.jpa.IdGeneration; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class User { + + @Id +// @GeneratedValue(strategy = GenerationType.SEQUENCE) + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + private String username; + private String password; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/IdGeneration/UserService.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/IdGeneration/UserService.java new file mode 100644 index 0000000000..9c34ef9bb4 --- /dev/null +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/IdGeneration/UserService.java @@ -0,0 +1,19 @@ +package com.baeldung.jpa.IdGeneration; + +import javax.persistence.EntityManager; +import javax.transaction.Transactional; + +public class UserService { + + EntityManager entityManager; + + public UserService(EntityManager entityManager) { + this.entityManager = entityManager; + } + + @Transactional + public long saveUser(User user){ + entityManager.persist(user); + return user.getId(); + } +} diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/returnmultipleentities/Channel.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/returnmultipleentities/Channel.java new file mode 100644 index 0000000000..7f60dd8de4 --- /dev/null +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/returnmultipleentities/Channel.java @@ -0,0 +1,43 @@ +package com.baeldung.jpa.returnmultipleentities; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import java.util.Objects; + +@Entity +public class Channel { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String code; + + private Long subscriptionId; + + public void setCode(String code) { + this.code = code; + } + + public String getCode() { + return code; + } + + public void setSubscriptionId(Long subscriptionId) { + this.subscriptionId = subscriptionId; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Channel channel = (Channel) o; + return Objects.equals(id, channel.id) && Objects.equals(code, channel.code) && Objects.equals(subscriptionId, channel.subscriptionId); + } + + @Override + public int hashCode() { + return Objects.hash(id, code, subscriptionId); + } +} diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/returnmultipleentities/ReportRepository.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/returnmultipleentities/ReportRepository.java new file mode 100644 index 0000000000..ae574de7d5 --- /dev/null +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/returnmultipleentities/ReportRepository.java @@ -0,0 +1,23 @@ +package com.baeldung.jpa.returnmultipleentities; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import javax.persistence.Query; +import java.util.List; + +public class ReportRepository { + private final EntityManagerFactory emf; + + public ReportRepository() { + emf = Persistence.createEntityManagerFactory("jpa-h2-return-multiple-entities"); + } + + public List find(String email) { + EntityManager entityManager = emf.createEntityManager(); + Query query = entityManager.createQuery("SELECT c, s, u FROM Channel c, Subscription s, User u WHERE c.subscriptionId = s.id AND s.id = u.subscriptionId AND u.email=:email"); + query.setParameter("email", email); + + return query.getResultList(); + } +} diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/returnmultipleentities/Subscription.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/returnmultipleentities/Subscription.java new file mode 100644 index 0000000000..91510ebb9f --- /dev/null +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/returnmultipleentities/Subscription.java @@ -0,0 +1,41 @@ +package com.baeldung.jpa.returnmultipleentities; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import java.util.Objects; + +@Entity +public class Subscription { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String code; + + public void setCode(String code) { + this.code = code; + } + + public String getCode() { + return code; + } + + public Long getId() { + return id; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Subscription subscription = (Subscription) o; + return Objects.equals(id, subscription.id) && Objects.equals(code, subscription.code); + } + + @Override + public int hashCode() { + return Objects.hash(id, code); + } +} diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/returnmultipleentities/User.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/returnmultipleentities/User.java new file mode 100644 index 0000000000..35d546b57d --- /dev/null +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/returnmultipleentities/User.java @@ -0,0 +1,29 @@ +package com.baeldung.jpa.returnmultipleentities; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class User { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String email; + + private Long subscriptionId; + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public void setSubscriptionId(Long subscriptionId) { + this.subscriptionId = subscriptionId; + } +} diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/uniqueconstraints/Address.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/uniqueconstraints/Address.java new file mode 100644 index 0000000000..b20de6a471 --- /dev/null +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/uniqueconstraints/Address.java @@ -0,0 +1,37 @@ +package com.baeldung.jpa.uniqueconstraints; + +import java.io.Serializable; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table +public class Address implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue + private Long id; + + private String streetAddress; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getStreetAddress() { + return streetAddress; + } + + public void setStreetAddress(String streetAddress) { + this.streetAddress = streetAddress; + } +} \ No newline at end of file diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/uniqueconstraints/Person.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/uniqueconstraints/Person.java new file mode 100644 index 0000000000..c5df90df73 --- /dev/null +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/uniqueconstraints/Person.java @@ -0,0 +1,116 @@ +package com.baeldung.jpa.uniqueconstraints; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.Table; +import javax.persistence.UniqueConstraint; + +@Entity +@Table(uniqueConstraints = { @UniqueConstraint(name = "UniqueNumberAndStatus", columnNames = { "personNumber", "isActive" }), + @UniqueConstraint(name = "UniqueSecurityAndDepartment", columnNames = { "securityNumber", "departmentCode" }), + @UniqueConstraint(name = "UniqueNumberAndAddress", columnNames = { "personNumber", "address" }) }) +public class Person implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue + private Long id; + + private String name; + + private String password; + + @Column(unique = true) + private String email; + + @Column(unique = true) + private Long personNumber; + + private Boolean isActive; + + private String securityNumber; + + private String departmentCode; + + @Column(unique = true) + @JoinColumn(name = "addressId", referencedColumnName = "id") + private Address address; + + 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 String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public Long getPersonNumber() { + return personNumber; + } + + public void setPersonNumber(Long personNumber) { + this.personNumber = personNumber; + } + + public Boolean getIsActive() { + return isActive; + } + + public void setIsActive(Boolean isActive) { + this.isActive = isActive; + } + + public String getScode() { + return securityNumber; + } + + public void setScode(String scode) { + this.securityNumber = scode; + } + + public String getDcode() { + return departmentCode; + } + + public void setDcode(String dcode) { + this.departmentCode = dcode; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } +} \ No newline at end of file diff --git a/persistence-modules/java-jpa-3/src/main/resources/META-INF/persistence.xml b/persistence-modules/java-jpa-3/src/main/resources/META-INF/persistence.xml index 19ecae8491..1166aaca71 100644 --- a/persistence-modules/java-jpa-3/src/main/resources/META-INF/persistence.xml +++ b/persistence-modules/java-jpa-3/src/main/resources/META-INF/persistence.xml @@ -97,4 +97,56 @@ + + + org.hibernate.jpa.HibernatePersistenceProvider + com.baeldung.jpa.IdGeneration.User + true + + + + + + + + + + + + + org.hibernate.jpa.HibernatePersistenceProvider + com.baeldung.jpa.uniqueconstraints.Person + com.baeldung.jpa.uniqueconstraints.Address + true + + + + + + + + + + + + + org.hibernate.jpa.HibernatePersistenceProvider + com.baeldung.jpa.returnmultipleentities.Channel + com.baeldung.jpa.returnmultipleentities.Subscription + com.baeldung.jpa.returnmultipleentities.User + com.baeldung.jpa.returnmultipleentities.ReportRepository + true + + + + + + + + + + + + + diff --git a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/IdGeneration/IdGenerationIntegrationTest.java b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/IdGeneration/IdGenerationIntegrationTest.java new file mode 100644 index 0000000000..941ad52344 --- /dev/null +++ b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/IdGeneration/IdGenerationIntegrationTest.java @@ -0,0 +1,47 @@ +package com.baeldung.jpa.IdGeneration; + +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import java.util.UUID; + +public class IdGenerationIntegrationTest { + + private static EntityManager entityManager; + private static UserService service; + + @BeforeClass + public static void setup() { + EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-h2-id-generation"); + entityManager = factory.createEntityManager(); + service = new UserService(entityManager); + } + + @Test + public void whenNewUserIsPersisted_thenEntityHasNoId() { + User user = new User(); + user.setUsername("test"); + user.setPassword(UUID.randomUUID().toString()); + + long index = service.saveUser(user); + Assert.assertEquals(0L, index); + } + + @Test + public void whenTransactionIsControlled_thenEntityHasId() { + User user = new User(); + user.setUsername("test"); + user.setPassword(UUID.randomUUID().toString()); + + entityManager.getTransaction().begin(); + long index = service.saveUser(user); + entityManager.getTransaction().commit(); + + Assert.assertEquals(2L, index); + } + +} diff --git a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/returnmultipleentities/ReturnMultipleEntitiesIntegrationTest.java b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/returnmultipleentities/ReturnMultipleEntitiesIntegrationTest.java new file mode 100644 index 0000000000..eb71060f22 --- /dev/null +++ b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/returnmultipleentities/ReturnMultipleEntitiesIntegrationTest.java @@ -0,0 +1,84 @@ +package com.baeldung.jpa.returnmultipleentities; + +import org.junit.Before; +import org.junit.Test; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +public class ReturnMultipleEntitiesIntegrationTest { + private static EntityManagerFactory factory; + private static EntityManager entityManager; + private ReportRepository reportRepository; + + @Before + public void setup() { + factory = Persistence.createEntityManagerFactory("jpa-h2-return-multiple-entities"); + entityManager = factory.createEntityManager(); + reportRepository = new ReportRepository(); + populateH2DB(); + } + + @Test + public void whenQueryingForMultipleEntitiesInOneQuery_thenJPAReturnsMultipleEntitiesInCorrectOrder() { + List reportDetails = reportRepository.find("user1@gmail.com"); + + assertEquals(2, reportDetails.size()); + + for (Object[] reportDetail : reportDetails) { + assertEquals(3, reportDetail.length); + + Channel channel = (Channel) reportDetail[0]; + Subscription subscription = (Subscription) reportDetail[1]; + User user = (User) reportDetail[2]; + + assertEquals("single", subscription.getCode()); + assertEquals("user1@gmail.com", user.getEmail()); + if (!("eurosport".equals(channel.getCode()) || "hbo".equals(channel.getCode()))) { + fail(); + } + } + } + + private static void populateH2DB() { + entityManager.getTransaction().begin(); + + Subscription single = new Subscription(); + single.setCode("single"); + + Subscription family = new Subscription(); + family.setCode("family"); + + entityManager.persist(single); + entityManager.persist(family); + + Channel bbc = new Channel(); + bbc.setCode("bbc"); + bbc.setSubscriptionId(family.getId()); + + Channel eurosport = new Channel(); + eurosport.setCode("eurosport"); + eurosport.setSubscriptionId(single.getId()); + + Channel hbo = new Channel(); + hbo.setCode("hbo"); + hbo.setSubscriptionId(single.getId()); + + entityManager.persist(bbc); + entityManager.persist(eurosport); + entityManager.persist(hbo); + + User user1 = new User(); + user1.setEmail("user1@gmail.com"); + user1.setSubscriptionId(single.getId()); + + entityManager.persist(user1); + + entityManager.getTransaction().commit(); + } +} diff --git a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/uniqueconstraints/UniqueColumnIntegrationTest.java b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/uniqueconstraints/UniqueColumnIntegrationTest.java new file mode 100644 index 0000000000..ca776ba00b --- /dev/null +++ b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/uniqueconstraints/UniqueColumnIntegrationTest.java @@ -0,0 +1,119 @@ +package com.baeldung.jpa.uniqueconstraints; + +import java.util.Optional; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; + +import org.hibernate.exception.ConstraintViolationException; +import org.junit.Assert; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +public class UniqueColumnIntegrationTest { + + private static EntityManagerFactory factory; + private static EntityManager entityManager; + + @BeforeAll + public static void setup() { + factory = Persistence.createEntityManagerFactory("jpa-unique-constraints"); + entityManager = factory.createEntityManager(); + } + + @Test + public void whenPersistPersonWithSameNumber_thenConstraintViolationException() { + Person person1 = new Person(); + person1.setPersonNumber(2000L); + person1.setEmail("john.beth@gmail.com"); + + Person person2 = new Person(); + person2.setPersonNumber(2000L); + person2.setEmail("anthony.green@gmail.com"); + + entityManager.getTransaction().begin(); + entityManager.persist(person1); + entityManager.getTransaction().commit(); + + entityManager.getTransaction().begin(); + try { + entityManager.persist(person2); + entityManager.getTransaction().commit(); + Assert.fail("Should raise an exception - unique key violation"); + } catch (Exception ex) { + Assert.assertTrue(Optional.of(ex) + .map(Throwable::getCause) + .map(Throwable::getCause) + .filter(x -> x instanceof ConstraintViolationException) + .isPresent()); + } finally { + entityManager.getTransaction().rollback(); + } + } + + @Test + public void whenPersistPersonWithSameEmail_thenConstraintViolationException() { + Person person1 = new Person(); + person1.setPersonNumber(4000L); + person1.setEmail("timm.beth@gmail.com"); + + Person person2 = new Person(); + person2.setPersonNumber(3000L); + person2.setEmail("timm.beth@gmail.com"); + + entityManager.getTransaction().begin(); + entityManager.persist(person1); + entityManager.getTransaction().commit(); + + entityManager.getTransaction().begin(); + try { + entityManager.persist(person2); + entityManager.getTransaction().commit(); + Assert.fail("Should raise an exception - unique key violation"); + } catch (Exception ex) { + Assert.assertTrue(Optional.of(ex) + .map(Throwable::getCause) + .map(Throwable::getCause) + .filter(x -> x instanceof ConstraintViolationException) + .isPresent()); + } finally { + entityManager.getTransaction().rollback(); + } + } + + @Test + public void whenPersistPersonWithSameAddress_thenConstraintViolationException() { + Person person1 = new Person(); + person1.setPersonNumber(5000L); + person1.setEmail("chris.beck@gmail.com"); + + Address address1 = new Address(); + address1.setStreetAddress("20 Street"); + person1.setAddress(address1); + + Person person2 = new Person(); + person2.setPersonNumber(6000L); + person2.setEmail("mark.jonson@gmail.com"); + person2.setAddress(address1); + + entityManager.getTransaction().begin(); + entityManager.persist(person1); + entityManager.getTransaction().commit(); + + entityManager.getTransaction().begin(); + try { + entityManager.persist(person2); + entityManager.getTransaction().commit(); + Assert.fail("Should raise an exception - unique key violation"); + } catch (Exception ex) { + Assert.assertTrue(Optional.of(ex) + .map(Throwable::getCause) + .map(Throwable::getCause) + .filter(x -> x instanceof ConstraintViolationException) + .isPresent()); + } finally { + entityManager.getTransaction().rollback(); + } + } +} \ No newline at end of file diff --git a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/uniqueconstraints/UniqueConstraintIntegrationTest.java b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/uniqueconstraints/UniqueConstraintIntegrationTest.java new file mode 100644 index 0000000000..f12313724e --- /dev/null +++ b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/uniqueconstraints/UniqueConstraintIntegrationTest.java @@ -0,0 +1,116 @@ +package com.baeldung.jpa.uniqueconstraints; + +import java.util.Optional; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; + +import org.hibernate.exception.ConstraintViolationException; +import org.junit.Assert; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +public class UniqueConstraintIntegrationTest { + private static EntityManagerFactory factory; + private static EntityManager entityManager; + + @BeforeAll + public static void setup() { + factory = Persistence.createEntityManagerFactory("jpa-unique-constraints"); + entityManager = factory.createEntityManager(); + } + + @Test + public void whenPersistPersonWithSameNumberAndStatus_thenConstraintViolationException() { + Person person1 = new Person(); + person1.setPersonNumber(12345L); + person1.setIsActive(Boolean.TRUE); + + Person person2 = new Person(); + person2.setPersonNumber(12345L); + person2.setIsActive(Boolean.TRUE); + + entityManager.getTransaction().begin(); + entityManager.persist(person1); + entityManager.getTransaction().commit(); + + entityManager.getTransaction().begin(); + try { + entityManager.persist(person2); + entityManager.getTransaction().commit(); + Assert.fail("Should raise an exception - unique key violation"); + } catch (Exception ex) { + Assert.assertTrue(Optional.of(ex) + .map(Throwable::getCause) + .map(Throwable::getCause) + .filter(x -> x instanceof ConstraintViolationException) + .isPresent()); + } finally { + entityManager.getTransaction().rollback(); + } + } + + @Test + public void whenPersistPersonWithSameSCodeAndDecode_thenConstraintViolationException() { + Person person1 = new Person(); + person1.setDcode("Sec1"); + person1.setScode("Axybg356"); + + Person person2 = new Person(); + person2.setDcode("Sec1"); + person2.setScode("Axybg356"); + + entityManager.getTransaction().begin(); + entityManager.persist(person1); + entityManager.getTransaction().commit(); + + entityManager.getTransaction().begin(); + try { + entityManager.persist(person2); + entityManager.getTransaction().commit(); + Assert.fail("Should raise an exception - unique key violation"); + } catch (Exception ex) { + Assert.assertTrue(Optional.of(ex) + .map(Throwable::getCause) + .map(Throwable::getCause) + .filter(x -> x instanceof ConstraintViolationException) + .isPresent()); + } finally { + entityManager.getTransaction().rollback(); + } + } + + @Test + public void whenPersistPersonWithSameNumberAndAddress_thenConstraintViolationException() { + Address address1 = new Address(); + address1.setStreetAddress("40 Street"); + + Person person1 = new Person(); + person1.setPersonNumber(54321L); + person1.setAddress(address1); + + Person person2 = new Person(); + person2.setPersonNumber(99999L); + person2.setAddress(address1); + + entityManager.getTransaction().begin(); + entityManager.persist(person1); + entityManager.getTransaction().commit(); + + entityManager.getTransaction().begin(); + try { + entityManager.persist(person2); + entityManager.getTransaction().commit(); + Assert.fail("Should raise an exception - unique key violation"); + } catch (Exception ex) { + Assert.assertTrue(Optional.of(ex) + .map(Throwable::getCause) + .map(Throwable::getCause) + .filter(x -> x instanceof ConstraintViolationException) + .isPresent()); + } finally { + entityManager.getTransaction().rollback(); + } + } +} \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-annotations/README.md b/persistence-modules/spring-data-jpa-annotations/README.md index 3892e75733..5a5440b1ed 100644 --- a/persistence-modules/spring-data-jpa-annotations/README.md +++ b/persistence-modules/spring-data-jpa-annotations/README.md @@ -9,6 +9,7 @@ This module contains articles about annotations used in Spring Data JPA - [Spring JPA @Embedded and @EmbeddedId](https://www.baeldung.com/spring-jpa-embedded-method-parameters) - [Programmatic Transaction Management in Spring](https://www.baeldung.com/spring-programmatic-transaction-management) - [JPA Entity Lifecycle Events](https://www.baeldung.com/jpa-entity-lifecycle-events) +- [Overriding Column Definition With @AttributeOverride](https://www.baeldung.com/jpa-attributeoverride) ### Eclipse Config After importing the project into Eclipse, you may see the following error: diff --git a/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Address.java b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Address.java new file mode 100644 index 0000000000..95a3708173 --- /dev/null +++ b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Address.java @@ -0,0 +1,25 @@ +package com.baeldung.attribute.override.entity; + +import javax.persistence.Embeddable; + +@Embeddable +public class Address { + private String name; + private String city; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } +} diff --git a/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Brand.java b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Brand.java new file mode 100644 index 0000000000..9918cbaa70 --- /dev/null +++ b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Brand.java @@ -0,0 +1,29 @@ +package com.baeldung.attribute.override.entity; + +import javax.persistence.Embeddable; +import javax.persistence.Embedded; +import java.time.LocalDate; + +@Embeddable +public class Brand { + private String name; + private LocalDate foundationDate; + @Embedded + private Address address; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public LocalDate getFoundationDate() { + return foundationDate; + } + + public void setFoundationDate(LocalDate foundationDate) { + this.foundationDate = foundationDate; + } +} diff --git a/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Car.java b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Car.java new file mode 100644 index 0000000000..5421090e58 --- /dev/null +++ b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Car.java @@ -0,0 +1,54 @@ +package com.baeldung.attribute.override.entity; + +import javax.persistence.AttributeOverride; +import javax.persistence.AttributeOverrides; +import javax.persistence.Column; +import javax.persistence.ElementCollection; +import javax.persistence.Embedded; +import javax.persistence.Entity; +import java.util.Map; + +@Entity +@AttributeOverride(name = "identifier", column = @Column(name = "VIN")) +public class Car extends Vehicle { + + private String model; + private String name; + @Embedded + @AttributeOverrides({ + @AttributeOverride(name = "name", column = @Column(name = "BRAND_NAME", length = 5)), + @AttributeOverride(name = "address.name", column = @Column(name = "ADDRESS_NAME")) + }) + private Brand brand; + @ElementCollection + @AttributeOverrides({ + @AttributeOverride(name = "key.name", column = @Column(name = "OWNER_NAME")), + @AttributeOverride(name = "key.surname", column = @Column(name = "OWNER_SURNAME")), + @AttributeOverride(name = "value.name", column = @Column(name = "ADDRESS_NAME")), + }) + Map owners; + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Brand getBrand() { + return brand; + } + + public void setBrand(Brand brand) { + this.brand = brand; + } +} diff --git a/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Owner.java b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Owner.java new file mode 100644 index 0000000000..28ef6c7974 --- /dev/null +++ b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Owner.java @@ -0,0 +1,25 @@ +package com.baeldung.attribute.override.entity; + +import javax.persistence.Embeddable; + +@Embeddable +public class Owner { + private String name; + private String surname; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSurname() { + return surname; + } + + public void setSurname(String surname) { + this.surname = surname; + } +} diff --git a/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Vehicle.java b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Vehicle.java new file mode 100644 index 0000000000..2d4c0c04b3 --- /dev/null +++ b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Vehicle.java @@ -0,0 +1,38 @@ +package com.baeldung.attribute.override.entity; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; + +@MappedSuperclass +public class Vehicle { + @Id + @GeneratedValue + private Integer id; + private String identifier; + private Integer numberOfWheels; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getIdentifier() { + return identifier; + } + + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + public Integer getNumberOfWheels() { + return numberOfWheels; + } + + public void setNumberOfWheels(Integer numberOfWheels) { + this.numberOfWheels = numberOfWheels; + } +} diff --git a/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/repository/CarRepository.java b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/repository/CarRepository.java new file mode 100644 index 0000000000..17cea77d89 --- /dev/null +++ b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/repository/CarRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.attribute.override.repository; + +import com.baeldung.attribute.override.entity.Car; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CarRepository extends JpaRepository { +} diff --git a/persistence-modules/spring-data-jpa-annotations/src/test/java/com/baeldung/attribute/override/AttributeOverrideIntegrationTest.java b/persistence-modules/spring-data-jpa-annotations/src/test/java/com/baeldung/attribute/override/AttributeOverrideIntegrationTest.java new file mode 100644 index 0000000000..4cc599c7de --- /dev/null +++ b/persistence-modules/spring-data-jpa-annotations/src/test/java/com/baeldung/attribute/override/AttributeOverrideIntegrationTest.java @@ -0,0 +1,56 @@ +package com.baeldung.attribute.override; + +import com.baeldung.Application; +import com.baeldung.attribute.override.entity.Address; +import com.baeldung.attribute.override.entity.Brand; +import com.baeldung.attribute.override.entity.Car; +import com.baeldung.attribute.override.repository.CarRepository; +import org.assertj.core.api.Assertions; +import org.jetbrains.annotations.NotNull; +import org.junit.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; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = { Application.class }) +public class AttributeOverrideIntegrationTest { + + private static final LocalDate FORD_FOUNDATION_DATE = LocalDate.parse("1903-06-16"); + @Autowired + CarRepository carRepository; + + @Test + @Transactional + public void whenInsertingCar_thenEmbeddedAndMappedFieldsArePopulated() { + + Car fordMustang = createMustang(); + + carRepository.save(fordMustang); + Car actualCar = carRepository.getOne(fordMustang.getId()); + + Assertions.assertThat(actualCar).isEqualTo(fordMustang); + } + + @NotNull + private Car createMustang() { + Address address = new Address(); + address.setName("Ford United States"); + address.setCity("Dearborn"); + + Brand ford = new Brand(); + ford.setName("Ford"); + ford.setFoundationDate(FORD_FOUNDATION_DATE); + + Car fordMustang = new Car(); + fordMustang.setIdentifier("WP1AB29P88LA47599"); + fordMustang.setModel("Ford"); + fordMustang.setName("My car"); + fordMustang.setBrand(ford); + return fordMustang; + } +} diff --git a/persistence-modules/spring-data-jpa-crud/README.md b/persistence-modules/spring-data-jpa-crud/README.md index dc0c78c87e..81559bb773 100644 --- a/persistence-modules/spring-data-jpa-crud/README.md +++ b/persistence-modules/spring-data-jpa-crud/README.md @@ -10,6 +10,7 @@ This module contains articles about CRUD operations in Spring Data JPA - [Batch Insert/Update with Hibernate/JPA](https://www.baeldung.com/jpa-hibernate-batch-insert-update) - [Difference Between save() and saveAndFlush() in Spring Data JPA](https://www.baeldung.com/spring-data-jpa-save-saveandflush) - [Generate Database Schema with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-generate-db-schema) +- [How to Implement a Soft Delete with Spring JPA](https://www.baeldung.com/spring-jpa-soft-delete) ### Eclipse Config After importing the project into Eclipse, you may see the following error: diff --git a/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/Product.java b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/Product.java new file mode 100644 index 0000000000..ef06f77c45 --- /dev/null +++ b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/Product.java @@ -0,0 +1,68 @@ +package com.baeldung.softdelete; + + +import java.io.Serializable; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.hibernate.annotations.Filter; +import org.hibernate.annotations.FilterDef; +import org.hibernate.annotations.ParamDef; +import org.hibernate.annotations.SQLDelete; + +@Entity +@Table(name = "tbl_products") +@SQLDelete(sql = "UPDATE tbl_products SET deleted = true WHERE id=?") +@FilterDef(name = "deletedProductFilter", parameters = @ParamDef(name = "isDeleted", type = "boolean")) +@Filter(name = "deletedProductFilter", condition = "deleted = :isDeleted") +public class Product implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + + private double price; + + private boolean deleted = Boolean.FALSE; + + 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 double getPrice() { + return price; + } + + public void setPrice(double price) { + this.price = price; + } + + public boolean isDeleted() { + return deleted; + } + + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } + +} diff --git a/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductController.java b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductController.java new file mode 100644 index 0000000000..ebfdfbb2e7 --- /dev/null +++ b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductController.java @@ -0,0 +1,34 @@ +package com.baeldung.softdelete; + +import org.springframework.beans.factory.annotation.Autowired; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/products") +public class ProductController { + + @Autowired + private ProductService productService; + + @PostMapping + public Product createOne(@RequestBody Product product) { + return productService.create(product); + } + + @DeleteMapping("/{id}") + public void removeOne(@PathVariable("id") Long id) { + productService.remove(id); + } + + @GetMapping + public Iterable findAll(@RequestParam(value = "isDeleted", required = false, defaultValue = "false") boolean isDeleted) { + return productService.findAll(isDeleted); + } +} diff --git a/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductRepository.java b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductRepository.java new file mode 100644 index 0000000000..a305a142aa --- /dev/null +++ b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.softdelete; + +import org.springframework.data.repository.CrudRepository; + +public interface ProductRepository extends CrudRepository{ + +} diff --git a/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductService.java b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductService.java new file mode 100644 index 0000000000..82d02fa87c --- /dev/null +++ b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductService.java @@ -0,0 +1,35 @@ +package com.baeldung.softdelete; + +import javax.persistence.EntityManager; + +import org.hibernate.Filter; +import org.hibernate.Session; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class ProductService { + + @Autowired + private ProductRepository productRepository; + + @Autowired + private EntityManager entityManager; + + public Product create(Product product) { + return productRepository.save(product); + } + + public void remove(Long id){ + productRepository.deleteById(id); + } + + public Iterable findAll(boolean isDeleted){ + Session session = entityManager.unwrap(Session.class); + Filter filter = session.enableFilter("deletedProductFilter"); + filter.setParameter("isDeleted", isDeleted); + Iterable products = productRepository.findAll(); + session.disableFilter("deletedProductFilter"); + return products; + } +} \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-crud/src/main/resources/application.properties b/persistence-modules/spring-data-jpa-crud/src/main/resources/application.properties index af0df308cd..18ef8d4e60 100644 --- a/persistence-modules/spring-data-jpa-crud/src/main/resources/application.properties +++ b/persistence-modules/spring-data-jpa-crud/src/main/resources/application.properties @@ -5,10 +5,5 @@ spring.jpa.properties.hibernate.order_inserts=true spring.jpa.properties.hibernate.order_updates=true spring.jpa.properties.hibernate.generate_statistics=true -# JPA-Schema-Generation -# Use below configuration to generate database schema create commands based on the entity models -# and export them into the create.sql file -#spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create -#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=create.sql -#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-source=metadata -#spring.jpa.properties.hibernate.format_sql=true \ No newline at end of file +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect + diff --git a/pom.xml b/pom.xml index f4606ec368..686db65e8f 100644 --- a/pom.xml +++ b/pom.xml @@ -1276,6 +1276,7 @@ + spring-boot-modules/spring-boot-cassandre core-java-modules/core-java-9 core-java-modules/core-java-9-improvements core-java-modules/core-java-9-jigsaw @@ -1339,6 +1340,7 @@ core-java-modules/core-java-os core-java-modules/core-java-time-measurements core-java-modules/multimodulemavenproject + core-java-modules/core-java-strings @@ -1404,7 +1406,7 @@ 3.0.0 3.13.0 - 1.16.12 + 1.18.20 1.4.197 diff --git a/reactor-core/src/test/java/com/baeldung/reactor/mapping/MappingUnitTest.java b/reactor-core/src/test/java/com/baeldung/reactor/mapping/MappingUnitTest.java new file mode 100644 index 0000000000..137bcbe021 --- /dev/null +++ b/reactor-core/src/test/java/com/baeldung/reactor/mapping/MappingUnitTest.java @@ -0,0 +1,37 @@ +package com.baeldung.reactor.mapping; + +import org.junit.Test; +import org.reactivestreams.Publisher; +import reactor.core.publisher.Flux; +import reactor.test.StepVerifier; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; + +import static org.assertj.core.api.Assertions.assertThat; + +public class MappingUnitTest { + @Test + public void givenInputStream_whenCallingTheMapOperator_thenItemsAreTransformed() { + Function mapper = String::toUpperCase; + Flux inFlux = Flux.just("baeldung", ".", "com"); + Flux outFlux = inFlux.map(mapper); + + StepVerifier.create(outFlux) + .expectNext("BAELDUNG", ".", "COM") + .expectComplete() + .verify(); + } + + @Test + public void givenInputStream_whenCallingTheFlatMapOperator_thenItemsAreFlatten() { + Function> mapper = s -> Flux.just(s.toUpperCase().split("")); + Flux inFlux = Flux.just("baeldung", ".", "com"); + Flux outFlux = inFlux.flatMap(mapper); + + List output = new ArrayList<>(); + outFlux.subscribe(output::add); + assertThat(output).containsExactlyInAnyOrder("B", "A", "E", "L", "D", "U", "N", "G", ".", "C", "O", "M"); + } +} diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java index bb4e682481..dabfd22056 100644 --- a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java @@ -146,7 +146,7 @@ public class WebClientLoggingIntegrationTest { .exchange() .block(); - verify(mockAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains("domain=.typicode.com;"))); + verify(mockAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains(sampleUrl))); } diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 7c94d5b7d7..53af0de315 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -70,7 +70,6 @@ spring-boot-swagger-jwt spring-boot-testing spring-boot-vue - spring-boot-xml spring-boot-actuator spring-boot-data-2 spring-boot-react diff --git a/spring-boot-modules/spring-boot-admin/spring-boot-admin-client/pom.xml b/spring-boot-modules/spring-boot-admin/spring-boot-admin-client/pom.xml index a565b94c79..eca92ff3a5 100644 --- a/spring-boot-modules/spring-boot-admin/spring-boot-admin-client/pom.xml +++ b/spring-boot-modules/spring-boot-admin/spring-boot-admin-client/pom.xml @@ -60,7 +60,7 @@ - 2.4.0 + 2.4.1 2.0.4.RELEASE diff --git a/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/pom.xml b/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/pom.xml index b53394cdef..63bc286b45 100644 --- a/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/pom.xml +++ b/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/pom.xml @@ -76,8 +76,8 @@ - 2.4.0 - 2.4.0 + 2.4.1 + 2.4.1 1.5.7 2.0.4.RELEASE diff --git a/spring-boot-modules/spring-boot-annotations/README.md b/spring-boot-modules/spring-boot-annotations/README.md index 1b2bca435c..9742661f30 100644 --- a/spring-boot-modules/spring-boot-annotations/README.md +++ b/spring-boot-modules/spring-boot-annotations/README.md @@ -11,3 +11,4 @@ This module contains articles about Spring Boot annotations - [Spring Bean Annotations](https://www.baeldung.com/spring-bean-annotations) - [Difference Between @ComponentScan and @EnableAutoConfiguration in Spring Boot](https://www.baeldung.com/spring-componentscan-vs-enableautoconfiguration) - [Where Should the Spring @Service Annotation Be Kept?](https://www.baeldung.com/spring-service-annotation-placement) +- [Spring Conditional Annotations](https://www.baeldung.com/spring-conditional-annotations) diff --git a/spring-boot-modules/spring-boot-annotations/pom.xml b/spring-boot-modules/spring-boot-annotations/pom.xml index b495c5de04..22572e7492 100644 --- a/spring-boot-modules/spring-boot-annotations/pom.xml +++ b/spring-boot-modules/spring-boot-annotations/pom.xml @@ -24,6 +24,10 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.boot + spring-boot-autoconfigure + org.springframework.boot spring-boot-starter-data-jpa @@ -44,6 +48,11 @@ spring-boot-starter-test test + + org.mockito + mockito-inline + test + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/AdditionalWebConfiguration.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/AdditionalWebConfiguration.java new file mode 100644 index 0000000000..22b41a28e0 --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/AdditionalWebConfiguration.java @@ -0,0 +1,9 @@ +package com.baeldung.annotations.conditional; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnWarDeployment; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConditionalOnWarDeployment +public class AdditionalWebConfiguration { +} diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/ConditionalUtils.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/ConditionalUtils.java new file mode 100644 index 0000000000..7294d843d1 --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/ConditionalUtils.java @@ -0,0 +1,20 @@ +package com.baeldung.annotations.conditional; + +import org.apache.commons.lang3.SystemUtils; +import org.springframework.boot.system.JavaVersion; + +public class ConditionalUtils { + + public static boolean isWindows() { + return SystemUtils.IS_OS_WINDOWS; + } + + public static boolean isJava8() { + return JavaVersion.getJavaVersion().equals(JavaVersion.EIGHT); + } + + public static boolean isJava9() { + return JavaVersion.getJavaVersion().equals(JavaVersion.NINE); + } + +} diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/DevEnvLoggingConfiguration.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/DevEnvLoggingConfiguration.java new file mode 100644 index 0000000000..39f1d568f0 --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/DevEnvLoggingConfiguration.java @@ -0,0 +1,16 @@ +package com.baeldung.annotations.conditional; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Conditional; +import org.springframework.context.annotation.Configuration; + +@Configuration +@Conditional(IsDevEnvCondition.class) +public class DevEnvLoggingConfiguration { + + @Bean + @Conditional(IsDevEnvCondition.class) + LoggingService loggingService() { + return new LoggingService(); + } +} diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/IsDevEnvCondition.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/IsDevEnvCondition.java new file mode 100644 index 0000000000..768cd9f6ed --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/IsDevEnvCondition.java @@ -0,0 +1,13 @@ +package com.baeldung.annotations.conditional; + +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +public class IsDevEnvCondition implements Condition { + + @Override + public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { + return "dev".equals(System.getProperty("env")); + } +} diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/IsWindowsCondition.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/IsWindowsCondition.java new file mode 100644 index 0000000000..24aa4f4b1c --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/IsWindowsCondition.java @@ -0,0 +1,13 @@ +package com.baeldung.annotations.conditional; + +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +public class IsWindowsCondition implements Condition { + + @Override + public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { + return ConditionalUtils.isWindows(); + } +} diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java8Condition.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java8Condition.java new file mode 100644 index 0000000000..c5f5e16d52 --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java8Condition.java @@ -0,0 +1,13 @@ +package com.baeldung.annotations.conditional; + +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +public class Java8Condition implements Condition { + + @Override + public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { + return ConditionalUtils.isJava8(); + } +} diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java8DependedService.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java8DependedService.java new file mode 100644 index 0000000000..ab76dcd930 --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java8DependedService.java @@ -0,0 +1,9 @@ +package com.baeldung.annotations.conditional; + +import org.springframework.context.annotation.Conditional; +import org.springframework.stereotype.Service; + +@Service +@Conditional(Java8Condition.class) +public class Java8DependedService { +} diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java8OrJava9.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java8OrJava9.java new file mode 100644 index 0000000000..77c501ed08 --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java8OrJava9.java @@ -0,0 +1,16 @@ +package com.baeldung.annotations.conditional; + +import org.springframework.boot.autoconfigure.condition.AnyNestedCondition; +import org.springframework.context.annotation.Conditional; + +public class Java8OrJava9 extends AnyNestedCondition { + Java8OrJava9() { + super(ConfigurationPhase.REGISTER_BEAN); + } + + @Conditional(Java8Condition.class) + static class Java8 { } + + @Conditional(Java9Condition.class) + static class Java9 { } +} diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java9Condition.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java9Condition.java new file mode 100644 index 0000000000..2afa8b25a7 --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java9Condition.java @@ -0,0 +1,13 @@ +package com.baeldung.annotations.conditional; + +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +public class Java9Condition implements Condition { + + @Override + public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { + return ConditionalUtils.isJava9(); + } +} diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/LoggingService.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/LoggingService.java new file mode 100644 index 0000000000..e104ec86e1 --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/LoggingService.java @@ -0,0 +1,19 @@ +package com.baeldung.annotations.conditional; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.boot.autoconfigure.condition.ConditionalOnJava; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.system.JavaVersion; +import org.springframework.context.annotation.Conditional; +import org.springframework.stereotype.Service; + +@Service +@Conditional({IsDevEnvCondition.class, IsWindowsCondition.class, Java8Condition.class}) +@ConditionalOnProperty( + value = "logging.enabled", + havingValue = "true", + matchIfMissing = true) +@ConditionalOnExpression("${logging.enabled:true} and '${logging.level}'.equals('DEBUG')") +@ConditionalOnJava(JavaVersion.EIGHT) +public class LoggingService { +} diff --git a/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/ConditionalTestConfiguration.java b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/ConditionalTestConfiguration.java new file mode 100644 index 0000000000..6b23433422 --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/ConditionalTestConfiguration.java @@ -0,0 +1,10 @@ +package com.baeldung.annotations.conditional; + +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.ComponentScan; + +@TestConfiguration +@ComponentScan("com.baeldung.annotations.conditional") +public class ConditionalTestConfiguration { + +} diff --git a/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/DevEnvLoggingConfigurationUnitTest.java b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/DevEnvLoggingConfigurationUnitTest.java new file mode 100644 index 0000000000..e7c1975127 --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/DevEnvLoggingConfigurationUnitTest.java @@ -0,0 +1,52 @@ +package com.baeldung.annotations.conditional; + +import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; + +public class DevEnvLoggingConfigurationUnitTest { + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner(); + + @Test + public void whenDevEnvEnabled_thenDevEnvLoggingConfigurationAndLoggingServiceShouldBeCreated() { + System.setProperty("env", "dev"); + + contextRunner + .withUserConfiguration(ConditionalTestConfiguration.class) + .run(context -> + Assertions.assertNotNull( + context.getBean(DevEnvLoggingConfiguration.class) + ) + ); + contextRunner + .withUserConfiguration(ConditionalTestConfiguration.class) + .run(context -> + Assertions.assertNotNull( + context.getBean(LoggingService.class) + ) + ); + } + + @Test + public void whenDevEnvNotEnabled_thenDevEnvLoggingConfigurationAndLoggingServiceShouldNotBeCreated() { + System.setProperty("env", "not-dev"); + + contextRunner + .withUserConfiguration(ConditionalTestConfiguration.class) + .run(context -> + Assertions.assertThrows(NoSuchBeanDefinitionException.class, () -> + context.getBean(DevEnvLoggingConfiguration.class) + ) + ); + contextRunner + .withUserConfiguration(ConditionalTestConfiguration.class) + .run(context -> + Assertions.assertThrows(NoSuchBeanDefinitionException.class, () -> + context.getBean(LoggingService.class) + ) + ); + } + +} diff --git a/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/IsDevEnvConditionUnitTest.java b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/IsDevEnvConditionUnitTest.java new file mode 100644 index 0000000000..5302fc79dd --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/IsDevEnvConditionUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.annotations.conditional; + +import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.mockito.Mockito; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +public class IsDevEnvConditionUnitTest { + + @Test + public void whenDevEnvEnabled_thenDevEnvConditionShouldPass() { + System.setProperty("env", "dev"); + + Assertions.assertTrue( + new IsDevEnvCondition().matches( + Mockito.mock(ConditionContext.class), Mockito.mock(AnnotatedTypeMetadata.class) + ) + ); + } + + @Test + public void whenDevEnvNotEnabled_thenDevEnvConditionShouldNotPass() { + System.setProperty("env", "not-dev"); + + Assertions.assertFalse( + new IsDevEnvCondition().matches( + Mockito.mock(ConditionContext.class), Mockito.mock(AnnotatedTypeMetadata.class) + ) + ); + } + +} diff --git a/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/IsWindowsConditionUnitTest.java b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/IsWindowsConditionUnitTest.java new file mode 100644 index 0000000000..45ae65a0e2 --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/IsWindowsConditionUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.annotations.conditional; + +import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +public class IsWindowsConditionUnitTest { + + @Test + public void whenOnWindows_thenIsWindowsConditionShouldPass() { + try (MockedStatic theMock = Mockito.mockStatic(ConditionalUtils.class)) { + theMock.when(ConditionalUtils::isWindows) + .thenReturn(true); + Assertions.assertTrue( + new IsWindowsCondition().matches( + Mockito.mock(ConditionContext.class), Mockito.mock(AnnotatedTypeMetadata.class) + ) + ); + } + + } + + @Test + public void whenNotOnWindows_thenIsWindowsConditionShouldNotPass() { + try (MockedStatic theMock = Mockito.mockStatic(ConditionalUtils.class)) { + theMock.when(ConditionalUtils::isWindows) + .thenReturn(false); + Assertions.assertFalse( + new IsWindowsCondition().matches( + Mockito.mock(ConditionContext.class), Mockito.mock(AnnotatedTypeMetadata.class) + ) + ); + } + } + +} diff --git a/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/Java8ConditionUnitTest.java b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/Java8ConditionUnitTest.java new file mode 100644 index 0000000000..0d1b1eded6 --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/Java8ConditionUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.annotations.conditional; + +import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +public class Java8ConditionUnitTest { + + @Test + public void whenOnJava8_thenJava8ConditionShouldPass() { + try (MockedStatic theMock = Mockito.mockStatic(ConditionalUtils.class)) { + theMock.when(ConditionalUtils::isJava8) + .thenReturn(true); + Assertions.assertTrue( + new Java8Condition().matches( + Mockito.mock(ConditionContext.class), Mockito.mock(AnnotatedTypeMetadata.class) + ) + ); + } + + } + + @Test + public void whenNotOnJava8_thenJava8ConditionShouldNotPass() { + try (MockedStatic theMock = Mockito.mockStatic(ConditionalUtils.class)) { + theMock.when(ConditionalUtils::isJava8) + .thenReturn(false); + Assertions.assertFalse( + new Java8Condition().matches( + Mockito.mock(ConditionContext.class), Mockito.mock(AnnotatedTypeMetadata.class) + ) + ); + } + } + +} diff --git a/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/Java9ConditionUnitTest.java b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/Java9ConditionUnitTest.java new file mode 100644 index 0000000000..ce277e81fe --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/Java9ConditionUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.annotations.conditional; + +import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +public class Java9ConditionUnitTest { + + @Test + public void whenOnJava9_thenJava9ConditionShouldPass() { + try (MockedStatic theMock = Mockito.mockStatic(ConditionalUtils.class)) { + theMock.when(ConditionalUtils::isJava9) + .thenReturn(true); + Assertions.assertTrue( + new Java9Condition().matches( + Mockito.mock(ConditionContext.class), Mockito.mock(AnnotatedTypeMetadata.class) + ) + ); + } + + } + + @Test + public void whenNotOnJava9_thenJava9ConditionShouldNotPass() { + try (MockedStatic theMock = Mockito.mockStatic(ConditionalUtils.class)) { + theMock.when(ConditionalUtils::isJava9) + .thenReturn(false); + Assertions.assertFalse( + new Java9Condition().matches( + Mockito.mock(ConditionContext.class), Mockito.mock(AnnotatedTypeMetadata.class) + ) + ); + } + } + +} diff --git a/spring-boot-modules/spring-boot-basic-customization-2/README.md b/spring-boot-modules/spring-boot-basic-customization-2/README.md index bf7e4abb76..f041c1d38a 100644 --- a/spring-boot-modules/spring-boot-basic-customization-2/README.md +++ b/spring-boot-modules/spring-boot-basic-customization-2/README.md @@ -5,3 +5,4 @@ This module contains articles about Spring Boot customization 2 ### Relevant Articles: - [DispatcherServlet and web.xml in Spring Boot](https://www.baeldung.com/spring-boot-dispatcherservlet-web-xml) + - [XML Defined Beans in Spring Boot](https://www.baeldung.com/spring-boot-xml-beans) \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-basic-customization-2/pom.xml b/spring-boot-modules/spring-boot-basic-customization-2/pom.xml index d42a7fd3de..8c1bc22600 100644 --- a/spring-boot-modules/spring-boot-basic-customization-2/pom.xml +++ b/spring-boot-modules/spring-boot-basic-customization-2/pom.xml @@ -23,7 +23,10 @@ org.springframework.boot spring-boot-starter-test - test + + + junit + junit diff --git a/spring-boot-modules/spring-boot-xml/src/main/java/com/baeldung/springbootxml/Pojo.java b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/springbootxml/Pojo.java similarity index 100% rename from spring-boot-modules/spring-boot-xml/src/main/java/com/baeldung/springbootxml/Pojo.java rename to spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/springbootxml/Pojo.java diff --git a/spring-boot-modules/spring-boot-xml/src/main/java/com/baeldung/springbootxml/SpringBootXmlApplication.java b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/springbootxml/SpringBootXmlApplication.java similarity index 100% rename from spring-boot-modules/spring-boot-xml/src/main/java/com/baeldung/springbootxml/SpringBootXmlApplication.java rename to spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/springbootxml/SpringBootXmlApplication.java diff --git a/spring-boot-modules/spring-boot-basic-customization-2/src/main/resources/application.properties b/spring-boot-modules/spring-boot-basic-customization-2/src/main/resources/application.properties index e69de29bb2..ab9de92c82 100644 --- a/spring-boot-modules/spring-boot-basic-customization-2/src/main/resources/application.properties +++ b/spring-boot-modules/spring-boot-basic-customization-2/src/main/resources/application.properties @@ -0,0 +1 @@ +sample=string loaded from properties! \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-xml/src/main/resources/beans.xml b/spring-boot-modules/spring-boot-basic-customization-2/src/main/resources/beans.xml similarity index 100% rename from spring-boot-modules/spring-boot-xml/src/main/resources/beans.xml rename to spring-boot-modules/spring-boot-basic-customization-2/src/main/resources/beans.xml diff --git a/spring-boot-modules/spring-boot-xml/src/main/java/com/baeldung/springbootxml/SpringBootXmlApplicationIntegrationTest.java b/spring-boot-modules/spring-boot-basic-customization-2/src/main/test/com/baeldung/springbootxml/SpringBootXmlApplicationIntegrationTest.java similarity index 99% rename from spring-boot-modules/spring-boot-xml/src/main/java/com/baeldung/springbootxml/SpringBootXmlApplicationIntegrationTest.java rename to spring-boot-modules/spring-boot-basic-customization-2/src/main/test/com/baeldung/springbootxml/SpringBootXmlApplicationIntegrationTest.java index 2c3993d0d8..f3060de82a 100644 --- a/spring-boot-modules/spring-boot-xml/src/main/java/com/baeldung/springbootxml/SpringBootXmlApplicationIntegrationTest.java +++ b/spring-boot-modules/spring-boot-basic-customization-2/src/main/test/com/baeldung/springbootxml/SpringBootXmlApplicationIntegrationTest.java @@ -1,5 +1,6 @@ package com.baeldung.springbootxml; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-boot-modules/spring-boot-cassandre/README.md b/spring-boot-modules/spring-boot-cassandre/README.md new file mode 100644 index 0000000000..4dfef587db --- /dev/null +++ b/spring-boot-modules/spring-boot-cassandre/README.md @@ -0,0 +1,11 @@ +# Cassandre trading bot example + +This project is an example of a trading bot developed with Cassandre + +## Running the examples + +* `mvn test` - Run strategy backtesting +* `mvn spring-boot:run` - Run the bot + +## Relevant Articles +- [Build a Trading Bot with Cassandre Spring Boot Starter](https://www.baeldung.com/cassandre-spring-boot-trading-bot) diff --git a/spring-boot-modules/spring-boot-cassandre/pom.xml b/spring-boot-modules/spring-boot-cassandre/pom.xml new file mode 100644 index 0000000000..75163d2c2b --- /dev/null +++ b/spring-boot-modules/spring-boot-cassandre/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + com.example + demo + 0.0.1-SNAPSHOT + Cassandre trading bot tutorial + Cassandre trading bot tutorial + + 11 + + + + org.springframework.boot + spring-boot-starter + + + + + tech.cassandre.trading.bot + cassandre-trading-bot-spring-boot-starter + 4.2.1 + + + org.knowm.xchange + xchange-kucoin + 5.0.7 + + + org.hsqldb + hsqldb + 2.5.1 + + + + org.springframework.boot + spring-boot-starter-test + test + + + + tech.cassandre.trading.bot + cassandre-trading-bot-spring-boot-starter-test + 4.2.1 + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.4.5 + + + + + diff --git a/spring-boot-modules/spring-boot-cassandre/src/main/java/com/example/demo/DemoApplication.java b/spring-boot-modules/spring-boot-cassandre/src/main/java/com/example/demo/DemoApplication.java new file mode 100644 index 0000000000..094d95b93f --- /dev/null +++ b/spring-boot-modules/spring-boot-cassandre/src/main/java/com/example/demo/DemoApplication.java @@ -0,0 +1,13 @@ +package com.example.demo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DemoApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-cassandre/src/main/java/com/example/demo/MyFirstStrategy.java b/spring-boot-modules/spring-boot-cassandre/src/main/java/com/example/demo/MyFirstStrategy.java new file mode 100644 index 0000000000..ea8ae74aa6 --- /dev/null +++ b/spring-boot-modules/spring-boot-cassandre/src/main/java/com/example/demo/MyFirstStrategy.java @@ -0,0 +1,66 @@ +package com.example.demo; + +import static tech.cassandre.trading.bot.dto.position.PositionStatusDTO.CLOSED; +import static tech.cassandre.trading.bot.dto.position.PositionStatusDTO.OPENED; +import static tech.cassandre.trading.bot.dto.util.CurrencyDTO.BTC; +import static tech.cassandre.trading.bot.dto.util.CurrencyDTO.USDT; + +import java.math.BigDecimal; +import java.util.Optional; +import java.util.Set; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import tech.cassandre.trading.bot.dto.market.TickerDTO; +import tech.cassandre.trading.bot.dto.position.PositionDTO; +import tech.cassandre.trading.bot.dto.position.PositionRulesDTO; +import tech.cassandre.trading.bot.dto.user.AccountDTO; +import tech.cassandre.trading.bot.dto.util.CurrencyPairDTO; +import tech.cassandre.trading.bot.strategy.BasicCassandreStrategy; +import tech.cassandre.trading.bot.strategy.CassandreStrategy; + +@CassandreStrategy +public class MyFirstStrategy extends BasicCassandreStrategy { + + private final Logger logger = LoggerFactory.getLogger(MyFirstStrategy.class); + + @Override + public Set getRequestedCurrencyPairs() { + return Set.of(new CurrencyPairDTO(BTC, USDT)); + } + + @Override + public Optional getTradeAccount(Set accounts) { + return accounts.stream() + .filter(a -> "trade".equals(a.getName())) + .findFirst(); + } + + @Override + public void onTickerUpdate(TickerDTO ticker) { + logger.info("Received a new ticker : {}", ticker); + + if (new BigDecimal("56000").compareTo(ticker.getLast()) == -1) { + + if (canBuy(new CurrencyPairDTO(BTC, USDT), new BigDecimal("0.01"))) { + PositionRulesDTO rules = PositionRulesDTO.builder() + .stopGainPercentage(4f) + .stopLossPercentage(25f) + .build(); + createLongPosition(new CurrencyPairDTO(BTC, USDT), new BigDecimal("0.01"), rules); + } + + } + } + + @Override + public void onPositionStatusUpdate(PositionDTO position) { + if (position.getStatus() == OPENED) { + logger.info("> New position opened : {}", position.getPositionId()); + } + if (position.getStatus() == CLOSED) { + logger.info("> Position closed : {}", position.getDescription()); + } + } + +} diff --git a/spring-boot-modules/spring-boot-cassandre/src/main/resources/application.properties b/spring-boot-modules/spring-boot-cassandre/src/main/resources/application.properties new file mode 100644 index 0000000000..5ecdabd47a --- /dev/null +++ b/spring-boot-modules/spring-boot-cassandre/src/main/resources/application.properties @@ -0,0 +1,22 @@ +# +# Exchange configuration. +cassandre.trading.bot.exchange.name=kucoin +cassandre.trading.bot.exchange.username=kucoin.cassandre.test@gmail.com +cassandre.trading.bot.exchange.passphrase=cassandre +cassandre.trading.bot.exchange.key=6054ad25365ac6000689a998 +cassandre.trading.bot.exchange.secret=af080d55-afe3-47c9-8ec1-4b479fbcc5e7 +# +# Modes +cassandre.trading.bot.exchange.modes.sandbox=true +cassandre.trading.bot.exchange.modes.dry=false +# +# Exchange API calls rates (ms or standard ISO 8601 duration like 'PT5S'). +cassandre.trading.bot.exchange.rates.account=2000 +cassandre.trading.bot.exchange.rates.ticker=2000 +cassandre.trading.bot.exchange.rates.trade=2000 +# +# Database configuration. +cassandre.trading.bot.database.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver +cassandre.trading.bot.database.datasource.url=jdbc:hsqldb:mem:cassandre +cassandre.trading.bot.database.datasource.username=sa +cassandre.trading.bot.database.datasource.password= diff --git a/spring-boot-modules/spring-boot-cassandre/src/test/java/com/example/demo/DemoApplicationTests.java b/spring-boot-modules/spring-boot-cassandre/src/test/java/com/example/demo/DemoApplicationTests.java new file mode 100644 index 0000000000..eaa99696e2 --- /dev/null +++ b/spring-boot-modules/spring-boot-cassandre/src/test/java/com/example/demo/DemoApplicationTests.java @@ -0,0 +1,13 @@ +package com.example.demo; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class DemoApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/spring-boot-modules/spring-boot-cassandre/src/test/java/com/example/demo/MyFirstStrategyUnitTest.java b/spring-boot-modules/spring-boot-cassandre/src/test/java/com/example/demo/MyFirstStrategyUnitTest.java new file mode 100644 index 0000000000..bf7c353821 --- /dev/null +++ b/spring-boot-modules/spring-boot-cassandre/src/test/java/com/example/demo/MyFirstStrategyUnitTest.java @@ -0,0 +1,55 @@ +package com.example.demo; + +import static org.awaitility.Awaitility.await; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static tech.cassandre.trading.bot.dto.position.PositionStatusDTO.OPENED; +import static tech.cassandre.trading.bot.dto.util.CurrencyDTO.USDT; + +import java.util.HashMap; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +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.context.annotation.Import; + +import tech.cassandre.trading.bot.dto.util.CurrencyDTO; +import tech.cassandre.trading.bot.dto.util.GainDTO; +import tech.cassandre.trading.bot.test.mock.TickerFluxMock; + +@SpringBootTest +@Import(TickerFluxMock.class) +@DisplayName("Simple strategy test") +public class MyFirstStrategyUnitTest { + + private final Logger logger = LoggerFactory.getLogger(MyFirstStrategyUnitTest.class); + + @Autowired + private MyFirstStrategy strategy; + + @Autowired + private TickerFluxMock tickerFluxMock; + + @Test + @DisplayName("Check gains") + public void whenTickersArrives_thenCheckGains() { + await().forever().until(() -> tickerFluxMock.isFluxDone()); + + final HashMap gains = strategy.getGains(); + + logger.info("Cumulated gains:"); + gains.forEach((currency, gain) -> logger.info(currency + " : " + gain.getAmount())); + + logger.info("Position still opened :"); + strategy.getPositions() + .values() + .stream() + .filter(p -> p.getStatus().equals(OPENED)) + .forEach(p -> logger.info(" - {} " + p.getDescription())); + + assertTrue(gains.get(USDT).getPercentage() > 0); + } + +} diff --git a/spring-boot-modules/spring-boot-cassandre/src/test/resources/application.properties b/spring-boot-modules/spring-boot-cassandre/src/test/resources/application.properties new file mode 100644 index 0000000000..3d6feb09d7 --- /dev/null +++ b/spring-boot-modules/spring-boot-cassandre/src/test/resources/application.properties @@ -0,0 +1,22 @@ +# +# Exchange configuration. +cassandre.trading.bot.exchange.name=kucoin +cassandre.trading.bot.exchange.username=kucoin.cassandre.test@gmail.com +cassandre.trading.bot.exchange.passphrase=cassandre +cassandre.trading.bot.exchange.key=6054ad25365ac6000689a998 +cassandre.trading.bot.exchange.secret=af080d55-afe3-47c9-8ec1-4b479fbcc5e7 +# +# Modes +cassandre.trading.bot.exchange.modes.sandbox=true +cassandre.trading.bot.exchange.modes.dry=true +# +# Exchange API calls rates (ms or standard ISO 8601 duration like 'PT5S'). +cassandre.trading.bot.exchange.rates.account=2000 +cassandre.trading.bot.exchange.rates.ticker=2000 +cassandre.trading.bot.exchange.rates.trade=2000 +# +# Database configuration. +cassandre.trading.bot.database.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver +cassandre.trading.bot.database.datasource.url=jdbc:hsqldb:mem:cassandre +cassandre.trading.bot.database.datasource.username=sa +cassandre.trading.bot.database.datasource.password= diff --git a/spring-boot-modules/spring-boot-cassandre/src/test/resources/tickers-btc-usdt.tsv b/spring-boot-modules/spring-boot-cassandre/src/test/resources/tickers-btc-usdt.tsv new file mode 100644 index 0000000000..b89bd96bdc --- /dev/null +++ b/spring-boot-modules/spring-boot-cassandre/src/test/resources/tickers-btc-usdt.tsv @@ -0,0 +1,89 @@ +1612569600 38294.4 39195.5 40964.2 38217.5 3882.29460938 153897343.463150723 +1612656000 39195.4 38807.6 39623.6 37341.4 2389.96820017 91972455.834535369 +1612742400 38807.6 46373.5 46767.9 38010 4971.54731481 212132648.426718929 +1612828800 46374.6 46434.8 48139.3 44961 4330.72854712 201891604.027160303 +1612915200 46430 44812.2 47300 43687.5 4351.84907778 198189685.592028516 +1613001600 44806.1 47941.5 48647.6 44005.8 4045.91883504 188171651.974437139 +1613088000 47963.1 47310.7 48958.8 46181.2 3356.01832119 159561721.419695848 +1613174400 47305.4 47152.6 48120.5 46225.5 2740.99221759 129227867.922246174 +1613260800 47152.5 48591.9 49686.9 47026.3 3359.4690565 163299915.839307312 +1613347200 48587.2 47904.4 49003.6 42841.6 3974.98461358 188990056.26923591 +1613433600 47913.1 49147.7 50619.3 47023.9 3599.85370182 176084748.845657596 +1613520000 49147.7 52118.1 52609.6 48931.1 3356.85082847 170893567.530348564 +1613606400 52114.3 51568.9 52522.9 50906.4 2183.18379408 113272339.172174965 +1613692800 51561.1 55890.5 56317.7 50727 3749.6920105 200656740.865959032 +1613779200 55893.6 55851.5 57622.6 53463.3 3394.87226216 190744601.429330887 +1613865600 55851.4 57423 58336.3 55489.6 2514.02340013 143658132.671448082 +1613952000 57420.6 54096.6 57517.8 44160 6125.32442907 330513978.457310237 +1614038400 54085.9 48908.3 54174.2 44900 8048.96505298 389277314.445372085 +1614124800 48902.9 49685.2 51361.9 47003.2 4816.75027676 239303706.844272809 +1614211200 49676.5 47082.7 52019.6 46624.4 3701.80236678 184044004.383578525 +1614297600 47082 46289.6 48408.8 44135 5329.77125908 247604118.914146591 +1614384000 46290.2 46114.4 48381.9 44836.5 2872.64640734 134946360.020429589 +1614470400 46111.3 45141.6 46626.1 43004.3 3940.17863714 175990962.484551548 +1614556800 45136.5 49590.3 49771.3 44958.9 3548.51026561 169389196.772247159 +1614643200 49590.3 48441.2 50201.6 47052.8 2936.94454126 142575425.463057812 +1614729600 48440.6 50345.5 52623.9 48100 3177.38943911 160801620.821885745 +1614816000 50347.6 48374.5 51762.1 47505.7 3624.17683614 178873453.27515484 +1614902400 48374.5 48758.9 49450 46189.8 3697.34556922 176318969.507294567 +1614988800 48746.9 48871.9 49255.1 47001 1949.15311354 94201823.810314647 +1615075200 48885 50930.4 51424.7 48885 2444.3584982 122962479.787996993 +1615161600 50956.6 52377 52387.5 49287.5 2710.99151191 137751640.241286989 +1615248000 52376.9 54867.6 54867.6 51833.8 3070.93581512 165487483.114064122 +1615334400 54867.5 55865.5 57364 52911.4 4049.50553851 224565244.752334892 +1615420800 55863.7 57781.1 58150 54238 3403.69441456 191915265.020541521 +1615507200 57781 57238.5 58057.5 55013.7 4031.0376629 228810606.091302364 +1615593600 57220.7 61180.9 61815.3 56059.3 4394.62318443 259602986.875738328 +1615680000 61174.3 59000 61700 59000 3084.33952274 186155667.656432156 +1615766400 59000 55607.1 60632.9 54525.6 5910.33518227 338468393.188725572 +1615852800 55607.1 56880.3 56918.9 53240.3 7410.49057723 409052587.523700888 +1615939200 56880.3 58875.8 58951.8 54147.5 5828.79026943 328135601.648660052 +1616025600 58882.9 57648.9 60107.7 57000 5073.7458698 297279816.540519693 +1616112000 57648.9 58024.2 59450.1 56071 3727.09434161 217005823.723994618 +1616198400 58024.3 58113.5 59874.6 57825.6 2746.52973805 161565114.165299707 +1616284800 58113.5 57350.2 58591.6 55501 3265.35649781 186845535.507151609 +1616371200 57345.3 54096.1 58415.5 53667 4219.99501831 237141977.003568352 +1616457600 54086.8 54348.4 55823.1 52986.3 4374.34046303 239135883.538398977 +1616544000 54348.4 52307.4 57200 51499.6 6416.76024581 351202326.218690674 +1616630400 52307.1 51301.7 53239.1 50455 7242.6466396 375950351.557038048 +1616716800 51301.7 55032 55062.5 51225.3 4609.48192944 245299757.451540308 +1616803200 55031.9 55820.4 56628.6 53967.5 3634.73588532 200758048.816804103 +1616889600 55820.3 55772.9 56541 54666.6 3158.20452681 176119911.151714842 +1616976000 55772.8 57628.9 58400.5 54926.5 4413.63121553 251384747.301649587 +1617062400 57630.8 58754.6 59351.9 57072.8 3563.87315049 208118726.050535887 +1617148800 58753.2 58745.9 59800 56357.5 4921.45848213 288469053.074870873 +1617235200 58745.5 58735.7 59487.1 57879 3163.98213108 186078130.901422269 +1617321600 58735.7 58963.6 60179.1 58460.7 2553.76427314 151446539.609794648 +1617408000 58963.6 57058.3 59795 56721.2 2512.19109578 147434403.06515736 +1617494400 57052.5 58201.4 58481.2 56432.6 2069.14670128 119228330.17272614 +1617580800 58201.4 59116.2 59254.1 56501 3003.76043377 174821106.684799505 +1617667200 59116.2 57988.3 59497.5 57304.8 2964.86183859 173169186.845682699 +1617753600 57988.3 55958.2 58668.6 55439 5277.04906389 299996660.411940246 +1617840000 55958.2 58076.7 58141 55700.6 3175.60482079 181817013.517575328 +1617926400 58076.7 58131.6 58900 57666.9 3516.19104669 204849717.059779284 +1618012800 58138.2 59770.2 61350 57902.1 5533.50675561 332014577.538990658 +1618099200 59770.2 60007.6 60687.4 59247.6 3896.37426019 233158562.799039154 +1618185600 60007.6 59863.4 61270.7 59417.4 4611.409014 277430208.743380477 +1618272000 59863.4 63578.7 63759.7 59815 6906.310253 430518557.569547626 +1618358400 63578.7 62958.7 64840 61000 7696.509177 487298143.928065301 +1618444800 62954.4 63152.6 63772.1 62023.9 4709.82427144 296178401.81115496 +1618531200 63152.6 61342.6 63509.7 59930.8 8295.32523869 510423835.691643255 +1618617600 61342.7 59995.2 62497.8 59599.6 5367.42979289 328364887.709585395 +1618704000 59995.3 56150.6 60409.5 49001 11485.97101449 637797282.448645379 +1618790400 56152.7 55618.8 57583.4 54205.2 7721.306905 432634348.931871989 +1618876800 55618.7 56427.8 57061.6 53328 8677.75606016 480164200.559836543 +1618963200 56426.1 53793.6 56761.7 53602 6240.82191836 345339357.806167462 +1619049600 53793.5 51696.4 55474.7 50400 8879.16016304 475394174.249706678 +1619136000 51691.2 51102.7 52112.1 47502.1 8885.07060366 441295812.644904319 +1619222400 51109.8 50033 51157.9 48676.5 4833.41744745 241336360.887795675 +1619308800 50041.5 49086.9 50554.6 46966.2 4805.34664069 237153315.222670555 +1619395200 49069 54000.2 54336.4 48775.8 6695.12934907 353727728.269533971 +1619481600 53997.1 55014.3 55439 53240.8 4344.22291318 237020455.905144335 +1619568000 55014.2 54833.2 56399.1 53808.3 4801.04618634 262912695.604761319 +1619654400 54833.1 53558.4 55181.2 52340.1 4356.05177188 234153663.397444462 +1619740800 53558.5 57697.3 57936.4 53042.6 5000.47557303 277531927.921795199 +1619827200 57697.3 57794.7 58471.4 57006.3 3639.78966647 210179438.189007639 +1619913600 57794.7 56568.5 57903.7 56044.3 3508.52428767 199206958.05741809 +1620000000 56568.5 57159.7 58977.9 56451.3 4780.43387226 276554749.540429296 +1620086400 57159.7 53196.3 57188.2 53083.3 7079.55804728 390469293.396018923 +1620172800 53196.3 57834.5 57979.7 52888 4224.63060355 233779565.506303973 diff --git a/spring-boot-modules/spring-boot-cassandre/src/test/resources/user-trade.tsv b/spring-boot-modules/spring-boot-cassandre/src/test/resources/user-trade.tsv new file mode 100644 index 0000000000..d0fa4e9767 --- /dev/null +++ b/spring-boot-modules/spring-boot-cassandre/src/test/resources/user-trade.tsv @@ -0,0 +1,3 @@ +BTC 1 +USDT 100000 +ETH 10 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-exceptions/pom.xml b/spring-boot-modules/spring-boot-exceptions/pom.xml index c0c335f55c..9866c418be 100644 --- a/spring-boot-modules/spring-boot-exceptions/pom.xml +++ b/spring-boot-modules/spring-boot-exceptions/pom.xml @@ -15,6 +15,14 @@ ../ + + + + org.springframework.boot + spring-boot-starter-web + + + spring-boot-exceptions diff --git a/spring-boot-modules/spring-boot-exceptions/src/test/java/com/baeldung/applicationcontextexception/MainEntryPoint.java b/spring-boot-modules/spring-boot-exceptions/src/test/java/com/baeldung/applicationcontextexception/MainEntryPoint.java new file mode 100644 index 0000000000..c187399636 --- /dev/null +++ b/spring-boot-modules/spring-boot-exceptions/src/test/java/com/baeldung/applicationcontextexception/MainEntryPoint.java @@ -0,0 +1,14 @@ +package com.baeldung.applicationcontextexception; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +//Remove this annotation to produce ApplicationContextException error +@SpringBootApplication +public class MainEntryPoint { + + public static void main(String[] args) { + SpringApplication.run(MainEntryPoint.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/WebController.java b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/WebController.java index 3bafe1f195..bbd96c8135 100644 --- a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/WebController.java +++ b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/WebController.java @@ -8,6 +8,8 @@ import java.security.Principal; import org.springframework.beans.factory.annotation.Autowired; +import javax.servlet.http.HttpServletRequest; + @Controller public class WebController { @@ -19,6 +21,12 @@ public class WebController { return "external"; } + @GetMapping("/logout") + public String logout(HttpServletRequest request) throws Exception { + request.logout(); + return "redirect:/"; + } + @GetMapping(path = "/customers") public String customers(Principal principal, Model model) { addCustomers(); diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/resources/templates/customers.html b/spring-boot-modules/spring-boot-keycloak/src/main/resources/templates/customers.html index 5a060d31da..de2df93ef1 100644 --- a/spring-boot-modules/spring-boot-keycloak/src/main/resources/templates/customers.html +++ b/spring-boot-modules/spring-boot-keycloak/src/main/resources/templates/customers.html @@ -27,6 +27,7 @@ + Logout diff --git a/spring-boot-modules/spring-boot-mvc-3/README.md b/spring-boot-modules/spring-boot-mvc-3/README.md index bc3eb9e496..f9c6989b3c 100644 --- a/spring-boot-modules/spring-boot-mvc-3/README.md +++ b/spring-boot-modules/spring-boot-mvc-3/README.md @@ -9,4 +9,5 @@ This module contains articles about Spring Web MVC in Spring Boot projects. - [Spring MVC Async vs Spring WebFlux](https://www.baeldung.com/spring-mvc-async-vs-webflux) - [Differences in @Valid and @Validated Annotations in Spring](https://www.baeldung.com/spring-valid-vs-validated) - [CharacterEncodingFilter In SpringBoot](https://www.baeldung.com/spring-boot-characterencodingfilter) +- [HandlerInterceptors vs. Filters in Spring MVC](https://www.baeldung.com/spring-mvc-handlerinterceptor-vs-filter) - More articles: [[prev -->]](/spring-boot-modules/spring-boot-mvc-2) diff --git a/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/filtersinterceptors/FilterInterceptorApp.java b/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/filtersinterceptors/FilterInterceptorApp.java new file mode 100644 index 0000000000..b1e6badd43 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/filtersinterceptors/FilterInterceptorApp.java @@ -0,0 +1,11 @@ +package com.baeldung.filtersinterceptors; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication(scanBasePackages = "com.baeldung.filtersinterceptors") +public class FilterInterceptorApp { + public static void main(String[] args) { + SpringApplication.run(FilterInterceptorApp.class, args); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/filtersinterceptors/HelloConroller.java b/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/filtersinterceptors/HelloConroller.java new file mode 100644 index 0000000000..db2da63d43 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/filtersinterceptors/HelloConroller.java @@ -0,0 +1,19 @@ +package com.baeldung.filtersinterceptors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class HelloConroller { + + private Logger logger = LoggerFactory.getLogger(HelloConroller.class); + + @GetMapping("/hello") + public String hello() { + logger.info("Hello from the controller"); + return "hello"; + } + +} diff --git a/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/filtersinterceptors/LogFilter.java b/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/filtersinterceptors/LogFilter.java new file mode 100644 index 0000000000..dc78cfbbb9 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/filtersinterceptors/LogFilter.java @@ -0,0 +1,26 @@ +package com.baeldung.filtersinterceptors; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class LogFilter implements Filter { + + private Logger logger = LoggerFactory.getLogger(LogFilter.class); + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + logger.info("Hello from: " + request.getLocalAddr()); + chain.doFilter(request, response); + } + +} diff --git a/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/filtersinterceptors/LogInterceptor.java b/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/filtersinterceptors/LogInterceptor.java new file mode 100644 index 0000000000..b43b69415a --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/filtersinterceptors/LogInterceptor.java @@ -0,0 +1,32 @@ +package com.baeldung.filtersinterceptors; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +public class LogInterceptor implements HandlerInterceptor { + + private Logger logger = LoggerFactory.getLogger(LogInterceptor.class); + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + logger.info("preHandle"); + return true; + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + logger.info("postHandle"); + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + logger.info("afterCompletion"); + } + +} diff --git a/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/filtersinterceptors/WebMvcConfig.java b/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/filtersinterceptors/WebMvcConfig.java new file mode 100644 index 0000000000..9f4c1c2166 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/filtersinterceptors/WebMvcConfig.java @@ -0,0 +1,15 @@ +package com.baeldung.filtersinterceptors; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebMvcConfig implements WebMvcConfigurer { + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new LogInterceptor()); + } + +} diff --git a/spring-boot-modules/spring-boot-mvc-3/src/main/resources/templates/hello.html b/spring-boot-modules/spring-boot-mvc-3/src/main/resources/templates/hello.html new file mode 100644 index 0000000000..9a9b0e707b --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-3/src/main/resources/templates/hello.html @@ -0,0 +1,10 @@ + + + +Spring Filters vs Interceptors + + + +

Hello

+ + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/sampleapp/config/MaxHTTPHeaderSizeConfig.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/sampleapp/config/MaxHTTPHeaderSizeConfig.java new file mode 100644 index 0000000000..0a71f914db --- /dev/null +++ b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/sampleapp/config/MaxHTTPHeaderSizeConfig.java @@ -0,0 +1,15 @@ +package com.baeldung.sampleapp.config; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@ComponentScan({ "com.baeldung.sampleapp.web" }) +public class MaxHTTPHeaderSizeConfig implements WebMvcConfigurer { + + public MaxHTTPHeaderSizeConfig() { + super(); + } + +} diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/sampleapp/web/controller/MaxHttpHeaderSizeController.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/sampleapp/web/controller/MaxHttpHeaderSizeController.java new file mode 100644 index 0000000000..0c55f88fa1 --- /dev/null +++ b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/sampleapp/web/controller/MaxHttpHeaderSizeController.java @@ -0,0 +1,17 @@ +package com.baeldung.sampleapp.web.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping(value = "/request-header-test") +public class MaxHttpHeaderSizeController { + + @GetMapping + public boolean testMaxHTTPHeaderSize(@RequestHeader(value = "token") String token) { + return true; + } + +} diff --git a/spring-boot-modules/spring-boot-runtime/src/test/java/com/baeldung/web/controller/MaxHttpHeaderSizeControllerIntegrationTest.java b/spring-boot-modules/spring-boot-runtime/src/test/java/com/baeldung/web/controller/MaxHttpHeaderSizeControllerIntegrationTest.java new file mode 100644 index 0000000000..9b839f34a0 --- /dev/null +++ b/spring-boot-modules/spring-boot-runtime/src/test/java/com/baeldung/web/controller/MaxHttpHeaderSizeControllerIntegrationTest.java @@ -0,0 +1,48 @@ +package com.baeldung.web.controller; + +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import com.baeldung.sampleapp.config.WebConfig; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = WebConfig.class) +@WebAppConfiguration +public class MaxHttpHeaderSizeControllerIntegrationTest { + + private MockMvc mockMvc; + + @Autowired + private WebApplicationContext webApplicationContext; + + @Before + public void setUp() { + mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); + } + + @Test + public void givenTokenWithLessThan8KBLegth_whenSendGetRequest_thenReturnsOK() throws Exception { + mockMvc.perform(get("/request-header-test").contentType(MediaType.APPLICATION_JSON_VALUE) + .with(httpBasic("user", "password")).header("token", "token")).andExpect(status().isOk()); + } + + @Test + public void givenTokenIsMissingInHeade_whenSendGetRequest_thenThrowsBadRequest() throws Exception { + mockMvc.perform(get("/request-header-test").contentType(MediaType.APPLICATION_JSON_VALUE) + .with(httpBasic("user", "password"))).andExpect(status().isBadRequest()); + } + +} diff --git a/spring-boot-modules/spring-boot-runtime/src/test/java/com/baeldung/web/controller/MaxHttpHeaderSizeControllerLiveTest.java b/spring-boot-modules/spring-boot-runtime/src/test/java/com/baeldung/web/controller/MaxHttpHeaderSizeControllerLiveTest.java new file mode 100644 index 0000000000..9c7e7c9029 --- /dev/null +++ b/spring-boot-modules/spring-boot-runtime/src/test/java/com/baeldung/web/controller/MaxHttpHeaderSizeControllerLiveTest.java @@ -0,0 +1,53 @@ +package com.baeldung.web.controller; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestTemplate; + +import com.baeldung.sampleapp.config.MaxHTTPHeaderSizeConfig; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { MaxHTTPHeaderSizeConfig.class }, loader = AnnotationConfigContextLoader.class) +@ActiveProfiles("test") +// Start MaxHttpHeaderSizeController Spring Boot App(MainApplication) first +public class MaxHttpHeaderSizeControllerLiveTest { + + @Test(expected = HttpClientErrorException.class) + public void givenTokenWithGreaterThan8KBLegth_whenSendGetRequest_thenThrowsBadRequest() throws Exception { + final String url = "http://localhost:8080/request-header-test"; + HttpHeaders headers = new HttpHeaders(); + headers.set("token", readRandomStringFromFile()); + + HttpEntity entity = new HttpEntity(headers); + final ResponseEntity response = new RestTemplate().exchange(url, HttpMethod.GET, entity, String.class); + } + + static String readRandomStringFromFile() throws IOException { + BufferedReader reader = new BufferedReader(new FileReader("src/test/resources/randomSringForheader.txt")); + StringBuilder stringBuilder = new StringBuilder(); + String line = null; + String ls = System.getProperty("line.separator"); + while ((line = reader.readLine()) != null) { + stringBuilder.append(line); + stringBuilder.append(ls); + } + stringBuilder.deleteCharAt(stringBuilder.length() - 1); + reader.close(); + String content = stringBuilder.toString(); + return content; + } + +} diff --git a/spring-boot-modules/spring-boot-runtime/src/test/resources/randomSringForheader.txt b/spring-boot-modules/spring-boot-runtime/src/test/resources/randomSringForheader.txt new file mode 100644 index 0000000000..444be3479e --- /dev/null +++ b/spring-boot-modules/spring-boot-runtime/src/test/resources/randomSringForheader.txt @@ -0,0 +1 @@ +eyJraWQiOiIyMTM1MGE2NC02YTYxLTRiNmYtYjIyZS1lYTNkOTNiY2YyMTQiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI0NjE3Zjk4NC1mY2VlLTRmNTctYTg3Yi1jNTcyOTA2ODk3NzkiLCJpc3MiOiJodHRwczovL2FwaS50ZXNjby5jb20vaWRlbnRpdHkvdjQvaXNzdWUtdG9rZW4iLCJzdWIiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJpYXQiOjE2MjE4Mzk4NDcsIm5iZiI6MTYyMTgzOTg0NywiZXhwIjoxNjIxODQzNDQ3LCJzY29wZSI6ImludGVybmFsIHB1YmxpYyIsImNvbmZpZGVuY2VfbGV2ZWwiOjEyLCJjbGllbnRfaWQiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJ0b2tlbl90eXBlIjoiYmVhcmVyIn0.QylY2akATMYkwcBWDQsfUAcY4y27mgKz1NIG78oNjUqCEskMDjWTPM6ZS5neE7CUso72p1ud8BDl8B0SIiRTlCVoaZxVZzUqOlM1ZJQKah-w9KFtZ48cdS_qKYxa2gp82suF-Q-lbWwPAqS-AYTcFaNMqsVlsCDCtOVoB-ALpa5mh0z6tQkqjU7uhsWut3fkKLmMym8x8ejnDth2QdjGIvSXHbYWRH0kYPFDZKS6jHsFOzGGiCHfn201UQLEVLbwL7knyQ8qQ5wolwdNymr364s1CT0A9VHIAfLVSscVIV0ae3rUoqUtjKrbSfXfntIpRyUm66INAbBgyFiWh3yRxgeyJraWQiOiIyMTM1MGE2NC02YTYxLTRiNmYtYjIyZS1lYTNkOTNiY2YyMTQiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI0NjE3Zjk4NC1mY2VlLTRmNTctYTg3Yi1jNTcyOTA2ODk3NzkiLCJpc3MiOiJodHRwczovL2FwaS50ZXNjby5jb20vaWRlbnRpdHkvdjQvaXNzdWUtdG9rZW4iLCJzdWIiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJpYXQiOjE2MjE4Mzk4NDcsIm5iZiI6MTYyMTgzOTg0NywiZXhwIjoxNjIxODQzNDQ3LCJzY29wZSI6ImludGVybmFsIHB1YmxpYyIsImNvbmZpZGVuY2VfbGV2ZWwiOjEyLCJjbGllbnRfaWQiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJ0b2tlbl90eXBlIjoiYmVhcmVyIn0.QylY2akATMYkwcBWDQsfUAcY4y27mgKz1NIG78oNjUqCEskMDjWTPM6ZS5neE7CUso72p1ud8BDl8B0SIiRTlCVoaZxVZzUqOlM1ZJQKah-w9KFtZ48cdS_qKYxa2gp82suF-Q-lbWwPAqS-AYTcFaNMqsVlsCDCtOVoB-ALpa5mh0z6tQkqjU7uhsWut3fkKLmMym8x8ejnDth2QdjGIvSXHbYWRH0kYPFDZKS6jHsFOzGGiCHfn201UQLEVLbwL7knyQ8qQ5wolwdNymr364s1CT0A9VHIAfLVSscVIV0ae3rUoqUtjKrbSfXfntIpRyUm66INAbBgyFiWh3yRxgeyJraWQiOiIyMTM1MGE2NC02YTYxLTRiNmYtYjIyZS1lYTNkOTNiY2YyMTQiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI0NjE3Zjk4NC1mY2VlLTRmNTctYTg3Yi1jNTcyOTA2ODk3NzkiLCJpc3MiOiJodHRwczovL2FwaS50ZXNjby5jb20vaWRlbnRpdHkvdjQvaXNzdWUtdG9rZW4iLCJzdWIiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJpYXQiOjE2MjE4Mzk4NDcsIm5iZiI6MTYyMTgzOTg0NywiZXhwIjoxNjIxODQzNDQ3LCJzY29wZSI6ImludGVybmFsIHB1YmxpYyIsImNvbmZpZGVuY2VfbGV2ZWwiOjEyLCJjbGllbnRfaWQiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJ0b2tlbl90eXBlIjoiYmVhcmVyIn0.QylY2akATMYkwcBWDQsfUAcY4y27mgKz1NIG78oNjUqCEskMDjWTPM6ZS5neE7CUso72p1ud8BDl8B0SIiRTlCVoaZxVZzUqOlM1ZJQKah-w9KFtZ48cdS_qKYxa2gp82suF-Q-lbWwPAqS-AYTcFaNMqsVlsCDCtOVoB-ALpa5mh0z6tQkqjU7uhsWut3fkKLmMym8x8ejnDth2QdjGIvSXHbYWRH0kYPFDZKS6jHsFOzGGiCHfn201UQLEVLbwL7knyQ8qQ5wolwdNymr364s1CT0A9VHIAfLVSscVIV0ae3rUoqUtjKrbSfXfntIpRyUm66INAbBgyFiWh3yRxgeyJraWQiOiIyMTM1MGE2NC02YTYxLTRiNmYtYjIyZS1lYTNkOTNiY2YyMTQiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI0NjE3Zjk4NC1mY2VlLTRmNTctYTg3Yi1jNTcyOTA2ODk3NzkiLCJpc3MiOiJodHRwczovL2FwaS50ZXNjby5jb20vaWRlbnRpdHkvdjQvaXNzdWUtdG9rZW4iLCJzdWIiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJpYXQiOjE2MjE4Mzk4NDcsIm5iZiI6MTYyMTgzOTg0NywiZXhwIjoxNjIxODQzNDQ3LCJzY29wZSI6ImludGVybmFsIHB1YmxpYyIsImNvbmZpZGVuY2VfbGV2ZWwiOjEyLCJjbGllbnRfaWQiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJ0b2tlbl90eXBlIjoiYmVhcmVyIn0.QylY2akATMYkwcBWDQsfUAcY4y27mgKz1NIG78oNjUqCEskMDjWTPM6ZS5neE7CUso72p1ud8BDl8B0SIiRTlCVoaZxVZzUqOlM1ZJQKah-w9KFtZ48cdS_qKYxa2gp82suF-Q-lbWwPAqS-AYTcFaNMqsVlsCDCtOVoB-ALpa5mh0z6tQkqjU7uhsWut3fkKLmMym8x8ejnDth2QdjGIvSXHbYWRH0kYPFDZKS6jHsFOzGGiCHfn201UQLEVLbwL7knyQ8qQ5wolwdNymr364s1CT0A9VHIAfLVSscVIV0ae3rUoqUtjKrbSfXfntIpRyUm66INAbBgyFiWh3yRxgeyJraWQiOiIyMTM1MGE2NC02YTYxLTRiNmYtYjIyZS1lYTNkOTNiY2YyMTQiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI0NjE3Zjk4NC1mY2VlLTRmNTctYTg3Yi1jNTcyOTA2ODk3NzkiLCJpc3MiOiJodHRwczovL2FwaS50ZXNjby5jb20vaWRlbnRpdHkvdjQvaXNzdWUtdG9rZW4iLCJzdWIiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJpYXQiOjE2MjE4Mzk4NDcsIm5iZiI6MTYyMTgzOTg0NywiZXhwIjoxNjIxODQzNDQ3LCJzY29wZSI6ImludGVybmFsIHB1YmxpYyIsImNvbmZpZGVuY2VfbGV2ZWwiOjEyLCJjbGllbnRfaWQiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJ0b2tlbl90eXBlIjoiYmVhcmVyIn0.QylY2akATMYkwcBWDQsfUAcY4y27mgKz1NIG78oNjUqCEskMDjWTPM6ZS5neE7CUso72p1ud8BDl8B0SIiRTlCVoaZxVZzUqOlM1ZJQKah-w9KFtZ48cdS_qKYxa2gp82suF-Q-lbWwPAqS-AYTcFaNMqsVlsCDCtOVoB-ALpa5mh0z6tQkqjU7uhsWut3fkKLmMym8x8ejnDth2QdjGIvSXHbYWRH0kYPFDZKS6jHsFOzGGiCHfn201UQLEVLbwL7knyQ8qQ5wolwdNymr364s1CT0A9VHIAfLVSscVIV0ae3rUoqUtjKrbSfXfntIpRyUm66INAbBgyFiWh3yRxgeyJraWQiOiIyMTM1MGE2NC02YTYxLTRiNmYtYjIyZS1lYTNkOTNiY2YyMTQiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI0NjE3Zjk4NC1mY2VlLTRmNTctYTg3Yi1jNTcyOTA2ODk3NzkiLCJpc3MiOiJodHRwczovL2FwaS50ZXNjby5jb20vaWRlbnRpdHkvdjQvaXNzdWUtdG9rZW4iLCJzdWIiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJpYXQiOjE2MjE4Mzk4NDcsIm5iZiI6MTYyMTgzOTg0NywiZXhwIjoxNjIxODQzNDQ3LCJzY29wZSI6ImludGVybmFsIHB1YmxpYyIsImNvbmZpZGVuY2VfbGV2ZWwiOjEyLCJjbGllbnRfaWQiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJ0b2tlbl90eXBlIjoiYmVhcmVyIn0.QylY2akATMYkwcBWDQsfUAcY4y27mgKz1NIG78oNjUqCEskMDjWTPM6ZS5neE7CUso72p1ud8BDl8B0SIiRTlCVoaZxVZzUqOlM1ZJQKah-w9KFtZ48cdS_qKYxa2gp82suF-Q-lbWwPAqS-AYTcFaNMqsVlsCDCtOVoB-ALpa5mh0z6tQkqjU7uhsWut3fkKLmMym8x8ejnDth2QdjGIvSXHbYWRH0kYPFDZKS6jHsFOzGGiCHfn201UQLEVLbwL7knyQ8qQ5wolwdNymr364s1CT0A9VHIAfLVSscVIV0ae3rUoqUtjKrbSfXfntIpRyUm66INAbBgyFiWh3yRxgeyJraWQiOiIyMTM1MGE2NC02YTYxLTRiNmYtYjIyZS1lYTNkOTNiY2YyMTQiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI0NjE3Zjk4NC1mY2VlLTRmNTctYTg3Yi1jNTcyOTA2ODk3NzkiLCJpc3MiOiJodHRwczovL2FwaS50ZXNjby5jb20vaWRlbnRpdHkvdjQvaXNzdWUtdG9rZW4iLCJzdWIiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJpYXQiOjE2MjE4Mzk4NDcsIm5iZiI6MTYyMTgzOTg0NywiZXhwIjoxNjIxODQzNDQ3LCJzY29wZSI6ImludGVybmFsIHB1YmxpYyIsImNvbmZpZGVuY2VfbGV2ZWwiOjEyLCJjbGllbnRfaWQiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJ0b2tlbl90eXBlIjoiYmVhcmVyIn0.QylY2akATMYkwcBWDQsfUAcY4y27mgKz1NIG78oNjUqCEskMDjWTPM6ZS5neE7CUso72p1ud8BDl8B0SIiRTlCVoaZxVZzUqOlM1ZJQKah-w9KFtZ48cdS_qKYxa2gp82suF-Q-lbWwPAqS-AYTcFaNMqsVlsCDCtOVoB-ALpa5mh0z6tQkqjU7uhsWut3fkKLmMym8x8ejnDth2QdjGIvSXHbYWRH0kYPFDZKS6jHsFOzGGiCHfn201UQLEVLbwL7knyQ8qQ5wolwdNymr364s1CT0A9VHIAfLVSscVIV0ae3rUoqUtjKrbSfXfntIpRyUm66INAbBgyFiWh3yRxgeyJraWQiOiIyMTM1MGE2NC02YTYxLTRiNmYtYjIyZS1lYTNkOTNiY2YyMTQiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI0NjE3Zjk4NC1mY2VlLTRmNTctYTg3Yi1jNTcyOTA2ODk3NzkiLCJpc3MiOiJodHRwczovL2FwaS50ZXNjby5jb20vaWRlbnRpdHkvdjQvaXNzdWUtdG9rZW4iLCJzdWIiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJpYXQiOjE2MjE4Mzk4NDcsIm5iZiI6MTYyMTgzOTg0NywiZXhwIjoxNjIxODQzNDQ3LCJzY29wZSI6ImludGVybmFsIHB1YmxpYyIsImNvbmZpZGVuY2VfbGV2ZWwiOjEyLCJjbGllbnRfaWQiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJ0b2tlbl90eXBlIjoiYmVhcmVyIn0.QylY2akATMYkwcBWDQsfUAcY4y27mgKz1NIG78oNjUqCEskMDjWTPM6ZS5neE7CUso72p1ud8BDl8B0SIiRTlCVoaZxVZzUqOlM1ZJQKah-w9KFtZ48cdS_qKYxa2gp82suF-Q-lbWwPAqS-AYTcFaNMqsVlsCDCtOVoB-ALpa5mh0z6tQkqjU7uhsWut3fkKLmMym8x8ejnDth2QdjGIvSXHbYWRH0kYPFDZKS6jHsFOzGGiCHfn201UQLEVLbwL7knyQ8qQ5wolwdNymr364s1CT0A9VHIAfLVSscVIV0ae3rUoqUtjKrbSfXfntIpRyUm66INAbBgyFiWh3yRxgeyJraWQiOiIyMTM1MGE2NC02YTYxLTRiNmYtYjIyZS1lYTNkOTNiY2YyMTQiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI0NjE3Zjk4NC1mY2VlLTRmNTctYTg3Yi1jNTcyOTA2ODk3NzkiLCJpc3MiOiJodHRwczovL2FwaS50ZXNjby5jb20vaWRlbnRpdHkvdjQvaXNzdWUtdG9rZW4iLCJzdWIiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJpYXQiOjE2MjE4Mzk4NDcsIm5iZiI6MTYyMTgzOTg0NywiZXhwIjoxNjIxODQzNDQ3LCJzY29wZSI6ImludGVybmFsIHB1YmxpYyIsImNvbmZpZGVuY2VfbGV2ZWwiOjEyLCJjbGllbnRfaWQiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJ0b2tlbl90eXBlIjoiYmVhcmVyIn0.QylY2akATMYkwcBWDQsfUAcY4y27mgKz1NIG78oNjUqCEskMDjWTPM6ZS5neE7CUso72p1ud8BDl8B0SIiRTlCVoaZxVZzUqOlM1ZJQKah-w9KFtZ48cdS_qKYxa2gp82suF-Q-lbWwPAqS-AYTcFaNMqsVlsCDCtOVoB-ALpa5mh0z6tQkqjU7uhsWut3fkKLmMym8x8ejnDth2QdjGIvSXHbYWRH0kYPFDZKS6jHsFOzGGiCHfn201UQLEVLbwL7knyQ8qQ5wolwdNymr364s1CT0A9VHIAfLVSscVIV0ae3rUoqUtjKrbSfXfntIpRyUm66INAbBgyFiWh3yRxgeyJraWQiOiIyMTM1MGE2NC02YTYxLTRiNmYtYjIyZS1lYTNkOTNiY2YyMTQiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI0NjE3Zjk4NC1mY2VlLTRmNTctYTg3Yi1jNTcyOTA2ODk3NzkiLCJpc3MiOiJodHRwczovL2FwaS50ZXNjby5jb20vaWRlbnRpdHkvdjQvaXNzdWUtdG9rZW4iLCJzdWIiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJpYXQiOjE2MjE4Mzk4NDcsIm5iZiI6MTYyMTgzOTg0NywiZXhwIjoxNjIxODQzNDQ3LCJzY29wZSI6ImludGVybmFsIHB1YmxpYyIsImNvbmZpZGVuY2VfbGV2ZWwiOjEyLCJjbGllbnRfaWQiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJ0b2tlbl90eXBlIjoiYmVhcmVyIn0.QylY2akATMYkwcBWDQsfUAcY4y27mgKz1NIG78oNjUqCEskMDjWTPM6ZS5neE7CUso72p1ud8BDl8B0SIiRTlCVoaZxVZzUqOlM1ZJQKah-w9KFtZ48cdS_qKYxa2gp82suF-Q-lbWwPAqS-AYTcFaNMqsVlsCDCtOVoB-ALpa5mh0z6tQkqjU7uhsWut3fkKLmMym8x8ejnDth2QdjGIvSXHbYWRH0kYPFDZKS6jHsFOzGGiCHfn201UQLEVLbwL7knyQ8qQ5wolwdNymr364s1CT0A9VHIAfLVSscVIV0ae3rUoqUtjKrbSfXfntIpRyUm66INAbBgyFiWh3yRxgeyJraWQiOiIyMTM1MGE2NC02YTYxLTRiNmYtYjIyZS1lYTNkOTNiY2YyMTQiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI0NjE3Zjk4NC1mY2VlLTRmNTctYTg3Yi1jNTcyOTA2ODk3NzkiLCJpc3MiOiJodHRwczovL2FwaS50ZXNjby5jb20vaWRlbnRpdHkvdjQvaXNzdWUtdG9rZW4iLCJzdWIiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJpYXQiOjE2MjE4Mzk4NDcsIm5iZiI6MTYyMTgzOTg0NywiZXhwIjoxNjIxODQzNDQ3LCJzY29wZSI6ImludGVybmFsIHB1YmxpYyIsImNvbmZpZGVuY2VfbGV2ZWwiOjEyLCJjbGllbnRfaWQiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJ0b2tlbl90eXBlIjoiYmVhcmVyIn0.QylY2akATMYkwcBWDQsfUAcY4y27mgKz1NIG78oNjUqCEskMDjWTPM6ZS5neE7CUso72p1ud8BDl8B0SIiRTlCVoaZxVZzUqOlM1ZJQKah-w9KFtZ48cdS_qKYxa2gp82suF-Q-lbWwPAqS-AYTcFaNMqsVlsCDCtOVoB-ALpa5mh0z6tQkqjU7uhsWut3fkKLmMym8x8ejnDth2QdjGIvSXHbYWRH0kYPFDZKS6jHsFOzGGiCHfn201UQLEVLbwL7knyQ8qQ5wolwdNymr364s1CT0A9VHIAfLVSscVIV0ae3rUoqUtjKrbSfXfntIpRyUm66INAbBgyFiWh3yRxgeyJraWQiOiIyMTM1MGE2NC02YTYxLTRiNmYtYjIyZS1lYTNkOTNiY2YyMTQiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI0NjE3Zjk4NC1mY2VlLTRmNTctYTg3Yi1jNTcyOTA2ODk3NzkiLCJpc3MiOiJodHRwczovL2FwaS50ZXNjby5jb20vaWRlbnRpdHkvdjQvaXNzdWUtdG9rZW4iLCJzdWIiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJpYXQiOjE2MjE4Mzk4NDcsIm5iZiI6MTYyMTgzOTg0NywiZXhwIjoxNjIxODQzNDQ3LCJzY29wZSI6ImludGVybmFsIHB1YmxpYyIsImNvbmZpZGVuY2VfbGV2ZWwiOjEyLCJjbGllbnRfaWQiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJ0b2tlbl90eXBlIjoiYmVhcmVyIn0.QylY2akATMYkwcBWDQsfUAcY4y27mgKz1NIG78oNjUqCEskMDjWTPM6ZS5neE7CUso72p1ud8BDl8B0SIiRTlCVoaZxVZzUqOlM1ZJQKah-w9KFtZ48cdS_qKYxa2gp82suF-Q-lbWwPAqS-AYTcFaNMqsVlsCDCtOVoB-ALpa5mh0z6tQkqjU7uhsWut3fkKLmMym8x8ejnDth2QdjGIvSXHbYWRH0kYPFDZKS6jHsFOzGGiCHfn201UQLEVLbwL7knyQ8qQ5wolwdNymr364s1CT0A9VHIAfLVSscVIV0ae3rUoqUtjKrbSfXfntIpRyUm66INAbBgyFiWh3yRxgeyJraWQiOiIyMTM1MGE2NC02YTYxLTRiNmYtYjIyZS1lYTNkOTNiY2YyMTQiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI0NjE3Zjk4NC1mY2VlLTRmNTctYTg3Yi1jNTcyOTA2ODk3NzkiLCJpc3MiOiJodHRwczovL2FwaS50ZXNjby5jb20vaWRlbnRpdHkvdjQvaXNzdWUtdG9rZW4iLCJzdWIiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJpYXQiOjE2MjE4Mzk4NDcsIm5iZiI6MTYyMTgzOTg0NywiZXhwIjoxNjIxODQzNDQ3LCJzY29wZSI6ImludGVybmFsIHB1YmxpYyIsImNvbmZpZGVuY2VfbGV2ZWwiOjEyLCJjbGllbnRfaWQiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJ0b2tlbl90eXBlIjoiYmVhcmVyIn0.QylY2akATMYkwcBWDQsfUAcY4y27mgKz1NIG78oNjUqCEskMDjWTPM6ZS5neE7CUso72p1ud8BDl8B0SIiRTlCVoaZxVZzUqOlM1ZJQKah-w9KFtZ48cdS_qKYxa2gp82suF-Q-lbWwPAqS-AYTcFaNMqsVlsCDCtOVoB-ALpa5mh0z6tQkqjU7uhsWut3fkKLmMym8x8ejnDth2QdjGIvSXHbYWRH0kYPFDZKS6jHsFOzGGiCHfn201UQLEVLbwL7knyQ8qQ5wolwdNymr364s1CT0A9VHIAfLVSscVIV0ae3rUoqUtjKrbSfXfntIpRyUm66INAbBgyFiWh3yRxgeyJraWQiOiIyMTM1MGE2NC02YTYxLTRiNmYtYjIyZS1lYTNkOTNiY2YyMTQiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI0NjE3Zjk4NC1mY2VlLTRmNTctYTg3Yi1jNTcyOTA2ODk3NzkiLCJpc3MiOiJodHRwczovL2FwaS50ZXNjby5jb20vaWRlbnRpdHkvdjQvaXNzdWUtdG9rZW4iLCJzdWIiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJpYXQiOjE2MjE4Mzk4NDcsIm5iZiI6MTYyMTgzOTg0NywiZXhwIjoxNjIxODQzNDQ3LCJzY29wZSI6ImludGVybmFsIHB1YmxpYyIsImNvbmZpZGVuY2VfbGV2ZWwiOjEyLCJjbGllbnRfaWQiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJ0b2tlbl90eXBlIjoiYmVhcmVyIn0.QylY2akATMYkwcBWDQsfUAcY4y27mgKz1NIG78oNjUqCEskMDjWTPM6ZS5neE7CUso72p1ud8BDl8B0SIiRTlCVoaZxVZzUqOlM1ZJQKah-w9KFtZ48cdS_qKYxa2gp82suF-Q-lbWwPAqS-AYTcFaNMqsVlsCDCtOVoB-ALpa5mh0z6tQkqjU7uhsWut3fkKLmMym8x8ejnDth2QdjGIvSXHbYWRH0kYPFDZKS6jHsFOzGGiCHfn201UQLEVLbwL7knyQ8qQ5wolwdNymr364s1CT0A9VHIAfLVSscVIV0ae3rUoqUtjKrbSfXfntIpRyUm66INAbBgyFiWh3yRxgeyJraWQiOiIyMTM1MGE2NC02YTYxLTRiNmYtYjIyZS1lYTNkOTNiY2YyMTQiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI0NjE3Zjk4NC1mY2VlLTRmNTctYTg3Yi1jNTcyOTA2ODk3NzkiLCJpc3MiOiJodHRwczovL2FwaS50ZXNjby5jb20vaWRlbnRpdHkvdjQvaXNzdWUtdG9rZW4iLCJzdWIiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJpYXQiOjE2MjE4Mzk4NDcsIm5iZiI6MTYyMTgzOTg0NywiZXhwIjoxNjIxODQzNDQ3LCJzY29wZSI6ImludGVybmFsIHB1YmxpYyIsImNvbmZpZGVuY2VfbGV2ZWwiOjEyLCJjbGllbnRfaWQiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJ0b2tlbl90eXBlIjoiYmVhcmVyIn0.QylY2akATMYkwcBWDQsfUAcY4y27mgKz1NIG78oNjUqCEskMDjWTPM6ZS5neE7CUso72p1ud8BDl8B0SIiRTlCVoaZxVZzUqOlM1ZJQKah-w9KFtZ48cdS_qKYxa2gp82suF-Q-lbWwPAqS-AYTcFaNMqsVlsCDCtOVoB-ALpa5mh0z6tQkqjU7uhsWut3fkKLmMym8x8ejnDth2QdjGIvSXHbYWRH0kYPFDZKS6jHsFOzGGiCHfn201UQLEVLbwL7knyQ8qQ5wolwdNymr364s1CT0A9VHIAfLVSscVIV0ae3rUoqUtjKrbSfXfntIpRyUm66INAbBgyFiWh3yRxgeyJraWQiOiIyMTM1MGE2NC02YTYxLTRiNmYtYjIyZS1lYTNkOTNiY2YyMTQiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI0NjE3Zjk4NC1mY2VlLTRmNTctYTg3Yi1jNTcyOTA2ODk3NzkiLCJpc3MiOiJodHRwczovL2FwaS50ZXNjby5jb20vaWRlbnRpdHkvdjQvaXNzdWUtdG9rZW4iLCJzdWIiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJpYXQiOjE2MjE4Mzk4NDcsIm5iZiI6MTYyMTgzOTg0NywiZXhwIjoxNjIxODQzNDQ3LCJzY29wZSI6ImludGVybmFsIHB1YmxpYyIsImNvbmZpZGVuY2VfbGV2ZWwiOjEyLCJjbGllbnRfaWQiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJ0b2tlbl90eXBlIjoiYmVhcmVyIn0.QylY2akATMYkwcBWDQsfUAcY4y27mgKz1NIG78oNjUqCEskMDjWTPM6ZS5neE7CUso72p1ud8BDl8B0SIiRTlCVoaZxVZzUqOlM1ZJQKah-w9KFtZ48cdS_qKYxa2gp82suF-Q-lbWwPAqS-AYTcFaNMqsVlsCDCtOVoB-ALpa5mh0z6tQkqjU7uhsWut3fkKLmMym8x8ejnDth2QdjGIvSXHbYWRH0kYPFDZKS6jHsFOzGGiCHfn201UQLEVLbwL7knyQ8qQ5wolwdNymr364s1CT0A9VHIAfLVSscVIV0ae3rUoqUtjKrbSfXfntIpRyUm66INAbBgyFiWh3yRxgeyJraWQiOiIyMTM1MGE2NC02YTYxLTRiNmYtYjIyZS1lYTNkOTNiY2YyMTQiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI0NjE3Zjk4NC1mY2VlLTRmNTctYTg3Yi1jNTcyOTA2ODk3NzkiLCJpc3MiOiJodHRwczovL2FwaS50ZXNjby5jb20vaWRlbnRpdHkvdjQvaXNzdWUtdG9rZW4iLCJzdWIiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJpYXQiOjE2MjE4Mzk4NDcsIm5iZiI6MTYyMTgzOTg0NywiZXhwIjoxNjIxODQzNDQ3LCJzY29wZSI6ImludGVybmFsIHB1YmxpYyIsImNvbmZpZGVuY2VfbGV2ZWwiOjEyLCJjbGllbnRfaWQiOiI2ZTg5Y2M0Yi0xMDlkLTQwNjAtOTBlNC04ZTMyZTgzNTQzYmYiLCJ0b2tlbl90eXBlIjoiYmVhcmVyIn0.QylY2akATMYkwcBWDQsfUAcY4y27mgKz1NIG78oNjUqCEskMDjWTPM6ZS5neE7CUso72p1ud8BDl8B0SIiRTlCVoaZxVZzUqOlM1ZJQKah-w9KFtZ48cdS_qKYxa2gp82suF-Q-lbWwPAqS-AYTcFaNMqsVlsCDCtOVoB-ALpa5mh0z6tQkqjU7uhsWut3fkKLmMym8x8ejnDth2QdjGIvSXHbYWRH0kYPFDZKS6jHsFOzGGiCHfn201UQLEVLbwL7knyQ8qQ5wolwdNymr364s1CT0A9VHIAfLVSscVIV0ae3rUoqUtjKrbSfXfntIpRyUm66INAbBgyFiWh3yRxg \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-xml/README.md b/spring-boot-modules/spring-boot-xml/README.md deleted file mode 100644 index 7a9a0bdc09..0000000000 --- a/spring-boot-modules/spring-boot-xml/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles: - -- [XML Defined Beans in Spring Boot](https://www.baeldung.com/spring-boot-xml-beans) diff --git a/spring-boot-modules/spring-boot-xml/pom.xml b/spring-boot-modules/spring-boot-xml/pom.xml deleted file mode 100644 index b3fd343e4f..0000000000 --- a/spring-boot-modules/spring-boot-xml/pom.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - 4.0.0 - spring-boot-xml - - - parent-boot-2 - com.baeldung - 0.0.1-SNAPSHOT - ../../parent-boot-2 - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-test - - - junit - junit - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-xml/src/main/resources/application.properties b/spring-boot-modules/spring-boot-xml/src/main/resources/application.properties deleted file mode 100644 index ab9de92c82..0000000000 --- a/spring-boot-modules/spring-boot-xml/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -sample=string loaded from properties! \ No newline at end of file diff --git a/spring-boot-rest-2/README.md b/spring-boot-rest-2/README.md index f09159198c..41270d58ea 100644 --- a/spring-boot-rest-2/README.md +++ b/spring-boot-rest-2/README.md @@ -1,3 +1,4 @@ ### Relevant Article: - [Get All Endpoints in Spring Boot](https://www.baeldung.com/spring-boot-get-all-endpoints) +- [HTTP PUT vs. POST in REST API](https://www.baeldung.com/rest-http-put-vs-post) diff --git a/spring-boot-rest-2/pom.xml b/spring-boot-rest-2/pom.xml index d74c393f27..0560d6c9c7 100644 --- a/spring-boot-rest-2/pom.xml +++ b/spring-boot-rest-2/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 com.baeldung.web spring-boot-rest-2 @@ -30,6 +30,15 @@ springfox-boot-starter 3.0.0 + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + runtime + diff --git a/spring-boot-rest-2/src/main/java/com/baeldung/putvspost/Address.java b/spring-boot-rest-2/src/main/java/com/baeldung/putvspost/Address.java new file mode 100644 index 0000000000..5c005c70f0 --- /dev/null +++ b/spring-boot-rest-2/src/main/java/com/baeldung/putvspost/Address.java @@ -0,0 +1,57 @@ +package com.baeldung.putvspost; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +public class Address { + + private @Id @GeneratedValue Long id; + private String name; + private String city; + private String postalCode; + + Address() { + } + + public Address(String name, String city, String postalCode) { + this.name = name; + this.city = city; + this.postalCode = postalCode; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getPostalCode() { + return postalCode; + } + + public void setPostalCode(String postalCode) { + this.postalCode = postalCode; + } + + @Override + public String toString() { + return "Address [id=" + id + ", name=" + name + ", city=" + city + ", postalCode=" + postalCode + "]"; + } + +} diff --git a/spring-boot-rest-2/src/main/java/com/baeldung/putvspost/AddressController.java b/spring-boot-rest-2/src/main/java/com/baeldung/putvspost/AddressController.java new file mode 100644 index 0000000000..f989d5c211 --- /dev/null +++ b/spring-boot-rest-2/src/main/java/com/baeldung/putvspost/AddressController.java @@ -0,0 +1,57 @@ +package com.baeldung.putvspost; + +import java.util.List; +import java.util.Optional; + +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class AddressController { + + private final AddressRepository repository; + + AddressController(AddressRepository repository) { + this.repository = repository; + } + + @GetMapping("/addresses") + List
getAllAddresses() { + return repository.findAll(); + } + + @GetMapping("/addresses/{id}") + Optional
getAddressesById(@PathVariable Long id) { + return repository.findById(id); + } + + @PostMapping("/addresses") + Address createNewAddress(@RequestBody Address newAddress) { + return repository.save(newAddress); + } + + @PutMapping("/addresses/{id}") + Address replaceEmployee(@RequestBody Address newAddress, @PathVariable Long id) { + + return repository.findById(id) + .map(address -> { + address.setCity(newAddress.getCity()); + address.setPostalCode(newAddress.getPostalCode()); + return repository.save(address); + }) + .orElseGet(() -> { + return repository.save(newAddress); + }); + } + + @DeleteMapping("/addresses/{id}") + void deleteEmployee(@PathVariable Long id) { + repository.deleteById(id); + } + +} diff --git a/spring-boot-rest-2/src/main/java/com/baeldung/putvspost/AddressRepository.java b/spring-boot-rest-2/src/main/java/com/baeldung/putvspost/AddressRepository.java new file mode 100644 index 0000000000..415a3c9030 --- /dev/null +++ b/spring-boot-rest-2/src/main/java/com/baeldung/putvspost/AddressRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.putvspost; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface AddressRepository extends JpaRepository { + +} diff --git a/spring-boot-rest-2/src/main/java/com/baeldung/putvspost/PutVsPostApplication.java b/spring-boot-rest-2/src/main/java/com/baeldung/putvspost/PutVsPostApplication.java new file mode 100644 index 0000000000..8cea53d269 --- /dev/null +++ b/spring-boot-rest-2/src/main/java/com/baeldung/putvspost/PutVsPostApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.putvspost; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class PutVsPostApplication { + + public static void main(String[] args) { + SpringApplication.run(PutVsPostApplication.class, args); + } + +} diff --git a/spring-boot-rest/pom.xml b/spring-boot-rest/pom.xml index 10dacf99e8..72d4ecfaa6 100644 --- a/spring-boot-rest/pom.xml +++ b/spring-boot-rest/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 com.baeldung.web spring-boot-rest @@ -35,7 +35,6 @@ xstream ${xstream.version} - com.h2database h2 @@ -44,26 +43,21 @@ org.springframework.boot spring-boot-starter-data-jpa - org.springframework.boot spring-boot-starter-data-rest - org.springframework.boot spring-boot-starter-hateoas - - com.google.guava guava ${guava.version} - org.springframework.boot spring-boot-starter-test @@ -96,5 +90,5 @@ 1.4.11.1 2.3.5 - - + + \ No newline at end of file diff --git a/spring-caching/pom.xml b/spring-caching/pom.xml index c620072604..34c035a8ec 100644 --- a/spring-caching/pom.xml +++ b/spring-caching/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-caching 0.1-SNAPSHOT @@ -76,7 +76,9 @@ spring-data-commons + 3.5.2 - + + \ No newline at end of file diff --git a/spring-cloud-bus/pom.xml b/spring-cloud-bus/pom.xml index 82d0bccd0b..938d6d4bb8 100644 --- a/spring-cloud-bus/pom.xml +++ b/spring-cloud-bus/pom.xml @@ -1,7 +1,7 @@ + xmlns="http://maven.apache.org/POM/4.0.0" + 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.spring.cloud spring-cloud-bus @@ -37,4 +37,4 @@ 2020.0.0 - + \ No newline at end of file diff --git a/spring-cloud-bus/spring-cloud-config-client/pom.xml b/spring-cloud-bus/spring-cloud-config-client/pom.xml index cc1c237646..28e7568266 100644 --- a/spring-cloud-bus/spring-cloud-config-client/pom.xml +++ b/spring-cloud-bus/spring-cloud-config-client/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-cloud-config-client spring-cloud-config-client @@ -22,23 +23,19 @@ org.springframework.boot spring-boot-starter-web - org.springframework.boot spring-boot-starter-test test - org.springframework.boot spring-boot-actuator - org.springframework.boot spring-boot-actuator-autoconfigure - org.springframework.cloud spring-cloud-starter-bus-amqp @@ -54,4 +51,4 @@ - + \ No newline at end of file diff --git a/spring-cloud-bus/spring-cloud-config-server/pom.xml b/spring-cloud-bus/spring-cloud-config-server/pom.xml index a61008f3dd..03616b26af 100644 --- a/spring-cloud-bus/spring-cloud-config-server/pom.xml +++ b/spring-cloud-bus/spring-cloud-config-server/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-cloud-config-server spring-cloud-config-server @@ -18,23 +19,19 @@ org.springframework.cloud spring-cloud-config-server - org.springframework.boot spring-boot-starter-security - org.springframework.boot spring-boot-starter-test test - org.springframework.cloud spring-cloud-config-monitor - org.springframework.cloud spring-cloud-starter-stream-rabbit @@ -50,4 +47,4 @@ - + \ No newline at end of file diff --git a/spring-cloud-data-flow/apache-spark-job/pom.xml b/spring-cloud-data-flow/apache-spark-job/pom.xml index a4816a30ba..4f2ef6cd6c 100644 --- a/spring-cloud-data-flow/apache-spark-job/pom.xml +++ b/spring-cloud-data-flow/apache-spark-job/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 apache-spark-job apache-spark-job diff --git a/spring-cloud-data-flow/batch-job/pom.xml b/spring-cloud-data-flow/batch-job/pom.xml index 6b02b000e1..edb7e34389 100644 --- a/spring-cloud-data-flow/batch-job/pom.xml +++ b/spring-cloud-data-flow/batch-job/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.spring.cloud batch-job @@ -26,18 +27,16 @@ - + org.springframework.cloud spring-cloud-starter-task - org.springframework.boot spring-boot-starter-batch - com.h2database h2 @@ -49,4 +48,4 @@ 2.2.3.RELEASE - + \ No newline at end of file diff --git a/spring-cloud-data-flow/pom.xml b/spring-cloud-data-flow/pom.xml index 5b516146ae..f81daeeabc 100644 --- a/spring-cloud-data-flow/pom.xml +++ b/spring-cloud-data-flow/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-cloud-data-flow 0.0.1-SNAPSHOT @@ -21,4 +22,4 @@ apache-spark-job - + \ No newline at end of file diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-mongodb-sink/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-mongodb-sink/pom.xml index f4557335d6..a2a9bf1980 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-mongodb-sink/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-mongodb-sink/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 customer-mongodb-sink customer-mongodb-sink @@ -63,4 +64,4 @@ Hoxton.SR4 - + \ No newline at end of file diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-transform/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-transform/pom.xml index 81f194c772..067d25ec26 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-transform/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-transform/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 customer-transform customer-transform @@ -55,4 +56,4 @@ Hoxton.SR4 - + \ No newline at end of file diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-etl/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-etl/pom.xml index 91abdf3442..ffdd153f15 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-etl/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-etl/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-cloud-data-flow-etl 0.0.1-SNAPSHOT @@ -18,4 +19,4 @@ customer-transform - + \ No newline at end of file diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml index 34da489cd1..5dc8459e10 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/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 data-flow-server 0.0.1-SNAPSHOT @@ -64,4 +64,4 @@ 5.2.12.Final - + \ No newline at end of file diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/pom.xml index cc37e76aa4..61c1b16581 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 data-flow-shell 0.0.1-SNAPSHOT @@ -46,4 +47,4 @@ 1.1.0.RELEASE - + \ No newline at end of file diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/pom.xml index 186e5b1886..79d1447207 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 log-sink 0.0.1-SNAPSHOT @@ -25,7 +26,7 @@ - + org.springframework.cloud @@ -37,4 +38,4 @@ Hoxton.SR4 - + \ No newline at end of file diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/pom.xml index e794287e10..678ba1c6ac 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung spring-cloud-data-flow-stream-processing @@ -21,13 +22,13 @@ time-processor log-sink - + - + org.springframework.boot spring-boot-starter-test test - + \ No newline at end of file diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/pom.xml index b4ad84cfe9..083ce87ae6 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 time-processor 0.0.1-SNAPSHOT @@ -37,4 +38,4 @@ Hoxton.SR4 - + \ No newline at end of file diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/pom.xml index 05908d3c52..1808198a5d 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.spring.cloud time-source @@ -38,4 +39,4 @@ Hoxton.SR4 - + \ No newline at end of file diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml index ac717e85da..83e7175869 100644 --- a/spring-cloud/pom.xml +++ b/spring-cloud/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.spring.cloud spring-cloud @@ -43,7 +44,7 @@ spring-cloud-ribbon-retry spring-cloud-circuit-breaker spring-cloud-eureka-self-preservation - + spring-cloud-sentinel @@ -88,4 +89,4 @@ - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-archaius/additional-sources-simple/pom.xml b/spring-cloud/spring-cloud-archaius/additional-sources-simple/pom.xml index cc20511fc6..249cbe579f 100644 --- a/spring-cloud/spring-cloud-archaius/additional-sources-simple/pom.xml +++ b/spring-cloud/spring-cloud-archaius/additional-sources-simple/pom.xml @@ -1,7 +1,7 @@ + xmlns="http://maven.apache.org/POM/4.0.0" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 additional-sources-simple 1.0.0-SNAPSHOT @@ -21,5 +21,5 @@ spring-boot-starter-web - - + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-archaius/basic-config/pom.xml b/spring-cloud/spring-cloud-archaius/basic-config/pom.xml index a13fff2f9d..bdcef5b704 100644 --- a/spring-cloud/spring-cloud-archaius/basic-config/pom.xml +++ b/spring-cloud/spring-cloud-archaius/basic-config/pom.xml @@ -1,7 +1,7 @@ + xmlns="http://maven.apache.org/POM/4.0.0" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 basic-config 1.0.0-SNAPSHOT @@ -21,5 +21,5 @@ spring-boot-starter-web - - + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-archaius/dynamodb-config/pom.xml b/spring-cloud/spring-cloud-archaius/dynamodb-config/pom.xml index 9ff267425c..aa203670e0 100644 --- a/spring-cloud/spring-cloud-archaius/dynamodb-config/pom.xml +++ b/spring-cloud/spring-cloud-archaius/dynamodb-config/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 dynamodb-config dynamodb-config @@ -45,5 +46,5 @@ 5.0.3 0.7.6 - - + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-archaius/extra-configs/pom.xml b/spring-cloud/spring-cloud-archaius/extra-configs/pom.xml index 70f736642c..0c8f1e16a7 100644 --- a/spring-cloud/spring-cloud-archaius/extra-configs/pom.xml +++ b/spring-cloud/spring-cloud-archaius/extra-configs/pom.xml @@ -1,7 +1,7 @@ + xmlns="http://maven.apache.org/POM/4.0.0" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 extra-configs 1.0.0-SNAPSHOT @@ -41,5 +41,5 @@ 2.0.1.RELEASE - - + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-archaius/jdbc-config/pom.xml b/spring-cloud/spring-cloud-archaius/jdbc-config/pom.xml index b7e4917bea..9523c187e1 100644 --- a/spring-cloud/spring-cloud-archaius/jdbc-config/pom.xml +++ b/spring-cloud/spring-cloud-archaius/jdbc-config/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 jdbc-config jdbc-config @@ -28,5 +29,5 @@ runtime - - + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-archaius/pom.xml b/spring-cloud/spring-cloud-archaius/pom.xml index df8162efa5..56d7f0bc93 100644 --- a/spring-cloud/spring-cloud-archaius/pom.xml +++ b/spring-cloud/spring-cloud-archaius/pom.xml @@ -1,7 +1,7 @@ + xmlns="http://maven.apache.org/POM/4.0.0" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-cloud-archaius 1.0.0-SNAPSHOT @@ -63,5 +63,5 @@ 2.0.1.RELEASE 1.2.0 - - + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-archaius/zookeeper-config/pom.xml b/spring-cloud/spring-cloud-archaius/zookeeper-config/pom.xml index 25eaf4435c..f54373d572 100644 --- a/spring-cloud/spring-cloud-archaius/zookeeper-config/pom.xml +++ b/spring-cloud/spring-cloud-archaius/zookeeper-config/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 zookeeper-config zookeeper-config @@ -46,5 +47,5 @@ 2.0.0.RELEASE 3.4.13 - - + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-aws/pom.xml b/spring-cloud/spring-cloud-aws/pom.xml index f65db6a2fe..a8225c7f02 100644 --- a/spring-cloud/spring-cloud-aws/pom.xml +++ b/spring-cloud/spring-cloud-aws/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.spring.cloud spring-cloud-aws @@ -32,23 +33,19 @@ org.springframework.cloud spring-cloud-starter-aws-messaging - org.springframework.boot spring-boot-starter-test test - org.postgresql postgresql - mysql mysql-connector-java - @@ -67,7 +64,6 @@ com.baeldung.spring.cloud.aws.SpringCloudAwsApplication Dalston.SR4 2.2.1.RELEASE - - - + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-bootstrap/config/pom.xml b/spring-cloud/spring-cloud-bootstrap/config/pom.xml index 6ebf23637e..706c5695d3 100644 --- a/spring-cloud/spring-cloud-bootstrap/config/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/config/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 config 1.0.0-SNAPSHOT @@ -42,7 +43,6 @@ Brixton.SR7 - \ No newline at end of file diff --git a/spring-cloud/spring-cloud-bootstrap/customer-service/pom.xml b/spring-cloud/spring-cloud-bootstrap/customer-service/pom.xml index 729abb4f05..da2dee97d5 100644 --- a/spring-cloud/spring-cloud-bootstrap/customer-service/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/customer-service/pom.xml @@ -1,7 +1,7 @@ - - + 4.0.0 com.baeldung.customerservice customer-service @@ -72,4 +72,5 @@ 1.8 1.8 - + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-bootstrap/discovery/pom.xml b/spring-cloud/spring-cloud-bootstrap/discovery/pom.xml index d77e29768f..fb06c6052b 100644 --- a/spring-cloud/spring-cloud-bootstrap/discovery/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/discovery/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 discovery 1.0.0-SNAPSHOT @@ -38,7 +39,6 @@ org.springframework.boot spring-boot-starter-security - org.springframework.session spring-session @@ -51,7 +51,6 @@ Edgware.SR5 - \ No newline at end of file diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml b/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml index 34b7af7c0a..1a6296ac4f 100644 --- a/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 gateway 1.0.0-SNAPSHOT @@ -42,7 +43,6 @@ org.springframework.boot spring-boot-starter-security - org.springframework.session spring-session @@ -51,7 +51,6 @@ org.springframework.boot spring-boot-starter-data-redis - org.springframework.cloud spring-cloud-starter-zipkin @@ -60,7 +59,6 @@ org.springframework.cloud spring-cloud-starter-feign - @@ -77,15 +75,15 @@ - - - + dir="${project.basedir}/src/main/angular/ui"> + + + - - + dir="${project.basedir}/src/main/angular/ui"> + + @@ -100,7 +98,6 @@ Dalston.RELEASE - - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-bootstrap/order-service/order-client/pom.xml b/spring-cloud/spring-cloud-bootstrap/order-service/order-client/pom.xml index 01e8afeec3..dc6e196325 100644 --- a/spring-cloud/spring-cloud-bootstrap/order-service/order-client/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/order-service/order-client/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.orderservice order-client @@ -14,4 +15,5 @@ order-service 1.0.0-SNAPSHOT + diff --git a/spring-cloud/spring-cloud-bootstrap/order-service/order-server/pom.xml b/spring-cloud/spring-cloud-bootstrap/order-service/order-server/pom.xml index d6c521c5df..85143b557e 100644 --- a/spring-cloud/spring-cloud-bootstrap/order-service/order-server/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/order-service/order-server/pom.xml @@ -1,16 +1,18 @@ + xmlns="http://maven.apache.org/POM/4.0.0" + 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.orderservice order-server 1.0.0-SNAPSHOT + order-service com.baeldung.orderservice 1.0.0-SNAPSHOT + com.baeldung.orderservice diff --git a/spring-cloud/spring-cloud-bootstrap/order-service/pom.xml b/spring-cloud/spring-cloud-bootstrap/order-service/pom.xml index 2ebc673ef4..64be52f5f4 100644 --- a/spring-cloud/spring-cloud-bootstrap/order-service/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/order-service/pom.xml @@ -1,7 +1,7 @@ - - + 4.0.0 com.baeldung.orderservice order-service @@ -119,4 +119,4 @@ com.baeldung.orderservice.OrderApplication - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-bootstrap/pom.xml b/spring-cloud/spring-cloud-bootstrap/pom.xml index eb1a55c2a9..deba342d69 100644 --- a/spring-cloud/spring-cloud-bootstrap/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-cloud-bootstrap 1.0.0-SNAPSHOT @@ -24,4 +25,4 @@ order-service - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml b/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml index de0785bd45..b1aa205af5 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.spring.cloud svc-book @@ -43,7 +44,6 @@ org.springframework.boot spring-boot-starter-security - org.springframework.session spring-session @@ -52,28 +52,23 @@ org.springframework.boot spring-boot-starter-data-redis - org.springframework.boot spring-boot-starter-data-jpa - com.h2database h2 runtime - org.springframework.cloud spring-cloud-starter-zipkin - Dalston.RELEASE - \ No newline at end of file diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml b/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml index 0cce78276a..e189eeea81 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.spring.cloud svc-rating @@ -31,7 +32,6 @@ org.springframework.boot spring-boot-starter-security - org.springframework.session spring-session @@ -40,12 +40,10 @@ org.springframework.boot spring-boot-starter-data-redis - org.springframework.boot spring-boot-starter-data-jpa - org.springframework.cloud spring-cloud-starter-hystrix @@ -54,18 +52,15 @@ org.springframework.boot spring-boot-starter-actuator - com.h2database h2 runtime - org.springframework.cloud spring-cloud-starter-zipkin - @@ -82,7 +77,6 @@ Dalston.RELEASE - \ No newline at end of file diff --git a/spring-cloud/spring-cloud-bootstrap/zipkin/pom.xml b/spring-cloud/spring-cloud-bootstrap/zipkin/pom.xml index b83c5a2aaa..ba96f23795 100644 --- a/spring-cloud/spring-cloud-bootstrap/zipkin/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/zipkin/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 zipkin 1.0.0-SNAPSHOT @@ -22,18 +23,15 @@ org.springframework.cloud spring-cloud-starter-eureka - io.zipkin.java zipkin-server - io.zipkin.java zipkin-autoconfigure-ui runtime - @@ -50,7 +48,6 @@ Brixton.SR7 - \ No newline at end of file diff --git a/spring-cloud/spring-cloud-circuit-breaker/pom.xml b/spring-cloud/spring-cloud-circuit-breaker/pom.xml index 680d835c19..ebf89d671c 100644 --- a/spring-cloud/spring-cloud-circuit-breaker/pom.xml +++ b/spring-cloud/spring-cloud-circuit-breaker/pom.xml @@ -1,7 +1,7 @@ + xmlns="http://maven.apache.org/POM/4.0.0" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-cloud-circuit-breaker spring-cloud-circuit-breaker @@ -14,20 +14,6 @@ .. - - - spring-release - Spring Release - https://repo.spring.io/release - - false - - - true - - - - @@ -56,4 +42,4 @@ 1.0.2.RELEASE - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-config/client/pom.xml b/spring-cloud/spring-cloud-config/client/pom.xml index 2400520d2b..00b5ba2edc 100644 --- a/spring-cloud/spring-cloud-config/client/pom.xml +++ b/spring-cloud/spring-cloud-config/client/pom.xml @@ -47,4 +47,4 @@ - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-config/pom.xml b/spring-cloud/spring-cloud-config/pom.xml index bfe17044e0..1e46b9accb 100644 --- a/spring-cloud/spring-cloud-config/pom.xml +++ b/spring-cloud/spring-cloud-config/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.spring.cloud spring-cloud-config @@ -36,4 +37,4 @@ 2020.0.0 - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-config/server/pom.xml b/spring-cloud/spring-cloud-config/server/pom.xml index f0f1e43612..c59b6583f2 100644 --- a/spring-cloud/spring-cloud-config/server/pom.xml +++ b/spring-cloud/spring-cloud-config/server/pom.xml @@ -51,4 +51,4 @@ - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-connectors-heroku/pom.xml b/spring-cloud/spring-cloud-connectors-heroku/pom.xml index d318aa3c64..e02da23f6c 100644 --- a/spring-cloud/spring-cloud-connectors-heroku/pom.xml +++ b/spring-cloud/spring-cloud-connectors-heroku/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.spring.cloud spring-cloud-connectors-heroku @@ -59,5 +60,5 @@ Hoxton.SR4 42.2.10 - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-consul/pom.xml b/spring-cloud/spring-cloud-consul/pom.xml index 4d4ac0aa01..f21550e360 100644 --- a/spring-cloud/spring-cloud-consul/pom.xml +++ b/spring-cloud/spring-cloud-consul/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung spring-cloud-consul @@ -12,7 +13,7 @@ spring-cloud 1.0.0-SNAPSHOT - + jitpack.io @@ -26,7 +27,6 @@ spring-cloud-starter-consul-all ${spring-cloud-starter-consul.version} - org.springframework.cloud spring-cloud-starter-consul-config @@ -45,12 +45,12 @@ com.github.kinguinltdhk leadership-consul ${kinguinltdhk.version} - + - com.ecwid.consul - consul-api + com.ecwid.consul + consul-api - + @@ -60,4 +60,4 @@ com.baeldung.spring.cloud.consul.discovery.DiscoveryClientApplication - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-contract/pom.xml b/spring-cloud/spring-cloud-contract/pom.xml index f26f1d7e3b..1d12656f98 100644 --- a/spring-cloud/spring-cloud-contract/pom.xml +++ b/spring-cloud/spring-cloud-contract/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-cloud-contract 1.0.0-SNAPSHOT @@ -56,5 +57,5 @@ 2.1.1.RELEASE 2.1.4.RELEASE - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/pom.xml b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/pom.xml index 7616032320..c99dd0bd5a 100644 --- a/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/pom.xml +++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-cloud-contract-consumer 1.0.0-SNAPSHOT @@ -42,4 +43,4 @@ - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/pom.xml b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/pom.xml index e909dbc253..736a2530b2 100644 --- a/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/pom.xml +++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-cloud-contract-producer 1.0.0-SNAPSHOT @@ -49,4 +50,4 @@ 2.1.1.RELEASE - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-docker/docker-message-server/pom.xml b/spring-cloud/spring-cloud-docker/docker-message-server/pom.xml index fafd291c00..0cc235f706 100644 --- a/spring-cloud/spring-cloud-docker/docker-message-server/pom.xml +++ b/spring-cloud/spring-cloud-docker/docker-message-server/pom.xml @@ -2,7 +2,6 @@ - 4.0.0 docker-message-server docker-message-server @@ -52,4 +51,5 @@ - + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-docker/docker-product-server/pom.xml b/spring-cloud/spring-cloud-docker/docker-product-server/pom.xml index a5bd6c50ea..be65a6d7d3 100644 --- a/spring-cloud/spring-cloud-docker/docker-product-server/pom.xml +++ b/spring-cloud/spring-cloud-docker/docker-product-server/pom.xml @@ -2,7 +2,6 @@ - 4.0.0 docker-product-server docker-product-server @@ -52,4 +51,5 @@ - + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-docker/pom.xml b/spring-cloud/spring-cloud-docker/pom.xml index a9d978c9d4..3e407df6a1 100644 --- a/spring-cloud/spring-cloud-docker/pom.xml +++ b/spring-cloud/spring-cloud-docker/pom.xml @@ -1,8 +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-cloud-docker spring-cloud-docker diff --git a/spring-cloud/spring-cloud-eureka-self-preservation/pom.xml b/spring-cloud/spring-cloud-eureka-self-preservation/pom.xml index 41ebba7d79..26353f8297 100644 --- a/spring-cloud/spring-cloud-eureka-self-preservation/pom.xml +++ b/spring-cloud/spring-cloud-eureka-self-preservation/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.spring.cloud.eureka spring-cloud-eureka-self-preservation @@ -34,4 +35,4 @@ Greenwich.SR3 - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-client/pom.xml b/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-client/pom.xml index fc7d8bec33..f2670a5114 100644 --- a/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-client/pom.xml +++ b/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-client/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-cloud-eureka-client spring-cloud-eureka-client @@ -37,4 +38,4 @@ - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-server/pom.xml b/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-server/pom.xml index 02d1c8c354..b21e5100ef 100644 --- a/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-server/pom.xml +++ b/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-server/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-cloud-eureka-server spring-cloud-eureka-server @@ -33,4 +34,4 @@ - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-eureka/pom.xml b/spring-cloud/spring-cloud-eureka/pom.xml index 9d7350e774..5cf0a74868 100644 --- a/spring-cloud/spring-cloud-eureka/pom.xml +++ b/spring-cloud/spring-cloud-eureka/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-cloud-eureka 1.0.0-SNAPSHOT @@ -36,4 +37,4 @@ Greenwich.RELEASE - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client/pom.xml b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client/pom.xml index dc6a1ae236..a3c78154a2 100644 --- a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client/pom.xml +++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-cloud-eureka-client 1.0.0-SNAPSHOT @@ -45,4 +46,4 @@ - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/pom.xml b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/pom.xml index 95b1275e2c..4fdfe2d9c2 100644 --- a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/pom.xml +++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-cloud-eureka-feign-client-integration-test 1.0.0-SNAPSHOT @@ -38,48 +39,40 @@ org.springframework.cloud spring-cloud-starter-openfeign - org.springframework.cloud spring-cloud-starter-netflix-ribbon - org.springframework.cloud spring-cloud-starter-netflix-eureka-client - org.springframework.boot spring-boot-starter-web - com.github.tomakehurst wiremock 2.27.2 test - org.projectlombok lombok - org.testcontainers testcontainers 1.14.3 test - org.awaitility awaitility 4.0.3 test - @@ -94,4 +87,4 @@ - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/pom.xml b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/pom.xml index e0d63dc15d..b51fd11e29 100644 --- a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/pom.xml +++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-cloud-eureka-feign-client 1.0.0-SNAPSHOT @@ -53,4 +54,4 @@ - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-server/pom.xml b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-server/pom.xml index 9c0a933753..9c8e6f3e70 100644 --- a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-server/pom.xml +++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-server/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-cloud-eureka-server 1.0.0-SNAPSHOT @@ -41,4 +42,4 @@ - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-functions/pom.xml b/spring-cloud/spring-cloud-functions/pom.xml index 0be3941db1..5f5376ddc9 100644 --- a/spring-cloud/spring-cloud-functions/pom.xml +++ b/spring-cloud/spring-cloud-functions/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 com.baeldung.spring spring-cloud-functions @@ -16,15 +16,15 @@ 0.0.1-SNAPSHOT ../../parent-boot-2 - + org.springframework.cloud spring-cloud-function-adapter-aws ${spring-cloud-function.version} - - + + org.springframework.cloud spring-cloud-starter-function-web @@ -86,7 +86,6 @@ 2.0.2 1.1.0 1.0.10.RELEASE - - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-gateway/pom.xml b/spring-cloud/spring-cloud-gateway/pom.xml index c9c087d738..eaa0d12cfd 100644 --- a/spring-cloud/spring-cloud-gateway/pom.xml +++ b/spring-cloud/spring-cloud-gateway/pom.xml @@ -45,19 +45,16 @@ org.springframework.cloud spring-cloud-starter-gateway - org.springframework.cloud spring-cloud-starter-circuitbreaker-reactor-resilience4j - org.springframework.boot spring-boot-starter-data-redis-reactive - it.ozimov @@ -65,7 +62,6 @@ ${redis.version} test - org.hibernate hibernate-validator-cdi @@ -79,7 +75,6 @@ org.springframework.boot spring-boot-starter-actuator - org.springframework.boot spring-boot-starter-test @@ -108,4 +103,4 @@ 5.5.2 - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/pom.xml b/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/pom.xml index 204cb8765c..ea46ae3293 100644 --- a/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/pom.xml +++ b/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/pom.xml @@ -1,7 +1,7 @@ + xmlns="http://maven.apache.org/POM/4.0.0" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 feign-rest-consumer 1.0.0-SNAPSHOT @@ -78,4 +78,4 @@ 1.0.0-SNAPSHOT - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-hystrix/pom.xml b/spring-cloud/spring-cloud-hystrix/pom.xml index 4aec8050ff..4fa0a31d62 100644 --- a/spring-cloud/spring-cloud-hystrix/pom.xml +++ b/spring-cloud/spring-cloud-hystrix/pom.xml @@ -1,7 +1,7 @@ + xmlns="http://maven.apache.org/POM/4.0.0" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-cloud-hystrix 1.0.0-SNAPSHOT @@ -21,4 +21,4 @@ feign-rest-consumer - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-hystrix/rest-consumer/pom.xml b/spring-cloud/spring-cloud-hystrix/rest-consumer/pom.xml index e96dc478a4..73a0859785 100644 --- a/spring-cloud/spring-cloud-hystrix/rest-consumer/pom.xml +++ b/spring-cloud/spring-cloud-hystrix/rest-consumer/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 rest-consumer 1.0.0-SNAPSHOT @@ -56,7 +57,6 @@ org.springframework.boot spring-boot-starter-actuator - org.springframework.boot spring-boot-starter-test @@ -69,4 +69,4 @@ 1.10.19 - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-hystrix/rest-producer/pom.xml b/spring-cloud/spring-cloud-hystrix/rest-producer/pom.xml index e7be8f2c58..4843c592c9 100644 --- a/spring-cloud/spring-cloud-hystrix/rest-producer/pom.xml +++ b/spring-cloud/spring-cloud-hystrix/rest-producer/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 rest-producer 1.0.0-SNAPSHOT @@ -19,7 +20,6 @@ org.springframework.boot spring-boot-starter-web - org.springframework.boot spring-boot-starter-test @@ -32,4 +32,4 @@ 1.10.19 - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/pom.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/pom.xml index 8e543db326..e916f2bc3e 100644 --- a/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/pom.xml +++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 client-service client-service @@ -87,4 +88,4 @@ 1.1.8.RELEASE - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/pom.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/pom.xml index 5ab017043c..c6c6de94c3 100644 --- a/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/pom.xml +++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 travel-agency-service 1.0-SNAPSHOT @@ -27,7 +28,6 @@ org.springframework.boot spring-boot-starter-web - org.springframework.boot spring-boot-actuator diff --git a/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/pom.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/pom.xml index 5bd7d3f5ea..81455eb259 100644 --- a/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/pom.xml +++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 demo-backend demo-backend @@ -17,7 +18,6 @@ org.springframework.boot spring-boot-starter-web - org.springframework.boot spring-boot-starter-test @@ -34,4 +34,4 @@ - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/pom.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/pom.xml index 004fabeb09..558b2cfc3c 100644 --- a/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/pom.xml +++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 demo-frontend demo-frontend @@ -17,7 +18,6 @@ org.springframework.boot spring-boot-starter-web - org.springframework.boot spring-boot-starter-test @@ -33,4 +33,5 @@ - + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/pom.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/pom.xml index 16e718a3be..725aa9cd3d 100644 --- a/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/pom.xml +++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/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 liveness-example liveness-example @@ -19,12 +19,10 @@ org.springframework.boot spring-boot-starter-web - org.springframework.boot spring-boot-starter-actuator - org.springframework.boot spring-boot-starter-test diff --git a/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/pom.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/pom.xml index 0ee40b6504..65434259f2 100644 --- a/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/pom.xml +++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/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 readiness-example readiness-example diff --git a/spring-cloud/spring-cloud-kubernetes/pom.xml b/spring-cloud/spring-cloud-kubernetes/pom.xml index 7e494b61d9..1a3e3826d4 100644 --- a/spring-cloud/spring-cloud-kubernetes/pom.xml +++ b/spring-cloud/spring-cloud-kubernetes/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.spring.cloud spring-cloud-kubernetes diff --git a/spring-cloud/spring-cloud-netflix-feign/pom.xml b/spring-cloud/spring-cloud-netflix-feign/pom.xml index aa5ba5dbdb..6180ee7575 100644 --- a/spring-cloud/spring-cloud-netflix-feign/pom.xml +++ b/spring-cloud/spring-cloud-netflix-feign/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.cloud spring-cloud-netlix-feign @@ -32,23 +33,19 @@ org.springframework.cloud spring-cloud-starter-feign - com.netflix.feign feign-okhttp ${feign-ok.version} - org.springframework.boot spring-boot-starter-web - org.apache.httpcomponents httpcore - org.springframework.boot spring-boot-starter-test @@ -59,13 +56,8 @@ Camden.SR7 8.18.0 - - + + - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-open-service-broker/pom.xml b/spring-cloud/spring-cloud-open-service-broker/pom.xml index 42e90402e5..ca55bc2147 100644 --- a/spring-cloud/spring-cloud-open-service-broker/pom.xml +++ b/spring-cloud/spring-cloud-open-service-broker/pom.xml @@ -1,7 +1,7 @@ + xmlns="http://maven.apache.org/POM/4.0.0" + 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 spring-cloud-open-service-broker @@ -38,4 +38,4 @@ 3.3.5.RELEASE - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-openfeign/pom.xml b/spring-cloud/spring-cloud-openfeign/pom.xml index bdde46fe96..1cb618c7e1 100644 --- a/spring-cloud/spring-cloud-openfeign/pom.xml +++ b/spring-cloud/spring-cloud-openfeign/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.cloud spring-cloud-openfeign @@ -32,29 +33,24 @@ org.springframework.cloud spring-cloud-starter-openfeign - io.github.openfeign feign-okhttp - org.springframework.boot spring-boot-starter-web - io.github.openfeign.form feign-form 3.8.0 - io.github.openfeign.form feign-form-spring 3.8.0 - org.springframework.boot spring-boot-starter-test @@ -66,4 +62,4 @@ Hoxton.SR6 - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-rest/pom.xml b/spring-cloud/spring-cloud-rest/pom.xml index 1136fca020..8f0b7b8dcc 100644 --- a/spring-cloud/spring-cloud-rest/pom.xml +++ b/spring-cloud/spring-cloud-rest/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung spring-cloud-rest @@ -48,4 +49,4 @@ 1.8 - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/pom.xml b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/pom.xml index 8ba0fc5cad..2fa003a634 100644 --- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/pom.xml +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung spring-cloud-rest-books-api @@ -74,6 +75,4 @@ - - diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/pom.xml b/spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/pom.xml index c64341f652..9180283c2d 100644 --- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/pom.xml +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung spring-cloud-rest-config-server @@ -52,7 +53,6 @@ Camden.SR4 - - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/pom.xml b/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/pom.xml index 85790bf895..eb65395821 100644 --- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/pom.xml +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung spring-cloud-rest-discovery-server @@ -60,7 +61,6 @@ Edgware.SR4 - - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/pom.xml b/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/pom.xml index 35d0e79543..a8d5837320 100644 --- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/pom.xml +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung spring-cloud-rest-reviews-api @@ -82,7 +83,6 @@ 3.0.1 0.6 - - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-ribbon-client/pom.xml b/spring-cloud/spring-cloud-ribbon-client/pom.xml index 2c9820d179..77c25b2f6b 100644 --- a/spring-cloud/spring-cloud-ribbon-client/pom.xml +++ b/spring-cloud/spring-cloud-ribbon-client/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 spring-cloud-ribbon-client 0.0.1-SNAPSHOT diff --git a/spring-cloud/spring-cloud-ribbon-retry/pom.xml b/spring-cloud/spring-cloud-ribbon-retry/pom.xml index 99eb882421..e0075b4f41 100644 --- a/spring-cloud/spring-cloud-ribbon-retry/pom.xml +++ b/spring-cloud/spring-cloud-ribbon-retry/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 com.baeldung.spring.cloud spring-cloud-ribbon-retry @@ -55,6 +55,6 @@ Hoxton.SR3 - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-ribbon-retry/ribbon-client-service/pom.xml b/spring-cloud/spring-cloud-ribbon-retry/ribbon-client-service/pom.xml index ad47eb6c84..34d4d372bc 100644 --- a/spring-cloud/spring-cloud-ribbon-retry/ribbon-client-service/pom.xml +++ b/spring-cloud/spring-cloud-ribbon-retry/ribbon-client-service/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 ribbon-client-service diff --git a/spring-cloud/spring-cloud-ribbon-retry/ribbon-weather-service/pom.xml b/spring-cloud/spring-cloud-ribbon-retry/ribbon-weather-service/pom.xml index f091341025..d3edb6062b 100644 --- a/spring-cloud/spring-cloud-ribbon-retry/ribbon-weather-service/pom.xml +++ b/spring-cloud/spring-cloud-ribbon-retry/ribbon-weather-service/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 ribbon-weather-service diff --git a/spring-cloud/spring-cloud-security/auth-client/pom.xml b/spring-cloud/spring-cloud-security/auth-client/pom.xml index c7606719f9..cdbb056a45 100644 --- a/spring-cloud/spring-cloud-security/auth-client/pom.xml +++ b/spring-cloud/spring-cloud-security/auth-client/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 auth-client auth-client @@ -82,4 +83,4 @@ 4.3.1 - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-security/auth-resource/pom.xml b/spring-cloud/spring-cloud-security/auth-resource/pom.xml index d3f9eaf795..c999030c07 100644 --- a/spring-cloud/spring-cloud-security/auth-resource/pom.xml +++ b/spring-cloud/spring-cloud-security/auth-resource/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 auth-resource auth-resource @@ -47,4 +48,4 @@ 1.0.10.RELEASE - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-security/auth-server/pom.xml b/spring-cloud/spring-cloud-security/auth-server/pom.xml index 59ddedf1b2..c0330aad43 100644 --- a/spring-cloud/spring-cloud-security/auth-server/pom.xml +++ b/spring-cloud/spring-cloud-security/auth-server/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 auth-server auth-server diff --git a/spring-cloud/spring-cloud-security/pom.xml b/spring-cloud/spring-cloud-security/pom.xml index 53b95380ed..0227989f99 100644 --- a/spring-cloud/spring-cloud-security/pom.xml +++ b/spring-cloud/spring-cloud-security/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-cloud-security 1.0.0-SNAPSHOT @@ -36,4 +37,4 @@ 2020.0.1 - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-sentinel/pom.xml b/spring-cloud/spring-cloud-sentinel/pom.xml index 612cbcbfbe..a36dcc51bc 100644 --- a/spring-cloud/spring-cloud-sentinel/pom.xml +++ b/spring-cloud/spring-cloud-sentinel/pom.xml @@ -1,13 +1,13 @@ + xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 4.0.0 spring-cloud-sentinel spring-cloud-sentinel http://maven.apache.org pom + com.baeldung.spring.cloud spring-cloud @@ -39,4 +39,5 @@ UTF-8 - + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream-starters/twitterhdfs/pom.xml b/spring-cloud/spring-cloud-stream-starters/twitterhdfs/pom.xml index c9a73b9aa1..9c8d4ac707 100644 --- a/spring-cloud/spring-cloud-stream-starters/twitterhdfs/pom.xml +++ b/spring-cloud/spring-cloud-stream-starters/twitterhdfs/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.twitterhdfs twitterhdfs @@ -12,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent 2.1.13.RELEASE - + @@ -32,7 +33,7 @@ javax.servlet jstl - + org.springframework.boot spring-boot-starter-test test diff --git a/spring-cloud/spring-cloud-stream/pom.xml b/spring-cloud/spring-cloud-stream/pom.xml index 17c788c000..96a7ad012b 100644 --- a/spring-cloud/spring-cloud-stream/pom.xml +++ b/spring-cloud/spring-cloud-stream/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung spring-cloud-stream @@ -40,4 +41,4 @@ - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/pom.xml b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/pom.xml index 32a31c3042..00e9e7c328 100644 --- a/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/pom.xml +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/pom.xml @@ -1,6 +1,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 spring-cloud-stream-kafka spring-cloud-stream-kafka @@ -27,41 +27,34 @@ - org.springframework.cloud spring-cloud-stream-binder-kafka - org.springframework.cloud spring-cloud-stream-schema - org.springframework.cloud spring-cloud-stream-test-support test - io.confluent kafka-avro-serializer ${kafka-avro-serializer.version} - org.apache.avro avro-compiler ${avro.version} - org.apache.avro avro-maven-plugin ${avro.version} - @@ -104,7 +97,6 @@ Greenwich.SR1 4.0.0 1.8.2 - - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/pom.xml b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/pom.xml index 9e706cc239..f542d78620 100644 --- a/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/pom.xml +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/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-cloud-stream-kinesis spring-cloud-stream-kinesis @@ -18,19 +18,16 @@ org.springframework.boot spring-boot-starter-web - org.springframework.cloud spring-cloud-stream-binder-kinesis ${spring-cloud-stream-kinesis-binder.version} - com.amazonaws aws-java-sdk-kinesis ${aws-sdk.version} - org.springframework.cloud spring-cloud-stream-test-support diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml index 4aa42f03d7..6ca9e89031 100644 --- a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-cloud-stream-rabbit spring-cloud-stream-rabbit @@ -19,7 +20,6 @@ org.springframework.cloud spring-cloud-starter-stream-rabbit - org.springframework.cloud spring-cloud-stream-test-support @@ -27,4 +27,4 @@ - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-task/pom.xml b/spring-cloud/spring-cloud-task/pom.xml index 21d8a4e42b..bf43799d2d 100644 --- a/spring-cloud/spring-cloud-task/pom.xml +++ b/spring-cloud/spring-cloud-task/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.spring.cloud spring-cloud-task @@ -49,7 +50,6 @@ Hoxton.SR4 2.2.3.RELEASE - - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml b/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml index fd10322efb..7dbbb27a77 100644 --- a/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml +++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/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 com.baeldung.cloud springcloudtaskbatch @@ -30,17 +30,14 @@ org.springframework.cloud spring-cloud-starter-task - org.springframework.cloud spring-cloud-task-core - org.springframework.boot spring-boot-starter-batch - org.springframework.cloud spring-cloud-task-batch @@ -65,4 +62,4 @@ com.baeldung.TaskDemo - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-task/springcloudtasksink/pom.xml b/spring-cloud/spring-cloud-task/springcloudtasksink/pom.xml index 33f6ccde74..ad7035ffe5 100644 --- a/spring-cloud/spring-cloud-task/springcloudtasksink/pom.xml +++ b/spring-cloud/spring-cloud-task/springcloudtasksink/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 springcloudtasksink springcloudtasksink @@ -32,7 +33,6 @@ spring-boot-starter-test test - org.springframework.cloud spring-cloud-deployer-local @@ -53,4 +53,4 @@ 2.3.1.RELEASE - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-vault/pom.xml b/spring-cloud/spring-cloud-vault/pom.xml index d9ae6b515f..131d58c967 100644 --- a/spring-cloud/spring-cloud-vault/pom.xml +++ b/spring-cloud/spring-cloud-vault/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.spring.cloud spring-cloud-vault @@ -28,28 +29,23 @@ - org.springframework.cloud spring-cloud-starter-vault-config - org.springframework.cloud spring-cloud-vault-config-databases - org.springframework.boot spring-boot-starter-test test - mysql mysql-connector-java - org.springframework.boot spring-boot-starter-jdbc @@ -85,4 +81,4 @@ Greenwich.RELEASE - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zookeeper/Greeting/pom.xml b/spring-cloud/spring-cloud-zookeeper/Greeting/pom.xml index 24e783ff30..8e7b87c220 100644 --- a/spring-cloud/spring-cloud-zookeeper/Greeting/pom.xml +++ b/spring-cloud/spring-cloud-zookeeper/Greeting/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 Greeting Greeting @@ -79,4 +80,4 @@ 1.3 - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zookeeper/HelloWorld/pom.xml b/spring-cloud/spring-cloud-zookeeper/HelloWorld/pom.xml index 777b857403..57a1cc029c 100644 --- a/spring-cloud/spring-cloud-zookeeper/HelloWorld/pom.xml +++ b/spring-cloud/spring-cloud-zookeeper/HelloWorld/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 HelloWorld HelloWorld diff --git a/spring-cloud/spring-cloud-zookeeper/pom.xml b/spring-cloud/spring-cloud-zookeeper/pom.xml index 31bf043ac0..79eabf74f0 100644 --- a/spring-cloud/spring-cloud-zookeeper/pom.xml +++ b/spring-cloud/spring-cloud-zookeeper/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-cloud-zookeeper spring-cloud-zookeeper diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/bin/eureka-client/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/eureka-client/pom.xml index 321da7527a..9989893f2f 100644 --- a/spring-cloud/spring-cloud-zuul-eureka-integration/bin/eureka-client/pom.xml +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/eureka-client/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 eureka-client 1.0.0-SNAPSHOT @@ -38,4 +39,4 @@ - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/bin/eureka-server/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/eureka-server/pom.xml index 08854b02fd..34f82a7347 100644 --- a/spring-cloud/spring-cloud-zuul-eureka-integration/bin/eureka-server/pom.xml +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/eureka-server/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 eureka-server 1.0.0-SNAPSHOT @@ -39,4 +40,4 @@ - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/bin/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/pom.xml index c6658d70a2..81a4b9202c 100644 --- a/spring-cloud/spring-cloud-zuul-eureka-integration/bin/pom.xml +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-cloud-zuul-eureka-integration 1.0.0-SNAPSHOT @@ -26,5 +27,5 @@ 1.4.2.RELEASE 1.10 - - + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/bin/zuul-server/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/zuul-server/pom.xml index 2a899760dd..37fe4815bb 100644 --- a/spring-cloud/spring-cloud-zuul-eureka-integration/bin/zuul-server/pom.xml +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/zuul-server/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 zuul-server diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/pom.xml index 77e8ef7c20..3514924198 100644 --- a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/pom.xml +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 eureka-client 1.0.0-SNAPSHOT @@ -37,7 +38,6 @@ spring-boot-starter-web ${spring-boot.version} - org.springframework.boot spring-boot-starter-test @@ -46,4 +46,4 @@ - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/pom.xml index c3f6642351..dcd912df07 100644 --- a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/pom.xml +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 eureka-server 1.0.0-SNAPSHOT @@ -37,7 +38,6 @@ commons-configuration ${commons-config.version} - org.springframework.boot spring-boot-starter-test @@ -46,4 +46,4 @@ - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/pom.xml index 996110f875..89d0d2c942 100644 --- a/spring-cloud/spring-cloud-zuul-eureka-integration/pom.xml +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/pom.xml @@ -1,7 +1,7 @@ + xmlns="http://maven.apache.org/POM/4.0.0" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-cloud-zuul-eureka-integration 1.0.0-SNAPSHOT @@ -30,4 +30,4 @@ Finchley.SR2 - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/pom.xml index ddffe540c5..bb38ec1351 100644 --- a/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/pom.xml +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 zuul-server zuul-server @@ -46,7 +47,6 @@ rxjava ${rxjava.version} - org.springframework.boot spring-boot-starter-test diff --git a/spring-cloud/spring-cloud-zuul-fallback/api-gateway/pom.xml b/spring-cloud/spring-cloud-zuul-fallback/api-gateway/pom.xml index 4e092736a5..cfee3ce656 100644 --- a/spring-cloud/spring-cloud-zuul-fallback/api-gateway/pom.xml +++ b/spring-cloud/spring-cloud-zuul-fallback/api-gateway/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 api-gateway api-gateway @@ -50,4 +50,4 @@ - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul-fallback/pom.xml b/spring-cloud/spring-cloud-zuul-fallback/pom.xml index 42925a6ab9..1c426503e5 100644 --- a/spring-cloud/spring-cloud-zuul-fallback/pom.xml +++ b/spring-cloud/spring-cloud-zuul-fallback/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-cloud-zuul-fallback spring-cloud-zuul-fallback @@ -24,5 +24,5 @@ Finchley.SR2 3.1.1 - - + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul-fallback/weather-service/pom.xml b/spring-cloud/spring-cloud-zuul-fallback/weather-service/pom.xml index e66110fb23..239be5e134 100644 --- a/spring-cloud/spring-cloud-zuul-fallback/weather-service/pom.xml +++ b/spring-cloud/spring-cloud-zuul-fallback/weather-service/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 weather-service weather-service @@ -31,13 +31,12 @@ - + org.springframework.boot spring-boot-starter-web - org.springframework.boot spring-boot-starter-test @@ -45,4 +44,4 @@ - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul/pom.xml b/spring-cloud/spring-cloud-zuul/pom.xml index 13834848fe..fc3a127e90 100644 --- a/spring-cloud/spring-cloud-zuul/pom.xml +++ b/spring-cloud/spring-cloud-zuul/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.spring.cloud spring-cloud-zuul @@ -84,4 +85,4 @@ 2.2.2.RELEASE - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-foos-resource/pom.xml b/spring-cloud/spring-cloud-zuul/spring-zuul-foos-resource/pom.xml index f5a8c3b613..7a5f9f602b 100644 --- a/spring-cloud/spring-cloud-zuul/spring-zuul-foos-resource/pom.xml +++ b/spring-cloud/spring-cloud-zuul/spring-zuul-foos-resource/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 spring-zuul-foos-resource spring-zuul-foos-resource diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/pom.xml b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/pom.xml index 0ca9f0d050..851ad0fd8f 100644 --- a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/pom.xml +++ b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/pom.xml @@ -1,15 +1,15 @@ - + 4.0.0 + spring-zuul-post-filter + spring-cloud-zuul com.baeldung.spring.cloud 0.0.1-SNAPSHOT - 4.0.0 - spring-zuul-post-filter diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-rate-limiting/pom.xml b/spring-cloud/spring-cloud-zuul/spring-zuul-rate-limiting/pom.xml index bb735a71ed..e09fcd3711 100644 --- a/spring-cloud/spring-cloud-zuul/spring-zuul-rate-limiting/pom.xml +++ b/spring-cloud/spring-cloud-zuul/spring-zuul-rate-limiting/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-zuul-rate-limiting 0.0.1-SNAPSHOT @@ -43,4 +44,4 @@ 2.2.0.RELEASE - + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-ui/pom.xml b/spring-cloud/spring-cloud-zuul/spring-zuul-ui/pom.xml index b7e1702558..7c3f668473 100644 --- a/spring-cloud/spring-cloud-zuul/spring-zuul-ui/pom.xml +++ b/spring-cloud/spring-cloud-zuul/spring-zuul-ui/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-zuul-ui spring-zuul-ui @@ -47,5 +48,5 @@ - + \ No newline at end of file diff --git a/spring-core-2/pom.xml b/spring-core-2/pom.xml index 3f8e84e13d..de5c7c0d4d 100644 --- a/spring-core-2/pom.xml +++ b/spring-core-2/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-core-2 0.1-SNAPSHOT @@ -143,7 +144,6 @@ mockito-core test - net.javacrumbs.shedlock @@ -202,7 +202,6 @@ 1.3.2 5.2.5.Final - 25.1-jre 3.6 @@ -212,4 +211,4 @@ 3.2.2 - + \ No newline at end of file diff --git a/spring-core-3/pom.xml b/spring-core-3/pom.xml index 618800529c..50d2e7ac5e 100644 --- a/spring-core-3/pom.xml +++ b/spring-core-3/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-core-3 spring-core-3 diff --git a/spring-core-4/pom.xml b/spring-core-4/pom.xml index d2e948c475..5706b2ee75 100644 --- a/spring-core-4/pom.xml +++ b/spring-core-4/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-core-4 spring-core-4 @@ -84,7 +84,6 @@ javax.servlet-api 4.0.0 - @@ -95,4 +94,4 @@ 2.9.1 - + \ No newline at end of file diff --git a/spring-core-5/README.md b/spring-core-5/README.md index 4315535e69..cf90d9ffc3 100644 --- a/spring-core-5/README.md +++ b/spring-core-5/README.md @@ -7,4 +7,5 @@ This module contains articles about core Spring functionality - [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) - [Spring Bean Names](https://www.baeldung.com/spring-bean-names) +- [AliasFor Annotation in Spring](https://www.baeldung.com/spring-aliasfor-annotation) - More articles: [[<-- prev]](/spring-core-4) diff --git a/spring-core-5/pom.xml b/spring-core-5/pom.xml index 05ee1c5f5d..1c2e80be44 100644 --- a/spring-core-5/pom.xml +++ b/spring-core-5/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-core-5 spring-core-5 @@ -19,6 +19,11 @@ 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 @@ -37,4 +42,4 @@ 2.4.2 - + \ No newline at end of file diff --git a/spring-core-5/src/main/java/com/baeldung/aliasfor/MyMapping.java b/spring-core-5/src/main/java/com/baeldung/aliasfor/MyMapping.java new file mode 100644 index 0000000000..05263297b5 --- /dev/null +++ b/spring-core-5/src/main/java/com/baeldung/aliasfor/MyMapping.java @@ -0,0 +1,29 @@ +package com.baeldung.aliasfor; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.springframework.core.annotation.AliasFor; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@Target({ElementType.METHOD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@RequestMapping +public @interface MyMapping { + + @AliasFor(annotation = RequestMapping.class, attribute = "method") + RequestMethod[] action() default {}; + + @AliasFor(annotation = RequestMapping.class, attribute = "path") + String[] value() default {}; + + @AliasFor(annotation = RequestMapping.class, attribute = "path") + String[] mapping() default {}; + + @AliasFor(annotation = RequestMapping.class, attribute = "path") + String[] route() default {}; + +} diff --git a/spring-core-5/src/main/java/com/baeldung/aliasfor/MyMappingController.java b/spring-core-5/src/main/java/com/baeldung/aliasfor/MyMappingController.java new file mode 100644 index 0000000000..c3dc2784f8 --- /dev/null +++ b/spring-core-5/src/main/java/com/baeldung/aliasfor/MyMappingController.java @@ -0,0 +1,13 @@ +package com.baeldung.aliasfor; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMethod; + +@Controller +public class MyMappingController { + + @MyMapping(action = RequestMethod.PATCH, route = "/test") + public void mappingMethod() { + } + +} diff --git a/spring-core-5/src/test/java/com/baeldung/aliasfor/AliasForUnitTest.java b/spring-core-5/src/test/java/com/baeldung/aliasfor/AliasForUnitTest.java new file mode 100644 index 0000000000..7beada3f35 --- /dev/null +++ b/spring-core-5/src/test/java/com/baeldung/aliasfor/AliasForUnitTest.java @@ -0,0 +1,61 @@ +package com.baeldung.aliasfor; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.lang.reflect.Method; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = MyMappingController.class) +public class AliasForUnitTest { + + @Autowired + private ConfigurableApplicationContext context; + + Class controllerClass; + + @Before + public void setControllerBean() { + MyMappingController controllerBean = context.getBean(MyMappingController.class); + controllerClass = controllerBean.getClass(); + } + + @Test + public void givenComposedAnnotation_whenExplicitAlias_thenMetaAnnotationAttributeOverridden() { + + for (Method method : controllerClass.getMethods()) { + if (method.isAnnotationPresent(MyMapping.class)) { + MyMapping annotation = AnnotationUtils.findAnnotation(method, MyMapping.class); + RequestMapping metaAnnotation = AnnotationUtils.findAnnotation(method, RequestMapping.class); + + assertEquals(RequestMethod.PATCH, annotation.action()[0]); + + assertEquals(0, metaAnnotation.method().length); + } + } + } + + @Test + public void givenComposedAnnotation_whenImplictAlias_thenAttributesEqual() { + for (Method method : controllerClass.getMethods()) { + if (method.isAnnotationPresent(MyMapping.class)) { + MyMapping annotationOnBean = AnnotationUtils.findAnnotation(method, MyMapping.class); + + assertEquals(annotationOnBean.mapping()[0], annotationOnBean.route()[0]); + assertEquals(annotationOnBean.value()[0], annotationOnBean.route()[0]); + } + } + } + +} diff --git a/spring-core/pom.xml b/spring-core/pom.xml index 7d83fc198c..ab41670224 100644 --- a/spring-core/pom.xml +++ b/spring-core/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-core 0.0.1-SNAPSHOT diff --git a/spring-cucumber/pom.xml b/spring-cucumber/pom.xml index a945797ee1..c6c163d7d1 100644 --- a/spring-cucumber/pom.xml +++ b/spring-cucumber/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-cucumber 0.0.1-SNAPSHOT @@ -57,4 +58,4 @@ 1.3.2 - + \ No newline at end of file diff --git a/spring-data-rest-querydsl/pom.xml b/spring-data-rest-querydsl/pom.xml index 5e47f4979e..0b1cdd8928 100644 --- a/spring-data-rest-querydsl/pom.xml +++ b/spring-data-rest-querydsl/pom.xml @@ -1,7 +1,7 @@ + xmlns="http://maven.apache.org/POM/4.0.0" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-data-rest-querydsl 1.0 @@ -99,10 +99,11 @@ + 1.8 1.8 1.1.3 - + \ No newline at end of file diff --git a/spring-data-rest/pom.xml b/spring-data-rest/pom.xml index bfbd66a280..4a22ce92d1 100644 --- a/spring-data-rest/pom.xml +++ b/spring-data-rest/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-data-rest 1.0 diff --git a/spring-di-2/pom.xml b/spring-di-2/pom.xml index 4dd92ca18c..7d3f4c7b33 100644 --- a/spring-di-2/pom.xml +++ b/spring-di-2/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-di-2 1.0-SNAPSHOT @@ -78,4 +78,5 @@ 1.11 1 + \ No newline at end of file diff --git a/spring-di/pom.xml b/spring-di/pom.xml index df0b685ae2..cbd49242e4 100644 --- a/spring-di/pom.xml +++ b/spring-di/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-di 1.0-SNAPSHOT @@ -90,26 +90,22 @@ aspectjweaver ${aspectjweaver.version} - - - - - - + + + + javax.annotation javax.annotation-api ${annotation-api.version} - - - - - - - - + + + + + + @@ -155,7 +151,6 @@ 5.0.6.RELEASE 1.3.2 - 1.4.4.RELEASE 1 20.0 diff --git a/spring-drools/pom.xml b/spring-drools/pom.xml index 8b105158ec..b8c025893c 100644 --- a/spring-drools/pom.xml +++ b/spring-drools/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-drools 1.0.0-SNAPSHOT @@ -14,7 +15,6 @@ - org.kie kie-ci @@ -77,4 +77,5 @@ 7.0.0.Final + \ No newline at end of file diff --git a/spring-ejb/ejb-beans/pom.xml b/spring-ejb/ejb-beans/pom.xml index 8f2bf31ee4..cdc28ef5d7 100644 --- a/spring-ejb/ejb-beans/pom.xml +++ b/spring-ejb/ejb-beans/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.singletonsession ejb-beans @@ -41,7 +42,7 @@ spring-context ${springframework.version} - + javax.ejb javax.ejb-api @@ -188,4 +189,4 @@ 8.2.1.Final - + \ No newline at end of file diff --git a/spring-ejb/pom.xml b/spring-ejb/pom.xml index 1b3a52184e..383cde1e69 100755 --- a/spring-ejb/pom.xml +++ b/spring-ejb/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.spring.ejb spring-ejb @@ -16,22 +17,12 @@ ../ - - - jboss-public-repository-group - JBoss Public Maven Repository Group - http://repository.jboss.org/nexus/content/groups/public/ - default - - true - never - - - true - never - - - + + spring-ejb-remote + ejb-beans + spring-ejb-client + wildfly + @@ -57,6 +48,23 @@ + + + jboss-public-repository-group + JBoss Public Maven Repository Group + http://repository.jboss.org/nexus/content/groups/public/ + default + + true + never + + + true + never + + + + @@ -71,13 +79,6 @@ - - spring-ejb-remote - ejb-beans - spring-ejb-client - wildfly - - 1.0.0-SNAPSHOT 8.0 @@ -86,4 +87,4 @@ 3.2 - + \ No newline at end of file diff --git a/spring-ejb/spring-ejb-client/pom.xml b/spring-ejb/spring-ejb-client/pom.xml index 6c335e8982..ecf9d0eb49 100644 --- a/spring-ejb/spring-ejb-client/pom.xml +++ b/spring-ejb/spring-ejb-client/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-ejb-client spring-ejb-client @@ -30,30 +31,25 @@ org.springframework.boot spring-boot-starter-web - org.wildfly wildfly-ejb-client-bom pom - com.baeldung.spring.ejb spring-ejb-remote ejb - org.springframework.boot spring-boot-starter-test test - io.undertow undertow-servlet - @@ -70,4 +66,4 @@ 2.0.4.RELEASE - + \ No newline at end of file diff --git a/spring-ejb/spring-ejb-remote/pom.xml b/spring-ejb/spring-ejb-remote/pom.xml index 28d5398b97..b7bf2aa79b 100644 --- a/spring-ejb/spring-ejb-remote/pom.xml +++ b/spring-ejb/spring-ejb-remote/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-ejb-remote spring-ejb-remote @@ -40,16 +40,13 @@ org.codehaus.cargo cargo-maven2-plugin ${cargo-maven2-plugin.version} - - wildfly10x https://download.jboss.org/wildfly/12.0.0.Final/wildfly-12.0.0.Final.zip - 127.0.0.1 @@ -58,13 +55,11 @@ testUser:admin1234! - - wildfly-runtime diff --git a/spring-ejb/wildfly/pom.xml b/spring-ejb/wildfly/pom.xml index fdf2517139..ae90f71b7c 100644 --- a/spring-ejb/wildfly/pom.xml +++ b/spring-ejb/wildfly/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.wildfly wildfly diff --git a/spring-ejb/wildfly/widlfly-web/pom.xml b/spring-ejb/wildfly/widlfly-web/pom.xml index 79d0dca470..fb8a7678af 100644 --- a/spring-ejb/wildfly/widlfly-web/pom.xml +++ b/spring-ejb/wildfly/widlfly-web/pom.xml @@ -1,11 +1,12 @@ - 4.0.0 widlfly-web - widlfly-web + widlfly-web war - + com.baeldung.wildfly wildfly diff --git a/spring-ejb/wildfly/wildfly-ear/pom.xml b/spring-ejb/wildfly/wildfly-ear/pom.xml index 07f53358bf..da321cb9eb 100644 --- a/spring-ejb/wildfly/wildfly-ear/pom.xml +++ b/spring-ejb/wildfly/wildfly-ear/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 wildfly-ear wildfly-ear diff --git a/spring-ejb/wildfly/wildfly-ejb-interfaces/pom.xml b/spring-ejb/wildfly/wildfly-ejb-interfaces/pom.xml index 21fc26106a..bc9159b667 100644 --- a/spring-ejb/wildfly/wildfly-ejb-interfaces/pom.xml +++ b/spring-ejb/wildfly/wildfly-ejb-interfaces/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 wildfly-ejb-interfaces wildfly-ejb-interfaces diff --git a/spring-ejb/wildfly/wildfly-ejb/pom.xml b/spring-ejb/wildfly/wildfly-ejb/pom.xml index c35e340ac9..36574bf984 100644 --- a/spring-ejb/wildfly/wildfly-ejb/pom.xml +++ b/spring-ejb/wildfly/wildfly-ejb/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 wildfly-ejb wildfly-ejb diff --git a/spring-ejb/wildfly/wildfly-jpa/pom.xml b/spring-ejb/wildfly/wildfly-jpa/pom.xml index 1bc618a296..603e337510 100644 --- a/spring-ejb/wildfly/wildfly-jpa/pom.xml +++ b/spring-ejb/wildfly/wildfly-jpa/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 wildfly-jpa wildfly-jpa diff --git a/spring-ejb/wildfly/wildfly-mdb/pom.xml b/spring-ejb/wildfly/wildfly-mdb/pom.xml index 109cff861b..0784725cde 100644 --- a/spring-ejb/wildfly/wildfly-mdb/pom.xml +++ b/spring-ejb/wildfly/wildfly-mdb/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 wildfly-mdb wildfly-mdb diff --git a/spring-exceptions/pom.xml b/spring-exceptions/pom.xml index 29ed7d5caa..337597a741 100644 --- a/spring-exceptions/pom.xml +++ b/spring-exceptions/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-exceptions 0.1-SNAPSHOT @@ -14,9 +15,7 @@ - - org.springframework spring-web @@ -49,9 +48,7 @@ spring-context ${org.springframework.version} - - org.hibernate hibernate-core @@ -73,33 +70,26 @@ tomcat-dbcp ${tomcat-dbcp.version} - - org.hibernate hibernate-validator ${hibernate-validator.version} - - javax.servlet javax.servlet-api ${javax.servlet-api.version} provided - javax.servlet jstl ${jstl.version} runtime - - com.google.guava guava @@ -111,22 +101,18 @@ ${commons-lang3.version} test - - org.springframework spring-test ${org.springframework.version} test - javax.el el-api ${javax.el.version} - org.apache.derby derby @@ -157,9 +143,7 @@ true - - org.apache.maven.plugins maven-war-plugin @@ -168,40 +152,30 @@ false - - - 4.3.4.RELEASE 4.2.0.RELEASE 3.21.0-GA - 5.2.5.Final 5.1.40 7.0.73 10.13.1.1 - 5.3.3.Final 2.2 - 19.0 - 4.4.5 4.5.2 - 2.9.0 - 2.7 1.6.1 - \ No newline at end of file diff --git a/spring-freemarker/pom.xml b/spring-freemarker/pom.xml index bdf7e97bce..07d37736b6 100644 --- a/spring-freemarker/pom.xml +++ b/spring-freemarker/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.freemarker spring-freemarker @@ -61,4 +62,4 @@ 1.5.10.RELEASE - + \ No newline at end of file diff --git a/spring-integration/pom.xml b/spring-integration/pom.xml index f46445a39f..f5aaa93ff7 100644 --- a/spring-integration/pom.xml +++ b/spring-integration/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.samples.spring.integration spring-integration @@ -16,7 +17,6 @@ - org.springframework.integration @@ -74,14 +74,12 @@ spring-integration-jdbc ${spring.version} - org.springframework.security spring-security-test ${spring.version} test - com.h2database h2 @@ -124,4 +122,4 @@ 1.4.197 - + \ No newline at end of file diff --git a/spring-jenkins-pipeline/pom.xml b/spring-jenkins-pipeline/pom.xml index 152e107409..f2fd4191fd 100644 --- a/spring-jenkins-pipeline/pom.xml +++ b/spring-jenkins-pipeline/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-jenkins-pipeline 0.0.1-SNAPSHOT @@ -83,4 +84,4 @@ 2.0.0 - + \ No newline at end of file diff --git a/spring-jersey/pom.xml b/spring-jersey/pom.xml index 50d377b73f..08c19f1d3b 100644 --- a/spring-jersey/pom.xml +++ b/spring-jersey/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-jersey 0.1-SNAPSHOT @@ -14,9 +15,7 @@ - - org.glassfish.jersey.containers jersey-container-servlet @@ -32,7 +31,6 @@ jersey-client ${jersey.version} - javax.servlet @@ -40,7 +38,6 @@ ${javax.servlet-api.version} provided - org.glassfish.jersey.ext @@ -53,9 +50,7 @@ - - org.apache.httpcomponents httpclient @@ -68,14 +63,12 @@ - org.apache.httpcomponents httpcore ${httpcore.version} test - org.glassfish.jersey.inject jersey-hk2 @@ -118,7 +111,6 @@ ${assertj-core.version} test - org.springframework.boot @@ -126,7 +118,6 @@ ${spring-boot.version} test - @@ -199,7 +190,6 @@ false - org.codehaus.cargo cargo-maven2-plugin @@ -231,4 +221,4 @@ 1.5.10.RELEASE - + \ No newline at end of file diff --git a/spring-jinq/pom.xml b/spring-jinq/pom.xml index 1f5d8cd915..14ac366e74 100644 --- a/spring-jinq/pom.xml +++ b/spring-jinq/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-jinq 0.1-SNAPSHOT @@ -20,24 +21,20 @@ jinq-jpa ${jinq.version} - com.h2database h2 - org.springframework.boot spring-boot-starter-data-jpa - org.springframework spring-orm - org.springframework.boot @@ -64,4 +61,4 @@ 1.8.29 - + \ No newline at end of file diff --git a/spring-jms/pom.xml b/spring-jms/pom.xml index 9cd9126fac..09bf854221 100644 --- a/spring-jms/pom.xml +++ b/spring-jms/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 spring-jms @@ -33,14 +34,13 @@ activemq-all ${activemq.version} - - org.springframework.boot - spring-boot-starter-test - ${spring-boot-test.version} - test - + org.springframework.boot + spring-boot-starter-test + ${spring-boot-test.version} + test + @@ -67,4 +67,4 @@ 1.5.10.RELEASE - + \ No newline at end of file diff --git a/spring-katharsis/pom.xml b/spring-katharsis/pom.xml index 674d9a2a14..b836a42bca 100644 --- a/spring-katharsis/pom.xml +++ b/spring-katharsis/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 org.springframework.samples spring-katharsis @@ -20,19 +21,15 @@ org.springframework.boot spring-boot-starter-web - org.springframework.boot spring-boot-starter-data-jpa - com.h2database h2 - - io.katharsis katharsis-spring @@ -140,4 +137,4 @@ 1.6.1 - + \ No newline at end of file diff --git a/spring-mobile/pom.xml b/spring-mobile/pom.xml index 465458ba49..1593de27a8 100644 --- a/spring-mobile/pom.xml +++ b/spring-mobile/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-mobile 1.0-SNAPSHOT @@ -30,17 +31,9 @@ spring-boot-starter-freemarker - - - spring-milestones - Spring Milestones - https://repo.spring.io/libs-milestone - - false - - - + - 2.0.0.M3 + 1.1.5.RELEASE - + + \ No newline at end of file diff --git a/spring-mockito/pom.xml b/spring-mockito/pom.xml index 5d2cd7c445..0753935d0c 100644 --- a/spring-mockito/pom.xml +++ b/spring-mockito/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-mockito 0.0.1-SNAPSHOT @@ -31,4 +32,4 @@ 2.24.0 - + \ No newline at end of file diff --git a/spring-protobuf/pom.xml b/spring-protobuf/pom.xml index f43faef0d1..44a83803bd 100644 --- a/spring-protobuf/pom.xml +++ b/spring-protobuf/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-protobuf 0.1-SNAPSHOT @@ -24,12 +25,10 @@ protobuf-java-format ${protobuf-java-format.version} - org.springframework.boot spring-boot-starter-web - org.apache.httpcomponents httpclient @@ -42,4 +41,4 @@ com.baeldung.protobuf.Application - + \ No newline at end of file diff --git a/spring-quartz/pom.xml b/spring-quartz/pom.xml index 283d1a1734..19ea302a1d 100644 --- a/spring-quartz/pom.xml +++ b/spring-quartz/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-quartz spring-quartz diff --git a/spring-reactor/pom.xml b/spring-reactor/pom.xml index 0115826fd6..c64d449553 100644 --- a/spring-reactor/pom.xml +++ b/spring-reactor/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-reactor 1.0-SNAPSHOT @@ -41,4 +42,4 @@ 2.0.8.RELEASE - + \ No newline at end of file diff --git a/spring-remoting/pom.xml b/spring-remoting/pom.xml index 59cb9f863e..ba76b56dbd 100644 --- a/spring-remoting/pom.xml +++ b/spring-remoting/pom.xml @@ -1,13 +1,15 @@ - + 4.0.0 spring-remoting 1.0-SNAPSHOT spring-remoting pom Parent for all projects related to Spring Remoting, except remoting-hessian-burlap - + com.baeldung @@ -16,6 +18,14 @@ ../parent-boot-2 + + remoting-hessian-burlap + remoting-http + remoting-amqp + remoting-jms + remoting-rmi + + @@ -27,12 +37,4 @@ - - remoting-hessian-burlap - remoting-http - remoting-amqp - remoting-jms - remoting-rmi - - \ No newline at end of file diff --git a/spring-remoting/remoting-amqp/pom.xml b/spring-remoting/remoting-amqp/pom.xml index ea0b605980..8ce70f86c2 100644 --- a/spring-remoting/remoting-amqp/pom.xml +++ b/spring-remoting/remoting-amqp/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 remoting-amqp remoting-amqp @@ -17,4 +18,4 @@ remoting-amqp-client - + \ No newline at end of file diff --git a/spring-remoting/remoting-amqp/remoting-amqp-client/pom.xml b/spring-remoting/remoting-amqp/remoting-amqp-client/pom.xml index 17c5b31e62..1bcab004f1 100644 --- a/spring-remoting/remoting-amqp/remoting-amqp-client/pom.xml +++ b/spring-remoting/remoting-amqp/remoting-amqp-client/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 remoting-amqp-client remoting-amqp-client @@ -31,4 +32,4 @@ - + \ No newline at end of file diff --git a/spring-remoting/remoting-amqp/remoting-amqp-server/pom.xml b/spring-remoting/remoting-amqp/remoting-amqp-server/pom.xml index 13d0c0a6da..6b6c12b41a 100644 --- a/spring-remoting/remoting-amqp/remoting-amqp-server/pom.xml +++ b/spring-remoting/remoting-amqp/remoting-amqp-server/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 remoting-amqp-server remoting-amqp-server @@ -34,4 +35,4 @@ 1.0-SNAPSHOT - + \ No newline at end of file diff --git a/spring-remoting/remoting-hessian-burlap/pom.xml b/spring-remoting/remoting-hessian-burlap/pom.xml index 67e3e3eab4..e5975b9f37 100644 --- a/spring-remoting/remoting-hessian-burlap/pom.xml +++ b/spring-remoting/remoting-hessian-burlap/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 remoting-hessian-burlap 1.0-SNAPSHOT @@ -9,7 +9,7 @@ pom - + com.baeldung parent-boot-1 0.0.1-SNAPSHOT diff --git a/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/pom.xml b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/pom.xml index 20680d5880..63458ef278 100644 --- a/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/pom.xml +++ b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/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 remoting-hessian-burlap-client remoting-hessian-burlap-client @@ -33,7 +33,6 @@ hessian ${hessian.version} - ${project.groupId} @@ -58,6 +57,7 @@ + 4.0.38 diff --git a/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-server/pom.xml b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-server/pom.xml index 6e4f2e81e4..d64e8c94c1 100644 --- a/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-server/pom.xml +++ b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-server/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 remoting-hessian-burlap-server remoting-hessian-burlap-server diff --git a/spring-remoting/remoting-http/pom.xml b/spring-remoting/remoting-http/pom.xml index 2e5195a909..22627c638c 100644 --- a/spring-remoting/remoting-http/pom.xml +++ b/spring-remoting/remoting-http/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 remoting-http remoting-http diff --git a/spring-remoting/remoting-http/remoting-http-api/pom.xml b/spring-remoting/remoting-http/remoting-http-api/pom.xml index 697c3f44e5..1f088a9ac1 100644 --- a/spring-remoting/remoting-http/remoting-http-api/pom.xml +++ b/spring-remoting/remoting-http/remoting-http-api/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 remoting-http-api remoting-http-api diff --git a/spring-remoting/remoting-http/remoting-http-client/pom.xml b/spring-remoting/remoting-http/remoting-http-client/pom.xml index 03de2d3e4d..909db5f902 100644 --- a/spring-remoting/remoting-http/remoting-http-client/pom.xml +++ b/spring-remoting/remoting-http/remoting-http-client/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 remoting-http-client remoting-http-client diff --git a/spring-remoting/remoting-http/remoting-http-server/pom.xml b/spring-remoting/remoting-http/remoting-http-server/pom.xml index 872688e683..be304b9e92 100644 --- a/spring-remoting/remoting-http/remoting-http-server/pom.xml +++ b/spring-remoting/remoting-http/remoting-http-server/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 remoting-http-server remoting-http-server diff --git a/spring-remoting/remoting-jms/pom.xml b/spring-remoting/remoting-jms/pom.xml index 33299cd2c5..61bd1d4cfd 100644 --- a/spring-remoting/remoting-jms/pom.xml +++ b/spring-remoting/remoting-jms/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 remoting-jms remoting-jms diff --git a/spring-remoting/remoting-jms/remoting-jms-client/pom.xml b/spring-remoting/remoting-jms/remoting-jms-client/pom.xml index 2f3f993b2e..9e8f230e26 100644 --- a/spring-remoting/remoting-jms/remoting-jms-client/pom.xml +++ b/spring-remoting/remoting-jms/remoting-jms-client/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 remoting-jms-client remoting-jms-client diff --git a/spring-remoting/remoting-jms/remoting-jms-server/pom.xml b/spring-remoting/remoting-jms/remoting-jms-server/pom.xml index 53d95edcd7..ae105627a0 100644 --- a/spring-remoting/remoting-jms/remoting-jms-server/pom.xml +++ b/spring-remoting/remoting-jms/remoting-jms-server/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 remoting-jms-server remoting-jms-server diff --git a/spring-remoting/remoting-rmi/pom.xml b/spring-remoting/remoting-rmi/pom.xml index 037e73658e..ee65c799a4 100644 --- a/spring-remoting/remoting-rmi/pom.xml +++ b/spring-remoting/remoting-rmi/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 remoting-rmi remoting-rmi diff --git a/spring-remoting/remoting-rmi/remoting-rmi-client/pom.xml b/spring-remoting/remoting-rmi/remoting-rmi-client/pom.xml index 5d8d82d6ab..91630a88e9 100644 --- a/spring-remoting/remoting-rmi/remoting-rmi-client/pom.xml +++ b/spring-remoting/remoting-rmi/remoting-rmi-client/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 remoting-rmi-client remoting-rmi-client diff --git a/spring-remoting/remoting-rmi/remoting-rmi-server/pom.xml b/spring-remoting/remoting-rmi/remoting-rmi-server/pom.xml index cb5eaa1031..ecf57018ec 100644 --- a/spring-remoting/remoting-rmi/remoting-rmi-server/pom.xml +++ b/spring-remoting/remoting-rmi/remoting-rmi-server/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 remoting-rmi-server remoting-rmi-server diff --git a/spring-roo/pom.xml b/spring-roo/pom.xml index a3680ade70..d1cf3e6412 100644 --- a/spring-roo/pom.xml +++ b/spring-roo/pom.xml @@ -1,7 +1,9 @@ - - + + 4.0.0 com.baeldung spring-roo @@ -13,7 +15,7 @@ io.spring.platform platform-bom Athens-RELEASE - + @@ -27,40 +29,33 @@ spring-boot-starter-test test - org.springframework.boot spring-boot-devtools true - org.springframework.roo org.springframework.roo.annotations pom - org.aspectj aspectjrt - org.apache.commons commons-lang3 - org.assertj assertj-core - - org.springframework.boot spring-boot-starter-data-jpa @@ -367,7 +362,6 @@ - org.springframework.boot @@ -397,18 +391,6 @@ - - - maven-snapshot-repository - Maven Snapshot Repository - https://oss.sonatype.org/content/repositories/snapshots - - false - - - true - - spring-roo-repository @@ -427,7 +409,6 @@ pom provided - io.springlets springlets-data-jpa @@ -640,4 +621,4 @@ 2.0.0.RELEASE - + \ No newline at end of file diff --git a/spring-scheduling/pom.xml b/spring-scheduling/pom.xml index b27f33196d..8df35c4844 100644 --- a/spring-scheduling/pom.xml +++ b/spring-scheduling/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-scheduling 0.1-SNAPSHOT diff --git a/spring-security-modules/pom.xml b/spring-security-modules/pom.xml index bb2702fc9d..0f4ba872ba 100644 --- a/spring-security-modules/pom.xml +++ b/spring-security-modules/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-security-modules 0.0.1-SNAPSHOT @@ -37,7 +38,7 @@ spring-security-web-mvc-custom spring-security-web-mvc spring-security-web-persisted-remember-me - spring-security-web-react + spring-security-web-react spring-security-web-rest-basic-auth spring-security-web-rest-custom spring-security-web-rest @@ -48,4 +49,4 @@ spring-social-login - + \ No newline at end of file diff --git a/spring-security-modules/spring-5-security-cognito/pom.xml b/spring-security-modules/spring-5-security-cognito/pom.xml index 877dbd52fa..4da8b2fae5 100644 --- a/spring-security-modules/spring-5-security-cognito/pom.xml +++ b/spring-security-modules/spring-5-security-cognito/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 spring-5-security-cognito @@ -32,7 +33,6 @@ org.thymeleaf.extras thymeleaf-extras-springsecurity5 - org.springframework.security @@ -62,4 +62,4 @@ com.baeldung.cognito.SpringCognitoApplication - + \ No newline at end of file diff --git a/spring-security-modules/spring-5-security-oauth/pom.xml b/spring-security-modules/spring-5-security-oauth/pom.xml index d31cf293a3..03e1880431 100644 --- a/spring-security-modules/spring-5-security-oauth/pom.xml +++ b/spring-security-modules/spring-5-security-oauth/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 spring-5-security-oauth @@ -36,7 +37,6 @@ org.springframework.boot spring-boot-starter-jersey - org.springframework.security.oauth.boot @@ -51,7 +51,6 @@ org.springframework.security spring-security-oauth2-jose - org.springframework spring-test @@ -72,4 +71,4 @@ com.baeldung.oauth2.SpringOAuthApplication - + \ No newline at end of file diff --git a/spring-security-modules/spring-5-security/pom.xml b/spring-security-modules/spring-5-security/pom.xml index d009115c92..73b956d1e7 100644 --- a/spring-security-modules/spring-5-security/pom.xml +++ b/spring-security-modules/spring-5-security/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-5-security 0.0.1-SNAPSHOT @@ -76,4 +77,4 @@ - + \ No newline at end of file diff --git a/spring-security-modules/spring-ldap/pom.xml b/spring-security-modules/spring-ldap/pom.xml index 60da7d4c0d..44f754673f 100644 --- a/spring-security-modules/spring-ldap/pom.xml +++ b/spring-security-modules/spring-ldap/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-ldap 0.1-SNAPSHOT @@ -14,7 +15,6 @@ - org.springframework.ldap spring-ldap-core @@ -26,13 +26,11 @@ - org.springframework spring-context ${spring-context.version} - org.springframework.ldap @@ -46,7 +44,6 @@ - org.apache.directory.server @@ -84,8 +81,6 @@ ${shared-ldap.version} test - - org.springframework.data diff --git a/spring-security-modules/spring-security-acl/pom.xml b/spring-security-modules/spring-security-acl/pom.xml index 5c04aaa9ca..7facc1b14b 100644 --- a/spring-security-modules/spring-security-acl/pom.xml +++ b/spring-security-modules/spring-security-acl/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-security-acl 0.0.1-SNAPSHOT @@ -58,4 +59,4 @@ 2.6.11 - + \ No newline at end of file diff --git a/spring-security-modules/spring-security-auth0/pom.xml b/spring-security-modules/spring-security-auth0/pom.xml index 0bd879a40b..106a0db29f 100644 --- a/spring-security-modules/spring-security-auth0/pom.xml +++ b/spring-security-modules/spring-security-auth0/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-security-auth0 1.0-SNAPSHOT @@ -23,20 +24,20 @@ org.springframework.boot spring-boot-starter-security - - org.springframework.security - spring-security-core - - - org.springframework.security - spring-security-oauth2-resource-server - - - com.auth0 - mvc-auth-commons - ${mvc-auth-commons.version} - - + + org.springframework.security + spring-security-core + + + org.springframework.security + spring-security-oauth2-resource-server + + + com.auth0 + mvc-auth-commons + ${mvc-auth-commons.version} + + org.json json ${json.version} @@ -72,4 +73,5 @@ 20190722 1.2.0 + \ No newline at end of file diff --git a/spring-security-modules/spring-security-config/cache-control/pom.xml b/spring-security-modules/spring-security-config/cache-control/pom.xml index 753307493d..b10d65615e 100644 --- a/spring-security-modules/spring-security-config/cache-control/pom.xml +++ b/spring-security-modules/spring-security-config/cache-control/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 cache-control 1.0-SNAPSHOT @@ -26,7 +27,6 @@ org.springframework.boot spring-boot-starter-security - org.springframework.boot spring-boot-starter-test diff --git a/spring-security-modules/spring-security-config/cors/pom.xml b/spring-security-modules/spring-security-config/cors/pom.xml index 175b21a77d..2b8efb9add 100644 --- a/spring-security-modules/spring-security-config/cors/pom.xml +++ b/spring-security-modules/spring-security-config/cors/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 cors cors @@ -35,7 +36,6 @@ org.springframework.boot spring-boot-starter-web - org.springframework.boot spring-boot-starter-test @@ -57,4 +57,4 @@ - + \ No newline at end of file diff --git a/spring-security-modules/spring-security-config/pom.xml b/spring-security-modules/spring-security-config/pom.xml index 2b6b6b6b4e..860a602aeb 100644 --- a/spring-security-modules/spring-security-config/pom.xml +++ b/spring-security-modules/spring-security-config/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-security-config 0.0.1-SNAPSHOT @@ -19,4 +20,4 @@ cors - + \ No newline at end of file diff --git a/spring-security-modules/spring-security-core/pom.xml b/spring-security-modules/spring-security-core/pom.xml index 9f1e7cda29..0eb70c0853 100644 --- a/spring-security-modules/spring-security-core/pom.xml +++ b/spring-security-modules/spring-security-core/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 spring-security-core @@ -99,4 +100,4 @@ - + \ No newline at end of file diff --git a/spring-security-modules/spring-security-ldap/pom.xml b/spring-security-modules/spring-security-ldap/pom.xml index baed682186..3755c33125 100644 --- a/spring-security-modules/spring-security-ldap/pom.xml +++ b/spring-security-modules/spring-security-ldap/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-security-ldap 0.1-SNAPSHOT @@ -15,7 +16,6 @@ - org.springframework.boot @@ -33,24 +33,21 @@ org.springframework.boot spring-boot-starter-actuator - org.springframework.security spring-security-ldap - org.apache.directory.server apacheds-server-jndi ${apacheds.version} - - spring-security-mvc-ldap + spring-security-ldap src/main/resources @@ -63,4 +60,4 @@ 1.5.5 - + \ No newline at end of file diff --git a/spring-security-modules/spring-security-legacy-oidc/pom.xml b/spring-security-modules/spring-security-legacy-oidc/pom.xml index a4ead0f6e0..148b836137 100644 --- a/spring-security-modules/spring-security-legacy-oidc/pom.xml +++ b/spring-security-modules/spring-security-legacy-oidc/pom.xml @@ -24,24 +24,20 @@ org.springframework.boot spring-boot-starter-web - org.springframework.boot spring-boot-starter-tomcat - org.springframework.security.oauth spring-security-oauth2 ${spring-security-oauth2.version} - org.springframework.security spring-security-jwt ${spring-security-jwt.version} - com.auth0 jwks-rsa @@ -55,4 +51,4 @@ 0.3.0 - + \ No newline at end of file diff --git a/spring-security-modules/spring-security-oauth2-sso/pom.xml b/spring-security-modules/spring-security-oauth2-sso/pom.xml index a272ba5b50..c9f9274c98 100644 --- a/spring-security-modules/spring-security-oauth2-sso/pom.xml +++ b/spring-security-modules/spring-security-oauth2-sso/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung spring-security-oauth2-sso @@ -30,4 +31,4 @@ 2.0.0-M2 - + \ No newline at end of file diff --git a/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-auth-server/pom.xml b/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-auth-server/pom.xml index 20a43eaf04..1a8d1b580f 100644 --- a/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-auth-server/pom.xml +++ b/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-auth-server/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-security-sso-auth-server spring-security-sso-auth-server @@ -24,4 +25,4 @@ - + \ No newline at end of file diff --git a/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-kerberos/pom.xml b/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-kerberos/pom.xml index f17ca171a5..c18769df1e 100644 --- a/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-kerberos/pom.xml +++ b/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-kerberos/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-security-sso-kerberos @@ -91,9 +91,9 @@ - + - com.baeldung.intro.Application + com.baeldung.intro.Application \ No newline at end of file diff --git a/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-ui-2/pom.xml b/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-ui-2/pom.xml index 514dd0d0f7..cd510a972a 100644 --- a/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-ui-2/pom.xml +++ b/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-ui-2/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-security-sso-ui-2 spring-security-sso-ui-2 @@ -13,33 +14,27 @@ - org.springframework.boot spring-boot-starter-web - org.springframework.boot spring-boot-starter-security - org.springframework.security.oauth.boot spring-security-oauth2-autoconfigure ${oauth-auto.version} - org.springframework.boot spring-boot-starter-thymeleaf - org.thymeleaf.extras thymeleaf-extras-springsecurity5 - - + \ No newline at end of file diff --git a/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-ui/pom.xml b/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-ui/pom.xml index 5076b1878b..ec2da615f4 100644 --- a/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-ui/pom.xml +++ b/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-ui/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-security-sso-ui spring-security-sso-ui @@ -13,34 +14,27 @@ - org.springframework.boot spring-boot-starter-web - org.springframework.boot spring-boot-starter-security - org.springframework.security.oauth.boot spring-security-oauth2-autoconfigure ${oauth-auto.version} - - org.springframework.boot spring-boot-starter-thymeleaf - org.thymeleaf.extras thymeleaf-extras-springsecurity5 - - + \ No newline at end of file diff --git a/spring-security-modules/spring-security-oidc/pom.xml b/spring-security-modules/spring-security-oidc/pom.xml index b9a4b340a3..2a413b1d27 100644 --- a/spring-security-modules/spring-security-oidc/pom.xml +++ b/spring-security-modules/spring-security-oidc/pom.xml @@ -26,4 +26,4 @@ - + \ No newline at end of file diff --git a/spring-security-modules/spring-security-okta/pom.xml b/spring-security-modules/spring-security-okta/pom.xml index c5ff9013b5..98b8abedb4 100644 --- a/spring-security-modules/spring-security-okta/pom.xml +++ b/spring-security-modules/spring-security-okta/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-security-okta 1.0-SNAPSHOT @@ -55,8 +56,9 @@ - + 1.4.0 - + + \ No newline at end of file diff --git a/spring-security-modules/spring-security-saml/pom.xml b/spring-security-modules/spring-security-saml/pom.xml index 561582045a..8a9b418374 100644 --- a/spring-security-modules/spring-security-saml/pom.xml +++ b/spring-security-modules/spring-security-saml/pom.xml @@ -14,6 +14,7 @@ 0.0.1-SNAPSHOT ../../parent-boot-2 + Shibboleth @@ -70,4 +71,5 @@ 1.0.10.RELEASE - + + \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-angular/server/pom.xml b/spring-security-modules/spring-security-web-angular/server/pom.xml index 07d5d44e8d..2e9ff9969d 100644 --- a/spring-security-modules/spring-security-web-angular/server/pom.xml +++ b/spring-security-modules/spring-security-web-angular/server/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 server 0.0.1-SNAPSHOT @@ -40,7 +41,6 @@ org.springframework.boot spring-boot-starter-web - org.springframework.boot spring-boot-starter-test @@ -62,4 +62,4 @@ - + \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-boot-1/pom.xml b/spring-security-modules/spring-security-web-boot-1/pom.xml index 1f80b62765..a376a49b4c 100644 --- a/spring-security-modules/spring-security-web-boot-1/pom.xml +++ b/spring-security-modules/spring-security-web-boot-1/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-security-web-boot-1 0.0.1-SNAPSHOT @@ -223,10 +223,9 @@ com.baeldung.roles.custom.Application - + - 1.1.2 1.6.1 2.6.11 diff --git a/spring-security-modules/spring-security-web-boot-2/pom.xml b/spring-security-modules/spring-security-web-boot-2/pom.xml index ca357509a3..ade644741d 100644 --- a/spring-security-modules/spring-security-web-boot-2/pom.xml +++ b/spring-security-modules/spring-security-web-boot-2/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-security-web-boot-2 0.0.1-SNAPSHOT @@ -184,7 +184,6 @@ - entryPoints @@ -222,19 +221,18 @@ - + com.baeldung.multiplelogin.MultipleLoginApplication - + - + - 1.1.2 1.6.1 2.6.11 - + \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-boot-3/pom.xml b/spring-security-modules/spring-security-web-boot-3/pom.xml index a6e2b48d75..1fff259c16 100644 --- a/spring-security-modules/spring-security-web-boot-3/pom.xml +++ b/spring-security-modules/spring-security-web-boot-3/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-security-web-boot-3 0.0.1-SNAPSHOT @@ -27,4 +27,4 @@ - + \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-digest-auth/pom.xml b/spring-security-modules/spring-security-web-digest-auth/pom.xml index 39433c1295..710a3dd3b6 100644 --- a/spring-security-modules/spring-security-web-digest-auth/pom.xml +++ b/spring-security-modules/spring-security-web-digest-auth/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 spring-security-web-digest-auth @@ -15,9 +16,7 @@ - - org.springframework.security spring-security-web @@ -28,9 +27,7 @@ spring-security-config ${org.springframework.security.version} - - org.springframework spring-core @@ -72,7 +69,6 @@ spring-expression ${spring.version} - org.springframework spring-web @@ -83,37 +79,30 @@ spring-webmvc ${spring.version} - org.springframework spring-oxm ${spring.version} - - javax.servlet javax.servlet-api ${javax.servlet-api.version} provided - javax.servlet jstl ${jstl.version} runtime - - com.google.guava guava ${guava.version} - org.apache.httpcomponents httpcore @@ -125,7 +114,6 @@ - org.apache.httpcomponents httpclient @@ -137,35 +125,28 @@ - - org.springframework spring-test ${spring.version} test - - - spring-security-mvc-digest-auth + spring-security-web-digest-auth src/main/resources true - - org.apache.maven.plugins maven-war-plugin ${maven-war-plugin.version} - org.codehaus.cargo cargo-maven2-plugin @@ -186,21 +167,16 @@ - - 4.2.6.RELEASE - 19.0 - 4.4.5 4.5.2 - 1.6.1 diff --git a/spring-security-modules/spring-security-web-login/pom.xml b/spring-security-modules/spring-security-web-login/pom.xml index 2b64d157d3..ac5393c1a0 100644 --- a/spring-security-modules/spring-security-web-login/pom.xml +++ b/spring-security-modules/spring-security-web-login/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 spring-security-web-login @@ -15,9 +16,7 @@ - - org.springframework.security spring-security-web @@ -33,9 +32,7 @@ spring-security-taglibs ${spring-security.version} - - org.springframework spring-core @@ -77,7 +74,6 @@ spring-expression ${spring.version} - org.springframework spring-web @@ -88,25 +84,20 @@ spring-webmvc ${spring.version} - - javax.servlet javax.servlet-api ${javax.servlet-api.version} provided - javax.servlet jstl ${jstl.version} runtime - - org.springframework spring-test @@ -119,20 +110,17 @@ ${spring-security.version} test - - spring-security-mvc-login + spring-security-web-login src/main/resources true - - org.apache.maven.plugins maven-war-plugin @@ -147,7 +135,6 @@ - org.codehaus.cargo cargo-maven2-plugin @@ -168,9 +155,7 @@ - - diff --git a/spring-security-modules/spring-security-web-mvc-custom/pom.xml b/spring-security-modules/spring-security-web-mvc-custom/pom.xml index bd4a800bc5..539f83d7b8 100644 --- a/spring-security-modules/spring-security-web-mvc-custom/pom.xml +++ b/spring-security-modules/spring-security-web-mvc-custom/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 spring-security-web-mvc-custom @@ -15,9 +16,7 @@ - - org.springframework.security spring-security-web @@ -33,9 +32,7 @@ spring-security-taglibs ${spring-security.version} - - org.springframework spring-core @@ -77,7 +74,6 @@ spring-expression ${spring.version} - org.springframework spring-web @@ -88,59 +84,48 @@ spring-webmvc ${spring.version} - - javax.servlet javax.servlet-api ${javax.servlet-api.version} provided - javax.servlet jstl ${jstl.version} runtime - - - com.fasterxml.jackson.core jackson-databind ${jackson.version} - org.apache.commons commons-lang3 ${commons-lang3.version} - com.google.guava guava ${guava.version} - - org.springframework spring-test ${spring.version} test - org.springframework.security spring-security-test @@ -150,22 +135,19 @@ - spring-security-mvc-custom + spring-security-web-mvc-custom src/main/resources true - - org.apache.maven.plugins maven-war-plugin ${maven-war-plugin.version} - org.codehaus.cargo cargo-maven2-plugin @@ -186,18 +168,14 @@ - - 19.0 - 1.6.1 - \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-mvc/pom.xml b/spring-security-modules/spring-security-web-mvc/pom.xml index b1e94b2db3..505826d1a2 100644 --- a/spring-security-modules/spring-security-web-mvc/pom.xml +++ b/spring-security-modules/spring-security-web-mvc/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-security-web-mvc 0.1-SNAPSHOT @@ -16,9 +16,7 @@ - - org.springframework.boot spring-boot-starter-security @@ -27,7 +25,6 @@ org.springframework.security spring-security-taglibs - org.springframework.boot @@ -42,19 +39,16 @@ org.springframework.boot spring-boot-starter-tomcat - javax.servlet jstl runtime - io.dropwizard.metrics metrics-core - org.springframework.boot @@ -67,7 +61,6 @@ ${javax.version} - @@ -86,4 +79,4 @@ 4.0.1 - + \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-persisted-remember-me/pom.xml b/spring-security-modules/spring-security-web-persisted-remember-me/pom.xml index 25c5ddd9d0..66a2b3866b 100644 --- a/spring-security-modules/spring-security-web-persisted-remember-me/pom.xml +++ b/spring-security-modules/spring-security-web-persisted-remember-me/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 spring-security-web-persisted-remember-me @@ -15,9 +16,7 @@ - - org.springframework.security spring-security-web @@ -38,9 +37,7 @@ spring-orm ${spring.version} - - org.springframework spring-core @@ -82,7 +79,6 @@ spring-expression ${spring.version} - org.springframework spring-web @@ -93,81 +89,66 @@ spring-webmvc ${spring.version} - - javax.servlet javax.servlet-api ${javax.servlet-api.version} provided - javax.servlet jstl ${jstl.version} runtime - - com.h2database h2 ${h2.version} - org.postgresql postgresql ${postgresql.version} runtime - - com.google.guava guava ${guava.version} - - org.springframework.boot - spring-boot-starter-test - ${spring-boot.version} - test - - + org.springframework.boot + spring-boot-starter-test + ${spring-boot.version} + test + - - - spring-security-mvc-persisted-remember-me + spring-security-web-persisted-remember-me src/main/resources true - - org.apache.maven.plugins maven-war-plugin ${maven-war-plugin.version} - org.codehaus.cargo cargo-maven2-plugin @@ -188,21 +169,16 @@ - - 4.2.6.RELEASE - 9.4.1212 - 19.0 - 1.6.1 1.5.10.RELEASE diff --git a/spring-security-modules/spring-security-web-react/pom.xml b/spring-security-modules/spring-security-web-react/pom.xml index 663c7d76c3..e8f74413ff 100644 --- a/spring-security-modules/spring-security-web-react/pom.xml +++ b/spring-security-modules/spring-security-web-react/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-security-web-react 0.1-SNAPSHOT @@ -15,9 +16,7 @@ - - org.springframework.security spring-security-web @@ -33,9 +32,7 @@ spring-security-taglibs ${spring-security.version} - - org.springframework spring-core @@ -56,7 +53,6 @@ spring-aop ${spring.version} - org.springframework spring-web @@ -67,9 +63,7 @@ spring-webmvc ${spring.version} - - javax.servlet javax.servlet-api @@ -82,7 +76,6 @@ ${jstl.version} runtime - org.springframework.boot @@ -90,20 +83,17 @@ 1.5.10.RELEASE test - - spring-security-react + spring-security-web-react src/main/resources true - - org.apache.maven.plugins maven-war-plugin @@ -118,7 +108,6 @@ - com.github.eirslett frontend-maven-plugin @@ -152,27 +141,22 @@ - org.eclipse.jetty jetty-maven-plugin 9.4.11.v20180605 - - default-first - com.github.eirslett frontend-maven-plugin - install node and npm @@ -193,13 +177,11 @@ default-second - com.github.eirslett frontend-maven-plugin - install node and npm @@ -223,14 +205,13 @@ 19.0 - 2.7 1.6 9.4.11.v20180605 - v8.11.3 6.1.0 + \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/pom.xml b/spring-security-modules/spring-security-web-rest-basic-auth/pom.xml index 0dc0b9cc42..de28df1933 100644 --- a/spring-security-modules/spring-security-web-rest-basic-auth/pom.xml +++ b/spring-security-modules/spring-security-web-rest-basic-auth/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 spring-security-web-rest-basic-auth @@ -15,9 +16,7 @@ - - org.springframework.security spring-security-web @@ -28,9 +27,7 @@ spring-security-config ${spring-security.version} - - org.springframework spring-core @@ -72,7 +69,6 @@ spring-expression ${spring.version} - org.springframework spring-web @@ -83,23 +79,18 @@ spring-webmvc ${spring.version} - org.springframework spring-oxm ${spring.version} - - com.fasterxml.jackson.core jackson-databind ${jackson.version} - - @@ -111,7 +102,6 @@ - org.apache.httpcomponents httpcore @@ -123,7 +113,6 @@ - org.apache.httpcomponents httpclient @@ -135,59 +124,48 @@ - - javax.servlet javax.servlet-api ${javax.servlet-api.version} provided - javax.servlet jstl ${jstl.version} runtime - - com.google.guava guava ${guava.version} - - org.springframework spring-test ${spring.version} test - - spring-security-rest-basic-auth + spring-security-web-rest-basic-auth src/main/resources true - - org.apache.maven.plugins maven-war-plugin ${maven-war-plugin.version} - org.codehaus.cargo cargo-maven2-plugin @@ -208,9 +186,7 @@ - - @@ -238,7 +214,6 @@ - org.apache.maven.plugins maven-surefire-plugin @@ -262,21 +237,17 @@ - - 4.4.11 4.5.8 - 19.0 - 1.6.1 diff --git a/spring-security-modules/spring-security-web-rest-custom/pom.xml b/spring-security-modules/spring-security-web-rest-custom/pom.xml index 0ba7f95de7..85e50412ad 100644 --- a/spring-security-modules/spring-security-web-rest-custom/pom.xml +++ b/spring-security-modules/spring-security-web-rest-custom/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-security-web-rest-custom 0.1-SNAPSHOT @@ -15,9 +16,7 @@ - - org.springframework.security spring-security-web @@ -34,9 +33,7 @@ org.thymeleaf thymeleaf-spring5 - - org.springframework spring-core @@ -65,7 +62,6 @@ org.springframework spring-expression - org.springframework spring-web @@ -74,53 +70,41 @@ org.springframework spring-webmvc - org.springframework spring-oxm - commons-logging commons-logging ${commons-logging.version} - - com.fasterxml.jackson.core jackson-databind - - javax.servlet javax.servlet-api provided - javax.servlet jstl runtime - - org.apache.httpcomponents httpcore - org.apache.httpcomponents httpclient - - com.google.guava guava @@ -131,32 +115,27 @@ commons-lang3 ${commons-lang3.version} - - org.hamcrest hamcrest test - org.mockito mockito-core test - - spring-security-rest-custom + spring-security-web-rest-custom src/main/resources true - org.springframework.boot @@ -172,7 +151,6 @@ false - org.codehaus.cargo cargo-maven2-plugin @@ -193,16 +171,13 @@ - - 19.0 1.2 - 1.6.1 diff --git a/spring-security-modules/spring-security-web-rest/pom.xml b/spring-security-modules/spring-security-web-rest/pom.xml index 2330243aa6..2fc50b2674 100644 --- a/spring-security-modules/spring-security-web-rest/pom.xml +++ b/spring-security-modules/spring-security-web-rest/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-security-web-rest 0.1-SNAPSHOT @@ -15,9 +16,7 @@ - - org.springframework.security spring-security-web @@ -28,9 +27,7 @@ spring-security-config ${spring-security.version} - - org.springframework spring-core @@ -72,7 +69,6 @@ spring-expression ${spring.version} - org.springframework spring-web @@ -83,37 +79,30 @@ spring-webmvc ${spring.version} - - javax.servlet javax.servlet-api ${javax.servlet-api.version} provided - javax.servlet jstl ${jstl.version} runtime - javax.validation validation-api ${javax.validation.version} - - com.fasterxml.jackson.core jackson-databind ${jackson.version} - com.google.guava @@ -125,7 +114,6 @@ commons-lang3 ${commons-lang3.version} - org.springframework @@ -133,15 +121,12 @@ ${spring.version} test - org.springframework.security spring-security-test ${spring-security.version} test - - com.jayway.restassured rest-assured @@ -154,37 +139,32 @@ - io.springfox springfox-swagger2 ${springfox-swagger.version} - io.springfox springfox-swagger-ui ${springfox-swagger.version} - commons-fileupload commons-fileupload ${commons-fileupload.version} - - spring-security-rest + spring-security-web-rest src/main/resources true - org.codehaus.cargo @@ -205,9 +185,7 @@ - - @@ -235,7 +213,6 @@ - org.apache.maven.plugins maven-surefire-plugin @@ -267,18 +244,14 @@ 1.1.0.Final - 26.0-jre - 2.9.0 - - 2.9.2 - + 3.0.0 1.6.1 - + \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-rest/src/main/java/com/baeldung/swagger2/SwaggerConfig.java b/spring-security-modules/spring-security-web-rest/src/main/java/com/baeldung/swagger2/SwaggerConfig.java index c8c4227ebf..08a5931f7d 100644 --- a/spring-security-modules/spring-security-web-rest/src/main/java/com/baeldung/swagger2/SwaggerConfig.java +++ b/spring-security-modules/spring-security-web-rest/src/main/java/com/baeldung/swagger2/SwaggerConfig.java @@ -6,12 +6,11 @@ import java.util.Collections; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.http.HttpMethod; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.builders.ResponseMessageBuilder; -import springfox.documentation.schema.ModelRef; +import springfox.documentation.builders.ResponseBuilder; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.spi.DocumentationType; @@ -30,13 +29,12 @@ public class SwaggerConfig { .build() .apiInfo(apiInfo()) .useDefaultResponseMessages(false) - .globalResponseMessage(RequestMethod.GET, newArrayList(new ResponseMessageBuilder().code(500) - .message("500 message") - .responseModel(new ModelRef("Error")) - .build(), - new ResponseMessageBuilder().code(403) - .message("Forbidden!!!!!") - .build())); + .globalResponses(HttpMethod.GET, newArrayList( + new ResponseBuilder().code("500") + .description("500 message").build(), + new ResponseBuilder().code("403") + .description("Forbidden!!!!!").build() + )); } private ApiInfo apiInfo() { diff --git a/spring-security-modules/spring-security-web-sockets/pom.xml b/spring-security-modules/spring-security-web-sockets/pom.xml index 4aecf296b4..e822b6beda 100644 --- a/spring-security-modules/spring-security-web-sockets/pom.xml +++ b/spring-security-modules/spring-security-web-sockets/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.springsecuredsockets spring-security-web-sockets @@ -50,7 +51,6 @@ - org.springframework.security @@ -62,7 +62,6 @@ spring-security-config ${spring-security.version} - org.springframework.data @@ -79,7 +78,6 @@ h2 ${h2.version} - org.springframework @@ -96,7 +94,6 @@ spring-security-messaging ${spring-security.version} - org.slf4j @@ -108,7 +105,6 @@ logback-classic ${logback-classic.version} - javax.servlet @@ -130,7 +126,6 @@ jstl ${jstl.version} - com.fasterxml.jackson.core @@ -147,7 +142,6 @@ jackson-annotations ${jackson.version} - org.springframework.boot @@ -158,7 +152,7 @@ - spring-security-mvc-socket + spring-security-web-sockets org.apache.tomcat.maven diff --git a/spring-security-modules/spring-security-web-thymeleaf/pom.xml b/spring-security-modules/spring-security-web-thymeleaf/pom.xml index 196ec0b86f..8e6e0856af 100644 --- a/spring-security-modules/spring-security-web-thymeleaf/pom.xml +++ b/spring-security-modules/spring-security-web-thymeleaf/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-security-web-thymeleaf 0.0.1-SNAPSHOT @@ -54,4 +55,4 @@ - + \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-x509/pom.xml b/spring-security-modules/spring-security-web-x509/pom.xml index 045c0aba6a..5282ab7d83 100644 --- a/spring-security-modules/spring-security-web-x509/pom.xml +++ b/spring-security-modules/spring-security-web-x509/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-security-web-x509 0.0.1-SNAPSHOT @@ -34,4 +35,4 @@ - + \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-x509/spring-security-web-x509-basic-auth/pom.xml b/spring-security-modules/spring-security-web-x509/spring-security-web-x509-basic-auth/pom.xml index 917ffa6b0e..9598843b63 100644 --- a/spring-security-modules/spring-security-web-x509/spring-security-web-x509-basic-auth/pom.xml +++ b/spring-security-modules/spring-security-web-x509/spring-security-web-x509-basic-auth/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-security-web-x509-basic-auth 0.0.1-SNAPSHOT @@ -35,4 +36,4 @@ - + \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-x509/spring-security-web-x509-client-auth/pom.xml b/spring-security-modules/spring-security-web-x509/spring-security-web-x509-client-auth/pom.xml index fdbc90c0f6..f310ab1e5c 100644 --- a/spring-security-modules/spring-security-web-x509/spring-security-web-x509-client-auth/pom.xml +++ b/spring-security-modules/spring-security-web-x509/spring-security-web-x509-client-auth/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-security-web-x509-client-auth 0.0.1-SNAPSHOT @@ -71,4 +72,4 @@ - + \ No newline at end of file diff --git a/spring-security-modules/spring-session/pom.xml b/spring-security-modules/spring-session/pom.xml index ac10700240..aec64da088 100644 --- a/spring-security-modules/spring-session/pom.xml +++ b/spring-security-modules/spring-session/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung spring-session @@ -21,4 +22,4 @@ spring-session-mongodb - + \ No newline at end of file diff --git a/spring-security-modules/spring-session/spring-session-jdbc/pom.xml b/spring-security-modules/spring-session/spring-session-jdbc/pom.xml index 95c366fc2e..64bbce44f2 100644 --- a/spring-security-modules/spring-session/spring-session-jdbc/pom.xml +++ b/spring-security-modules/spring-session/spring-session-jdbc/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-session-jdbc 0.0.1-SNAPSHOT diff --git a/spring-security-modules/spring-session/spring-session-mongodb/pom.xml b/spring-security-modules/spring-session/spring-session-mongodb/pom.xml index 82c8520356..878dfeb690 100644 --- a/spring-security-modules/spring-session/spring-session-mongodb/pom.xml +++ b/spring-security-modules/spring-session/spring-session-mongodb/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-session-mongodb 0.0.1-SNAPSHOT @@ -21,23 +21,19 @@ org.springframework.boot spring-boot-starter-web - org.springframework.session spring-session-data-mongodb - org.springframework.boot spring-boot-starter-data-mongodb - org.springframework.boot spring-boot-starter-test test - de.flapdoodle.embed de.flapdoodle.embed.mongo diff --git a/spring-security-modules/spring-session/spring-session-redis/pom.xml b/spring-security-modules/spring-session/spring-session-redis/pom.xml index 36eb632e1c..6824a3632d 100644 --- a/spring-security-modules/spring-session/spring-session-redis/pom.xml +++ b/spring-security-modules/spring-session/spring-session-redis/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-session-redis 1.0.0-SNAPSHOT @@ -36,7 +37,7 @@ embedded-redis ${embedded-redis.version} - + redis.clients jedis jar diff --git a/spring-security-modules/spring-social-login/pom.xml b/spring-security-modules/spring-social-login/pom.xml index 209a546a5a..ad4b7c72a6 100644 --- a/spring-security-modules/spring-social-login/pom.xml +++ b/spring-security-modules/spring-social-login/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-social-login spring-social-login @@ -14,68 +15,54 @@ - org.springframework.boot spring-boot-starter-web - org.springframework.boot spring-boot-starter-thymeleaf - org.springframework.security spring-security-web - org.springframework.security spring-security-config - org.springframework.security spring-security-taglibs - org.thymeleaf.extras thymeleaf-extras-springsecurity5 - - org.springframework.social spring-social-facebook ${spring.social.facebook.version} - org.springframework.boot spring-boot-starter-data-jpa - com.h2database h2 - - org.springframework spring-test test - org.apache.commons commons-lang3 ${commons-lang3.version} - @@ -86,7 +73,6 @@ true - org.apache.maven.plugins @@ -94,7 +80,7 @@ - + 2.0.3.RELEASE diff --git a/spring-shell/pom.xml b/spring-shell/pom.xml index be1562b942..4e64436486 100644 --- a/spring-shell/pom.xml +++ b/spring-shell/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-shell 0.1-SNAPSHOT @@ -26,4 +27,4 @@ 1.2.0.RELEASE - + \ No newline at end of file diff --git a/spring-sleuth/pom.xml b/spring-sleuth/pom.xml index c37086558d..5fd109e968 100644 --- a/spring-sleuth/pom.xml +++ b/spring-sleuth/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-sleuth 1.0.0-SNAPSHOT @@ -41,4 +42,4 @@ 2.0.2.RELEASE - + \ No newline at end of file diff --git a/spring-soap/pom.xml b/spring-soap/pom.xml index bea3d033e6..8188178d61 100644 --- a/spring-soap/pom.xml +++ b/spring-soap/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-soap 1.0.0 @@ -37,7 +38,6 @@ org.springframework.boot spring-boot-maven-plugin - org.codehaus.mojo @@ -58,7 +58,6 @@ - org.jvnet.jaxb2.maven2 maven-jaxb2-plugin @@ -84,4 +83,4 @@ - + \ No newline at end of file diff --git a/spring-spel/pom.xml b/spring-spel/pom.xml index 2109117a86..9ea51cd796 100644 --- a/spring-spel/pom.xml +++ b/spring-spel/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-spel 1.0-SNAPSHOT diff --git a/spring-state-machine/pom.xml b/spring-state-machine/pom.xml index acb14a7613..bc2b67cc38 100644 --- a/spring-state-machine/pom.xml +++ b/spring-state-machine/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-state-machine spring-state-machine diff --git a/spring-static-resources/pom.xml b/spring-static-resources/pom.xml index 662c757f54..2841da9028 100644 --- a/spring-static-resources/pom.xml +++ b/spring-static-resources/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-static-resources 0.1.0-SNAPSHOT @@ -31,7 +32,6 @@ spring-security-taglibs ${spring-security.version} - org.springframework @@ -74,7 +74,6 @@ spring-expression ${spring.version} - org.springframework spring-web @@ -85,7 +84,6 @@ spring-webmvc ${spring.version} - org.aspectj @@ -97,7 +95,6 @@ javax.inject ${inject.version} - javax.servlet @@ -119,41 +116,35 @@ jackson-databind ${jackson.version} - org.hibernate hibernate-validator ${hibernate-validator.version} - joda-time joda-time ${joda-time.version} - com.github.jknack handlebars ${handlebars.version} - commons-io commons-io ${commons-io.version} - org.springframework spring-test ${spring.version} test - @@ -204,14 +195,12 @@ 1.8.9 2.3.2-b02 - 6.0.10.Final 4.1.0 2.10 4.0.1 1 - 1.5.1 diff --git a/spring-swagger-codegen/pom.xml b/spring-swagger-codegen/pom.xml index 39d8902956..93cb51d07c 100644 --- a/spring-swagger-codegen/pom.xml +++ b/spring-swagger-codegen/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-swagger-codegen 0.0.1-SNAPSHOT @@ -19,4 +20,4 @@ spring-swagger-codegen-app - + \ No newline at end of file diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/pom.xml b/spring-swagger-codegen/spring-openapi-generator-api-client/pom.xml index 3074849e4c..c3e694ba80 100644 --- a/spring-swagger-codegen/spring-openapi-generator-api-client/pom.xml +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 com.baeldung spring-openapi-generator-api-client @@ -13,7 +14,6 @@ scm:git:git@github.com:openapitools/openapi-generator.git https://github.com/openapitools/openapi-generator - Unlicense @@ -21,7 +21,6 @@ repo - OpenAPI-Generator Contributors @@ -31,51 +30,24 @@ - - - sign-artifacts - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.5 - - - sign-artifacts - verify - - sign - - - - - - - - - io.swagger swagger-annotations ${swagger-annotations-version} - com.google.code.findbugs jsr305 3.0.2 - org.springframework spring-web ${spring-web-version} - com.fasterxml.jackson.core @@ -102,17 +74,16 @@ jackson-databind-nullable ${jackson-databind-nullable-version} - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - ${jackson-version} - - - com.github.joschi.jackson - jackson-datatype-threetenbp - ${jackson-threetenbp-version} - - + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson-version} + + + com.github.joschi.jackson + jackson-datatype-threetenbp + ${jackson-threetenbp-version} + junit @@ -174,7 +145,6 @@ - org.apache.maven.plugins @@ -191,7 +161,6 @@ - org.codehaus.mojo build-helper-maven-plugin @@ -228,8 +197,8 @@ maven-compiler-plugin 3.6.1 - 1.8 - 1.8 + 1.8 + 1.8 @@ -261,14 +230,39 @@ + + + sign-artifacts + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.5 + + + sign-artifacts + verify + + sign + + + + + + + + + 1.5.22 4.3.9.RELEASE 2.11.1 - + 0.2.1 2.9.10 1.0.0 4.13 - + + \ No newline at end of file diff --git a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml index b9b97139d6..c9ba912feb 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml +++ b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml @@ -1,19 +1,18 @@ - + 4.0.0 spring-swagger-codegen-api-client spring-swagger-codegen-api-client jar https://github.com/swagger-api/swagger-codegen Swagger Java - scm:git:git@github.com:swagger-api/swagger-codegen.git scm:git:git@github.com:swagger-api/swagger-codegen.git https://github.com/swagger-api/swagger-codegen - Unlicense @@ -21,7 +20,6 @@ repo - Swagger @@ -44,14 +42,12 @@ swagger-annotations ${swagger-annotations-version} - org.springframework spring-web ${spring-web-version} - com.fasterxml.jackson.core @@ -103,7 +99,6 @@ - org.codehaus.mojo build-helper-maven-plugin @@ -199,4 +194,4 @@ 1.10 - + \ No newline at end of file diff --git a/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml b/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml index cb3fe89c8f..493b7201ee 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml +++ b/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-swagger-codegen-app spring-swagger-codegen-app @@ -46,4 +47,4 @@ 1.5.10.RELEASE - + \ No newline at end of file diff --git a/spring-threads/pom.xml b/spring-threads/pom.xml index 4513c627b9..31984bfbf5 100644 --- a/spring-threads/pom.xml +++ b/spring-threads/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-threads 0.0.1-SNAPSHOT @@ -22,4 +23,4 @@ - + \ No newline at end of file diff --git a/spring-vault/pom.xml b/spring-vault/pom.xml index a39c5575a9..759de80a6b 100644 --- a/spring-vault/pom.xml +++ b/spring-vault/pom.xml @@ -1,7 +1,7 @@ - + 4.0.0 spring-vault 0.0.1-SNAPSHOT @@ -41,4 +41,4 @@ 2.1.1.RELEASE - + \ No newline at end of file diff --git a/spring-vertx/pom.xml b/spring-vertx/pom.xml index ef169c9a27..bd2dfa6cf6 100644 --- a/spring-vertx/pom.xml +++ b/spring-vertx/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-vertx spring-vertx @@ -29,13 +30,11 @@ - io.vertx vertx-web ${vertx.version} - com.h2database h2 @@ -61,4 +60,4 @@ 3.4.1 - + \ No newline at end of file diff --git a/spring-web-modules/pom.xml b/spring-web-modules/pom.xml index ca96dcff35..e498185c5e 100644 --- a/spring-web-modules/pom.xml +++ b/spring-web-modules/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-web-modules 0.0.1-SNAPSHOT @@ -18,7 +19,7 @@ spring-mvc-basics spring-mvc-basics-2 spring-mvc-basics-3 - spring-mvc-basics-4 + spring-mvc-basics-4 spring-mvc-crash spring-mvc-forms-jsp spring-mvc-forms-thymeleaf @@ -44,4 +45,4 @@ spring-boot-jsp - + \ No newline at end of file diff --git a/spring-web-modules/spring-5-mvc/pom.xml b/spring-web-modules/spring-5-mvc/pom.xml index ddcce8207b..79a4f73ace 100644 --- a/spring-web-modules/spring-5-mvc/pom.xml +++ b/spring-web-modules/spring-5-mvc/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-5-mvc spring-5-mvc @@ -96,4 +96,4 @@ 0.18 - + \ No newline at end of file diff --git a/spring-web-modules/spring-boot-jsp/pom.xml b/spring-web-modules/spring-boot-jsp/pom.xml index d646b6058a..30335fcc65 100644 --- a/spring-web-modules/spring-boot-jsp/pom.xml +++ b/spring-web-modules/spring-boot-jsp/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-jsp 0.0.1-SNAPSHOT @@ -35,8 +35,8 @@ org.apache.tomcat.embed tomcat-embed-jasper - - + + org.projectlombok @@ -48,12 +48,12 @@ org.springframework.boot spring-boot-starter-web - - - - - - + + + + + + org.springframework.boot spring-boot-starter-test diff --git a/spring-web-modules/spring-mvc-basics-2/pom.xml b/spring-web-modules/spring-mvc-basics-2/pom.xml index adc42d8db8..9136676d20 100644 --- a/spring-web-modules/spring-mvc-basics-2/pom.xml +++ b/spring-web-modules/spring-mvc-basics-2/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-mvc-basics-2 0.0.1-SNAPSHOT @@ -60,7 +61,6 @@ spring-tx ${spring.version} - org.thymeleaf @@ -72,7 +72,6 @@ thymeleaf-spring5 ${org.thymeleaf-version} - org.freemarker @@ -89,21 +88,18 @@ spring-boot-starter-freemarker ${spring-boot.version} - org.codehaus.groovy groovy-templates ${groovy.version} - de.neuland-bfi spring-jade4j ${jade.version} - org.springframework @@ -171,4 +167,4 @@ 2.3.4.RELEASE - + \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-3/pom.xml b/spring-web-modules/spring-mvc-basics-3/pom.xml index a9245814a8..f9710ff2d1 100644 --- a/spring-web-modules/spring-mvc-basics-3/pom.xml +++ b/spring-web-modules/spring-mvc-basics-3/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-mvc-basics-3 spring-mvc-basics-3 @@ -15,69 +16,57 @@ - org.springframework.boot spring-boot-starter-web - org.springframework.boot spring-boot-starter-validation - org.springframework.boot spring-boot-starter-test test - org.springframework.boot spring-boot-starter-thymeleaf provided - org.springframework.boot spring-boot-starter-data-jpa - org.springframework.boot spring-boot-starter-mail - org.springframework.boot spring-boot-starter-actuator - com.h2database h2 runtime - javax.persistence javax.persistence-api ${jpa.version} - com.google.guava guava ${guava.version} - org.subethamail subethasmtp ${subethasmtp.version} test - org.apache.httpcomponents httpclient @@ -146,4 +135,4 @@ 4.5.8 - + \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-4/pom.xml b/spring-web-modules/spring-mvc-basics-4/pom.xml index 07dddcde0c..067d1ed3b1 100644 --- a/spring-web-modules/spring-mvc-basics-4/pom.xml +++ b/spring-web-modules/spring-mvc-basics-4/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-mvc-basics-4 spring-mvc-basics-4 diff --git a/spring-web-modules/spring-mvc-basics/pom.xml b/spring-web-modules/spring-mvc-basics/pom.xml index ac92c7bfe5..9fe4494393 100644 --- a/spring-web-modules/spring-mvc-basics/pom.xml +++ b/spring-web-modules/spring-mvc-basics/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-mvc-basics 0.1-SNAPSHOT @@ -28,7 +28,7 @@ commons-fileupload commons-fileupload ${commons-fileupload.version} - + org.apache.tomcat.embed @@ -60,5 +60,4 @@ - - + \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-crash/pom.xml b/spring-web-modules/spring-mvc-crash/pom.xml index 9a0d97bae9..9574eff2a4 100644 --- a/spring-web-modules/spring-mvc-crash/pom.xml +++ b/spring-web-modules/spring-mvc-crash/pom.xml @@ -15,9 +15,7 @@ - - org.springframework spring-web @@ -28,37 +26,30 @@ spring-webmvc ${org.springframework.version} - - javax.servlet javax.servlet-api ${javax.servlet-api.version} provided - javax.servlet jstl ${jstl.version} runtime - org.hibernate.validator hibernate-validator ${hibernate-validator.version} - - com.fasterxml.jackson.core jackson-databind ${jackson.version} - commons-io @@ -85,14 +76,12 @@ javax.el ${javax.el.version} - org.springframework.boot spring-boot-starter-test ${spring-boot.version} test - org.crashub @@ -115,7 +104,6 @@ - org.codehaus.groovy @@ -125,52 +113,41 @@ - spring-mvc-xml + spring-mvc-crash src/main/resources true - - org.apache.maven.plugins maven-war-plugin ${maven-war-plugin.version} - - 5.0.2.RELEASE 1.5.10.RELEASE - 5.1.40 - 4.4.5 4.5.2 - 6.0.10.Final 3.0.1-b08 - 19.0 2.8.0 - 1.6.1 - 1.3.2 3.0.0-rc-3 - - + \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-forms-jsp/pom.xml b/spring-web-modules/spring-mvc-forms-jsp/pom.xml index 0ca23bd6cb..94eb51a32d 100644 --- a/spring-web-modules/spring-mvc-forms-jsp/pom.xml +++ b/spring-web-modules/spring-mvc-forms-jsp/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 0.1-SNAPSHOT spring-mvc-forms-jsp @@ -91,7 +92,7 @@ - spring-mvc-forms + spring-mvc-forms-jsp @@ -102,5 +103,4 @@ 6.0.6 - - + \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-forms-thymeleaf/README.md b/spring-web-modules/spring-mvc-forms-thymeleaf/README.md index 57fa32901c..eb005346f6 100644 --- a/spring-web-modules/spring-mvc-forms-thymeleaf/README.md +++ b/spring-web-modules/spring-mvc-forms-thymeleaf/README.md @@ -6,4 +6,5 @@ This module contains articles about Spring MVC Forms using Thymeleaf - [Session Attributes in Spring MVC](https://www.baeldung.com/spring-mvc-session-attributes) - [Binding a List in Thymeleaf](https://www.baeldung.com/thymeleaf-list) +- [Multipart Request Handling in Spring](https://www.baeldung.com/sprint-boot-multipart-requests) diff --git a/spring-web-modules/spring-mvc-forms-thymeleaf/pom.xml b/spring-web-modules/spring-mvc-forms-thymeleaf/pom.xml index 641f64b93c..37bcee0b8d 100644 --- a/spring-web-modules/spring-mvc-forms-thymeleaf/pom.xml +++ b/spring-web-modules/spring-mvc-forms-thymeleaf/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-mvc-forms-thymeleaf spring-mvc-forms-thymeleaf @@ -23,6 +24,10 @@ org.springframework.boot spring-boot-starter-thymeleaf + + org.projectlombok + lombok + @@ -42,4 +47,4 @@ com.baeldung.sessionattrs.SessionAttrsApplication - + \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/multipartupload/Employee.java b/spring-web-modules/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/multipartupload/Employee.java new file mode 100644 index 0000000000..0bc600dd6a --- /dev/null +++ b/spring-web-modules/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/multipartupload/Employee.java @@ -0,0 +1,16 @@ +package com.baeldung.multipartupload; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.web.multipart.MultipartFile; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class Employee { + private String name; + private MultipartFile document; +} diff --git a/spring-web-modules/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/multipartupload/EmployeeController.java b/spring-web-modules/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/multipartupload/EmployeeController.java new file mode 100644 index 0000000000..e02844233e --- /dev/null +++ b/spring-web-modules/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/multipartupload/EmployeeController.java @@ -0,0 +1,49 @@ +package com.baeldung.multipartupload; + +import lombok.AllArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.multipart.MultipartFile; + +import static org.springframework.web.bind.annotation.RequestMethod.POST; + +@Controller +@AllArgsConstructor +public class EmployeeController { + + private final EmployeeService employeeService; + + @GetMapping(value = "/employee") + public String showEmployeeForm(Model model) { + model.addAttribute("employee", new Employee()); + return "employee/createEmployeeForm"; + } + + @RequestMapping(path = "/employee", method = POST, consumes = { MediaType.MULTIPART_FORM_DATA_VALUE }) + public String saveEmployee(@ModelAttribute Employee employee) { + employeeService.save(employee); + return "employee/success"; + } + + @RequestMapping(path = "/requestpart/employee", method = POST, consumes = { MediaType.MULTIPART_FORM_DATA_VALUE }) + public ResponseEntity saveEmployee(@RequestPart Employee employee, @RequestPart MultipartFile document) { + employee.setDocument(document); + employeeService.save(employee); + return ResponseEntity.ok().build(); + } + + @RequestMapping(path = "/requestparam/employee", method = POST, consumes = { MediaType.MULTIPART_FORM_DATA_VALUE }) + public ResponseEntity saveEmployee(@RequestParam String name, @RequestPart MultipartFile document) { + Employee employee = new Employee(name, document); + employeeService.save(employee); + return ResponseEntity.ok().build(); + } + +} \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/multipartupload/EmployeeRepository.java b/spring-web-modules/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/multipartupload/EmployeeRepository.java new file mode 100644 index 0000000000..d4182e100d --- /dev/null +++ b/spring-web-modules/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/multipartupload/EmployeeRepository.java @@ -0,0 +1,8 @@ +package com.baeldung.multipartupload; + +import org.springframework.stereotype.Repository; + +@Repository +public interface EmployeeRepository { + void saveEmployee(Employee employee); +} \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/multipartupload/EmployeeService.java b/spring-web-modules/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/multipartupload/EmployeeService.java new file mode 100644 index 0000000000..f6906c8ba9 --- /dev/null +++ b/spring-web-modules/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/multipartupload/EmployeeService.java @@ -0,0 +1,36 @@ +package com.baeldung.multipartupload; + +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.file.Files; + +@Service +public class EmployeeService { + + public void save(Employee employee) { + saveFile(employee.getDocument()); + // save other employee data + } + + private void saveFile(MultipartFile multipartFile) { + try { + saveToFilesystem(multipartFile); + } catch (Exception e) { + throw new RuntimeException("Unable to save file", e); + } + } + + private static void saveToFilesystem(MultipartFile multipartFile) throws IOException { + String dir = Files.createTempDirectory("tmpDir").toFile().getAbsolutePath(); + File file = new File(dir + File.pathSeparator + multipartFile.getName()); + + try (OutputStream os = new FileOutputStream(file)) { + os.write(multipartFile.getBytes()); + } + } +} diff --git a/spring-web-modules/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/multipartupload/MultipartUploadApplication.java b/spring-web-modules/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/multipartupload/MultipartUploadApplication.java new file mode 100644 index 0000000000..299a5c2325 --- /dev/null +++ b/spring-web-modules/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/multipartupload/MultipartUploadApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.multipartupload; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class MultipartUploadApplication { + + public static void main(String[] args) { + SpringApplication.run(MultipartUploadApplication.class, args); + } + +} diff --git a/spring-web-modules/spring-mvc-forms-thymeleaf/src/main/resources/templates/employee/createEmployeeForm.html b/spring-web-modules/spring-mvc-forms-thymeleaf/src/main/resources/templates/employee/createEmployeeForm.html new file mode 100644 index 0000000000..c88a8b9318 --- /dev/null +++ b/spring-web-modules/spring-mvc-forms-thymeleaf/src/main/resources/templates/employee/createEmployeeForm.html @@ -0,0 +1,16 @@ + + + + Getting Started: Handling Form Submission + + + +

Form

+
+

name:

+

document: + +

+
+ + \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-forms-thymeleaf/src/main/resources/templates/employee/success.html b/spring-web-modules/spring-mvc-forms-thymeleaf/src/main/resources/templates/employee/success.html new file mode 100644 index 0000000000..2a49c01613 --- /dev/null +++ b/spring-web-modules/spring-mvc-forms-thymeleaf/src/main/resources/templates/employee/success.html @@ -0,0 +1,8 @@ + + + + + + Employee data submitted. + + \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/multipartupload/EmployeeControllerIntegrationTest.java b/spring-web-modules/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/multipartupload/EmployeeControllerIntegrationTest.java new file mode 100644 index 0000000000..73cf905a34 --- /dev/null +++ b/spring-web-modules/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/multipartupload/EmployeeControllerIntegrationTest.java @@ -0,0 +1,56 @@ +package com.baeldung.multipartupload; + +import org.junit.jupiter.api.Test; +import org.mockito.BDDMockito; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import static org.apache.http.entity.ContentType.DEFAULT_BINARY; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest +@EnableWebMvc +public class EmployeeControllerIntegrationTest { + + private static final MockMultipartFile A_FILE = new MockMultipartFile("document", null, DEFAULT_BINARY.toString(), "Employee Record".getBytes()); + + @Autowired + private MockMvc mockMvc; + + @MockBean + private EmployeeService employeeService; + + @Test + public void givenFormData_whenPost_thenReturns200OK() throws Exception { + + mockMvc.perform(multipart("/employee") + .file(A_FILE) + .param("name", "testname")) + .andExpect(status().isOk()); + } + + @Test + public void givenEmployeeJsonAndMultipartFile_whenPostWithRequestPart_thenReturnsOK() throws Exception { + MockMultipartFile employeeJson = new MockMultipartFile("employee", null, + "application/json", "{\"name\": \"Emp Name\"}".getBytes()); + + mockMvc.perform(multipart("/requestpart/employee") + .file(A_FILE) + .file(employeeJson)) + .andExpect(status().isOk()); + } + + @Test + public void givenRequestPartAndRequestParam_whenPost_thenReturns200OK() throws Exception { + mockMvc.perform(multipart("/requestparam/employee") + .file(A_FILE) + .param("name", "testname")) + .andExpect(status().isOk()); + } +} \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-java-2/pom.xml b/spring-web-modules/spring-mvc-java-2/pom.xml index 8a025defac..1bbb066786 100644 --- a/spring-web-modules/spring-mvc-java-2/pom.xml +++ b/spring-web-modules/spring-mvc-java-2/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-mvc-java-2 0.1-SNAPSHOT @@ -53,5 +53,4 @@ 5.2.2.RELEASE - - + \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-java/pom.xml b/spring-web-modules/spring-mvc-java/pom.xml index 1324511215..b8f5ec7910 100644 --- a/spring-web-modules/spring-mvc-java/pom.xml +++ b/spring-web-modules/spring-mvc-java/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-mvc-java 0.1-SNAPSHOT @@ -68,8 +69,6 @@ commons-fileupload ${commons-fileupload.version} - - org.thymeleaf @@ -81,7 +80,6 @@ thymeleaf ${thymeleaf.version} - com.jayway.jsonpath json-path @@ -93,14 +91,12 @@ spring-boot-starter-test test - org.apache.poi poi-ooxml ${poi.version} - org.hibernate.validator @@ -122,14 +118,11 @@ true - - maven-resources-plugin ${maven-resources-plugin.version} - org.apache.maven.plugins maven-war-plugin @@ -138,7 +131,6 @@ false - org.codehaus.cargo cargo-maven2-plugin @@ -217,43 +209,34 @@ - 3.0.9.RELEASE - 6.0.10.Final 5.1.40 - 6.0.10.Final - 19.0 2.2.0 - 4.4.5 4.5.2 3.0.7 2.23 - 3.2.2 2.7 1.6.1 3.1.0 - 1.9.1 - 3.16-beta1 - 3.0.1-b09 4.0.1 2.3.3 @@ -262,5 +245,4 @@ com.baeldung.SpringMVCApplication - - + \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-velocity/pom.xml b/spring-web-modules/spring-mvc-velocity/pom.xml index 05016962a5..1b1e8b1ea4 100644 --- a/spring-web-modules/spring-mvc-velocity/pom.xml +++ b/spring-web-modules/spring-mvc-velocity/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-mvc-velocity 0.1-SNAPSHOT @@ -15,9 +16,7 @@ - - org.springframework spring-web @@ -33,22 +32,18 @@ spring-context-support ${spring.version} - - javax.servlet javax.servlet-api ${javax.servlet-api.version} provided - org.apache.velocity velocity ${velocity.version} - org.apache.velocity velocity-tools @@ -60,7 +55,6 @@ - org.powermock @@ -80,7 +74,6 @@ ${spring.version} test - @@ -91,7 +84,6 @@ true - org.apache.maven.plugins @@ -107,13 +99,11 @@ 1.6.6 - 4.4.5 4.5.2 1.7 2.0 2.9.0 - 2.7 1.6.1 diff --git a/spring-web-modules/spring-mvc-views/pom.xml b/spring-web-modules/spring-mvc-views/pom.xml index 649814263c..7e48175ff2 100644 --- a/spring-web-modules/spring-mvc-views/pom.xml +++ b/spring-web-modules/spring-mvc-views/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-mvc-views war @@ -50,37 +50,31 @@ hibernate-core ${hibernate.version} - org.hsqldb hsqldb ${hsqldb.version} - org.springframework.security spring-security-web ${spring.security.version} - org.springframework.security spring-security-config ${spring.security.version} - org.springframework.security spring-security-taglibs ${spring.security.version} - org.apache.tiles tiles-jsp ${apache-tiles.version} - @@ -95,7 +89,6 @@ ${java.version} - org.apache.maven.plugins maven-war-plugin diff --git a/spring-web-modules/spring-mvc-webflow/pom.xml b/spring-web-modules/spring-mvc-webflow/pom.xml index ab0f86394a..2e150e2d01 100644 --- a/spring-web-modules/spring-mvc-webflow/pom.xml +++ b/spring-web-modules/spring-mvc-webflow/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-mvc-webflow 0.1-SNAPSHOT @@ -14,7 +15,6 @@ - org.springframework @@ -26,14 +26,12 @@ spring-webmvc ${org.springframework.version} - org.springframework.webflow spring-webflow ${spring.webflow} - javax.servlet @@ -52,7 +50,6 @@ log4j-over-slf4j ${org.slf4j.version} - org.springframework.boot @@ -60,7 +57,6 @@ ${spring-boot-starter-test.version} test - @@ -86,7 +82,8 @@ .class - -Xmx2048m -XX:PermSize=256m -Dtomee.serialization.class.blacklist=- -Dtomee.serialization.class.whitelist=* + -Xmx2048m -XX:PermSize=256m -Dtomee.serialization.class.blacklist=- + -Dtomee.serialization.class.whitelist=* true @@ -104,13 +101,10 @@ 5.0.1.RELEASE - 2.5.0.RELEASE - 4.4.5 4.5.2 - 2.7 1.6.1 diff --git a/spring-web-modules/spring-mvc-xml/pom.xml b/spring-web-modules/spring-mvc-xml/pom.xml index 4812d5c979..354d652095 100644 --- a/spring-web-modules/spring-mvc-xml/pom.xml +++ b/spring-web-modules/spring-mvc-xml/pom.xml @@ -15,9 +15,7 @@ - - org.springframework spring-web @@ -28,37 +26,30 @@ spring-webmvc ${org.springframework.version} - - javax.servlet javax.servlet-api ${javax.servlet-api.version} provided - javax.servlet jstl ${jstl.version} runtime - org.hibernate.validator hibernate-validator ${hibernate-validator.version} - - com.fasterxml.jackson.core jackson-databind ${jackson.version} - commons-io @@ -85,14 +76,12 @@ javax.el ${javax.el.version} - org.springframework.boot spring-boot-starter-test ${spring-boot.version} test - org.crashub @@ -115,7 +104,6 @@ - org.codehaus.groovy @@ -132,45 +120,34 @@ true - - org.apache.maven.plugins maven-war-plugin ${maven-war-plugin.version} - - 5.0.2.RELEASE 1.5.10.RELEASE - 5.1.40 - 4.4.5 4.5.2 - 6.0.10.Final 3.0.1-b08 - 19.0 2.8.0 - 1.6.1 - 1.3.2 3.0.0-rc-3 - - + \ No newline at end of file diff --git a/spring-web-modules/spring-rest-angular/pom.xml b/spring-web-modules/spring-rest-angular/pom.xml index eb1ec8696c..ef14e78198 100644 --- a/spring-web-modules/spring-rest-angular/pom.xml +++ b/spring-web-modules/spring-rest-angular/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-rest-angular 1.0 @@ -77,4 +78,4 @@ com.baeldung.web.main.Application - + \ No newline at end of file diff --git a/spring-web-modules/spring-rest-http-2/pom.xml b/spring-web-modules/spring-rest-http-2/pom.xml index a349ac1116..10d904e302 100644 --- a/spring-web-modules/spring-rest-http-2/pom.xml +++ b/spring-web-modules/spring-rest-http-2/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-rest-http-2 0.1-SNAPSHOT @@ -53,4 +54,4 @@ 1.6.1 - + \ No newline at end of file diff --git a/spring-web-modules/spring-rest-http/pom.xml b/spring-web-modules/spring-rest-http/pom.xml index 94d1be7814..5a92b585e3 100644 --- a/spring-web-modules/spring-rest-http/pom.xml +++ b/spring-web-modules/spring-rest-http/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-rest-http 0.1-SNAPSHOT @@ -15,7 +16,6 @@ - org.springframework.boot spring-boot-starter-web @@ -54,13 +54,11 @@ json-patch ${jsonpatch.version} - - 1.4.9 1.12 - + \ No newline at end of file diff --git a/spring-web-modules/spring-rest-query-language/pom.xml b/spring-web-modules/spring-rest-query-language/pom.xml index 5e7ca023dd..c5a8c172f3 100644 --- a/spring-web-modules/spring-rest-query-language/pom.xml +++ b/spring-web-modules/spring-rest-query-language/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-rest-query-language 0.1-SNAPSHOT @@ -15,7 +16,6 @@ - org.springframework.boot @@ -25,7 +25,6 @@ org.springframework.boot spring-boot-starter-actuator - org.aspectj aspectjweaver @@ -35,9 +34,7 @@ tomcat-embed-jasper provided - - org.springframework spring-core @@ -84,16 +81,12 @@ org.springframework.data spring-data-commons - - org.springframework.boot spring-boot-starter-tomcat - - com.querydsl querydsl-apt @@ -102,17 +95,13 @@ com.querydsl querydsl-jpa - - cz.jirutka.rsql rsql-parser ${rsql.version} - - org.apache.httpcomponents httpclient @@ -127,9 +116,7 @@ org.apache.httpcomponents httpcore - - org.springframework spring-orm @@ -157,67 +144,53 @@ mysql-connector-java runtime - com.h2database h2 - - javax.servlet javax.servlet-api provided - javax.servlet jstl runtime - - com.fasterxml.jackson.core jackson-databind - com.thoughtworks.xstream xstream ${xstream.version} - - com.google.guava guava ${guava.version} - - org.springframework spring-test test - org.hamcrest hamcrest test - org.mockito mockito-core test - @@ -228,14 +201,11 @@ true - - org.apache.maven.plugins maven-war-plugin - org.codehaus.cargo cargo-maven2-plugin @@ -256,9 +226,7 @@ - - com.mysema.maven apt-maven-plugin @@ -275,9 +243,7 @@ - - @@ -342,18 +308,15 @@ 2.1.0 - 1.4.9 3.21.0-GA 1.4.01 - 19.0 - 1.7.0 1.1.3 - + \ No newline at end of file diff --git a/spring-web-modules/spring-rest-shell/pom.xml b/spring-web-modules/spring-rest-shell/pom.xml index f5792fd6ca..b83a0b6002 100644 --- a/spring-web-modules/spring-rest-shell/pom.xml +++ b/spring-web-modules/spring-rest-shell/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-rest-shell spring-rest-shell @@ -28,7 +29,6 @@ org.springframework.boot spring-boot-starter-data-rest - com.h2database @@ -46,4 +46,4 @@ - + \ No newline at end of file diff --git a/spring-web-modules/spring-rest-simple/pom.xml b/spring-web-modules/spring-rest-simple/pom.xml index b9d5100fbf..e7671e0af0 100644 --- a/spring-web-modules/spring-rest-simple/pom.xml +++ b/spring-web-modules/spring-rest-simple/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-rest-simple 0.1-SNAPSHOT @@ -15,7 +16,6 @@ - org.springframework.boot @@ -38,7 +38,6 @@ org.springframework.boot spring-boot-starter-web - org.springframework @@ -64,7 +63,6 @@ ${commons-fileupload.version} - javax.servlet javax.servlet-api @@ -75,9 +73,7 @@ jstl runtime - - com.fasterxml.jackson.core jackson-databind @@ -91,9 +87,7 @@ xstream ${xstream.version} - - com.google.guava guava @@ -104,9 +98,7 @@ commons-lang3 ${commons-lang3.version} - - org.slf4j slf4j-api @@ -121,17 +113,13 @@ jcl-over-slf4j - - com.squareup.okhttp3 okhttp ${com.squareup.okhttp3.version} - - junit junit @@ -258,7 +246,6 @@ - live @@ -283,7 +270,6 @@ - org.apache.maven.plugins maven-surefire-plugin @@ -307,7 +293,6 @@ - @@ -318,19 +303,15 @@ 1.4 3.1.0 1.4.9 - 20.0 2.9.0 - 1.6.0 3.0.4 - 3.4.1 - 2.2.0 - + \ No newline at end of file diff --git a/spring-web-modules/spring-rest-testing/pom.xml b/spring-web-modules/spring-rest-testing/pom.xml index fea8d25e4d..dc5fdcd323 100644 --- a/spring-web-modules/spring-rest-testing/pom.xml +++ b/spring-web-modules/spring-rest-testing/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-rest-testing 0.1-SNAPSHOT @@ -15,7 +16,6 @@ - org.springframework.boot @@ -34,9 +34,7 @@ tomcat-embed-jasper provided - - org.springframework spring-core @@ -83,16 +81,12 @@ org.springframework.data spring-data-commons - - org.springframework.boot spring-boot-starter-tomcat - - org.apache.httpcomponents httpclient @@ -107,9 +101,7 @@ org.apache.httpcomponents httpcore - - org.springframework spring-orm @@ -145,9 +137,7 @@ net.bytebuddy byte-buddy - - javax.servlet javax.servlet-api @@ -158,41 +148,33 @@ jstl runtime - com.fasterxml.jackson.core jackson-databind - - com.google.guava guava ${guava.version} - - org.springframework spring-test test - org.hamcrest hamcrest test - org.mockito mockito-core test - @@ -285,14 +267,12 @@ 1.4.9 1.4.01 - 19.0 3.25.0-GA - 1.6.1 1.1.3 - + \ No newline at end of file diff --git a/spring-web-modules/spring-resttemplate-2/pom.xml b/spring-web-modules/spring-resttemplate-2/pom.xml index 158380b403..d0191b970e 100644 --- a/spring-web-modules/spring-resttemplate-2/pom.xml +++ b/spring-web-modules/spring-resttemplate-2/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-resttemplate-2 0.1-SNAPSHOT @@ -15,7 +16,6 @@ - org.springframework.boot @@ -27,29 +27,23 @@ - org.springframework.boot spring-boot-starter-jetty - org.apache.httpcomponents httpclient - commons-io commons-io ${commons-io.version} - org.springframework.boot spring-boot-starter-test - - org.springframework @@ -61,7 +55,6 @@ - org.slf4j @@ -71,7 +64,6 @@ ch.qos.logback logback-classic - diff --git a/spring-web-modules/spring-resttemplate-3/pom.xml b/spring-web-modules/spring-resttemplate-3/pom.xml index b1c26e002f..8e313ccf39 100644 --- a/spring-web-modules/spring-resttemplate-3/pom.xml +++ b/spring-web-modules/spring-resttemplate-3/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-resttemplate-3 0.1-SNAPSHOT @@ -26,4 +27,4 @@ - + \ No newline at end of file diff --git a/spring-web-modules/spring-resttemplate/pom.xml b/spring-web-modules/spring-resttemplate/pom.xml index 1db6b5db57..221efd77ee 100644 --- a/spring-web-modules/spring-resttemplate/pom.xml +++ b/spring-web-modules/spring-resttemplate/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-resttemplate 0.1-SNAPSHOT @@ -15,7 +16,6 @@ - org.springframework.boot @@ -37,14 +37,11 @@ org.springframework.boot spring-boot-starter-test - - au.com.dius pact-jvm-provider-junit_2.11 ${pact.version} - org.springframework @@ -64,9 +61,7 @@ org.springframework spring-oxm - - com.fasterxml.jackson.core jackson-databind @@ -80,9 +75,7 @@ xstream ${xstream.version} - - com.google.guava guava @@ -93,9 +86,7 @@ commons-lang3 ${commons-lang3.version} - - org.slf4j slf4j-api @@ -110,24 +101,19 @@ jcl-over-slf4j - - com.squareup.okhttp3 okhttp ${com.squareup.okhttp3.version} - - junit junit ${junit.version} - org.hamcrest hamcrest @@ -153,7 +139,6 @@ - org.apache.maven.plugins maven-compiler-plugin @@ -232,7 +217,6 @@ - @@ -260,7 +244,6 @@ - org.apache.maven.plugins maven-surefire-plugin @@ -284,7 +267,6 @@ - @@ -292,14 +274,11 @@ 1.4.9 - 20.0 - 1.6.1 3.0.4 - 3.4.1 3.5.11 @@ -309,4 +288,4 @@ 3.7.0 - + \ No newline at end of file diff --git a/spring-web-modules/spring-thymeleaf-2/pom.xml b/spring-web-modules/spring-thymeleaf-2/pom.xml index ddcd1e1005..b2b893ecd5 100644 --- a/spring-web-modules/spring-thymeleaf-2/pom.xml +++ b/spring-web-modules/spring-thymeleaf-2/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-thymeleaf-2 spring-thymeleaf-2 @@ -26,7 +27,6 @@ org.springframework.boot spring-boot-starter-thymeleaf - org.springframework.boot spring-boot-starter-test @@ -40,7 +40,6 @@ org.apache.maven.plugins maven-war-plugin - org.apache.tomcat.maven tomcat7-maven-plugin @@ -71,4 +70,4 @@ 2.2 - + \ No newline at end of file diff --git a/spring-web-modules/spring-thymeleaf-3/pom.xml b/spring-web-modules/spring-thymeleaf-3/pom.xml index 6a46dca117..8f39c17d8c 100644 --- a/spring-web-modules/spring-thymeleaf-3/pom.xml +++ b/spring-web-modules/spring-thymeleaf-3/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-thymeleaf-3 spring-thymeleaf-3 @@ -56,7 +57,6 @@ org.apache.maven.plugins maven-war-plugin - org.apache.tomcat.maven tomcat7-maven-plugin @@ -87,4 +87,4 @@ 2.2 - + \ No newline at end of file diff --git a/spring-web-modules/spring-thymeleaf/pom.xml b/spring-web-modules/spring-thymeleaf/pom.xml index 7b0cd2c510..8201cb5c5b 100644 --- a/spring-web-modules/spring-thymeleaf/pom.xml +++ b/spring-web-modules/spring-thymeleaf/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-thymeleaf 0.1-SNAPSHOT @@ -33,13 +34,11 @@ spring-webmvc ${spring.version} - org.springframework.data spring-data-commons ${spring-data.version} - javax.validation validation-api @@ -50,7 +49,6 @@ hibernate-validator ${hibernate-validator.version} - org.springframework.security @@ -62,7 +60,6 @@ spring-security-config ${spring-security.version} - org.thymeleaf @@ -84,7 +81,6 @@ thymeleaf-extras-java8time ${org.thymeleaf.extras-version} - javax.servlet @@ -92,7 +88,6 @@ ${javax.servlet-api.version} provided - org.springframework @@ -100,14 +95,12 @@ ${spring.version} test - org.springframework.security spring-security-test ${spring-security.version} test - @@ -120,7 +113,6 @@ false - org.codehaus.cargo cargo-maven2-plugin @@ -140,7 +132,6 @@ - @@ -151,9 +142,8 @@ 2.4.1 2.0.1.Final 6.0.11.Final - 1.6.1 - + \ No newline at end of file diff --git a/spring-webflux-amqp/pom.xml b/spring-webflux-amqp/pom.xml index 7a7f6ef600..498556da2d 100755 --- a/spring-webflux-amqp/pom.xml +++ b/spring-webflux-amqp/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.spring spring-webflux-amqp @@ -22,7 +23,7 @@ org.springframework.boot spring-boot-dependencies - + 2.1.3.RELEASE pom import @@ -39,25 +40,21 @@ org.springframework.boot spring-boot-starter-webflux - org.springframework.boot spring-boot-configuration-processor true - org.springframework.boot spring-boot-starter-test test - io.projectreactor reactor-test test - org.springframework.boot spring-boot-starter-integration @@ -73,4 +70,4 @@ - + \ No newline at end of file diff --git a/spring-webflux-threads/pom.xml b/spring-webflux-threads/pom.xml index 15224fcd14..bc5050b660 100644 --- a/spring-webflux-threads/pom.xml +++ b/spring-webflux-threads/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.spring spring-webflux-threads @@ -21,33 +22,16 @@ org.springframework.boot spring-boot-starter-webflux - + - + - + io.reactivex.rxjava2 rxjava @@ -87,4 +71,4 @@ - + \ No newline at end of file diff --git a/spring-websockets/pom.xml b/spring-websockets/pom.xml index d2a32a8eb6..a28ef8749a 100644 --- a/spring-websockets/pom.xml +++ b/spring-websockets/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 spring-websockets spring-websockets @@ -43,4 +44,4 @@ - + \ No newline at end of file diff --git a/static-analysis/pom.xml b/static-analysis/pom.xml index 87e5f55977..577440117c 100644 --- a/static-analysis/pom.xml +++ b/static-analysis/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 static-analysis 1.0-SNAPSHOT diff --git a/stripe/pom.xml b/stripe/pom.xml index 48505c9e4e..cfd281b4a8 100644 --- a/stripe/pom.xml +++ b/stripe/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 com.baeldung.stripe stripe @@ -40,4 +41,4 @@ 4.2.0 - + \ No newline at end of file diff --git a/structurizr/pom.xml b/structurizr/pom.xml index b8efba0937..85e3fc87d1 100644 --- a/structurizr/pom.xml +++ b/structurizr/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 structurizr structurizr diff --git a/struts-2/pom.xml b/struts-2/pom.xml index 3211ad7253..87663cf545 100644 --- a/struts-2/pom.xml +++ b/struts-2/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 struts-2 0.0.1-SNAPSHOT diff --git a/tensorflow-java/pom.xml b/tensorflow-java/pom.xml index 379a901925..2ac4d28a37 100644 --- a/tensorflow-java/pom.xml +++ b/tensorflow-java/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 tensorflow-java 1.0-SNAPSHOT diff --git a/testing-modules/assertion-libraries/pom.xml b/testing-modules/assertion-libraries/pom.xml index c8ab512e4b..19ebebce05 100644 --- a/testing-modules/assertion-libraries/pom.xml +++ b/testing-modules/assertion-libraries/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 assertion-libraries 0.1-SNAPSHOT @@ -72,4 +73,4 @@ 0.12 - + \ No newline at end of file diff --git a/testing-modules/cucumber/pom.xml b/testing-modules/cucumber/pom.xml index af1935aa17..531b16ddec 100644 --- a/testing-modules/cucumber/pom.xml +++ b/testing-modules/cucumber/pom.xml @@ -1,8 +1,11 @@ - + 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 + cucumber + 1.0-SNAPSHOT + cucumber com.baeldung @@ -12,25 +15,6 @@ - 4.0.0 - cucumber - 1.0-SNAPSHOT - cucumber - - - 14 - 14 - 6.10.3 - 5.4.0 - 2.22.2 - 3.141.59 - 4.3.1 - 0.40 - 3.0.0 - 4.5.3 - 2.2.5.RELEASE - - org.springframework.boot @@ -55,7 +39,6 @@ bootstrap ${bootstrap.version} - org.projectlombok lombok @@ -136,4 +119,19 @@ - + + + 14 + 14 + 6.10.3 + 5.4.0 + 2.22.2 + 3.141.59 + 4.3.1 + 0.40 + 3.0.0 + 4.5.3 + 2.2.5.RELEASE + + + \ No newline at end of file diff --git a/testing-modules/easy-random/pom.xml b/testing-modules/easy-random/pom.xml index 1a1f3f743d..1ea6fbc387 100644 --- a/testing-modules/easy-random/pom.xml +++ b/testing-modules/easy-random/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 easy-random easy-random diff --git a/testing-modules/easymock/pom.xml b/testing-modules/easymock/pom.xml index 98458b724d..a8e37da8eb 100644 --- a/testing-modules/easymock/pom.xml +++ b/testing-modules/easymock/pom.xml @@ -1,7 +1,7 @@ - + 4.0.0 easymock easymock @@ -26,4 +26,4 @@ 4.0.2 - + \ No newline at end of file diff --git a/testing-modules/gatling/pom.xml b/testing-modules/gatling/pom.xml index 99eaaac044..281c74d6b3 100644 --- a/testing-modules/gatling/pom.xml +++ b/testing-modules/gatling/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 org.baeldung gatling @@ -115,4 +115,4 @@ 3.0.4 - + \ No newline at end of file diff --git a/testing-modules/groovy-spock/pom.xml b/testing-modules/groovy-spock/pom.xml index fa2c98a884..3c1f00abdf 100644 --- a/testing-modules/groovy-spock/pom.xml +++ b/testing-modules/groovy-spock/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 org.spockframework groovy-spock @@ -53,4 +54,4 @@ 1.5 - + \ No newline at end of file diff --git a/testing-modules/hamcrest/pom.xml b/testing-modules/hamcrest/pom.xml index ec9177d8f2..df8c543edb 100644 --- a/testing-modules/hamcrest/pom.xml +++ b/testing-modules/hamcrest/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 hamcrest @@ -27,4 +28,4 @@ 2.0.0.0 - + \ No newline at end of file diff --git a/testing-modules/junit-4/pom.xml b/testing-modules/junit-4/pom.xml index be0f51ea23..0ae6b71f82 100644 --- a/testing-modules/junit-4/pom.xml +++ b/testing-modules/junit-4/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 junit-4 1.0-SNAPSHOT @@ -28,4 +28,4 @@ 1.1.0 - + \ No newline at end of file diff --git a/testing-modules/junit-5-advanced/pom.xml b/testing-modules/junit-5-advanced/pom.xml index f53af9347f..5fc466bb67 100644 --- a/testing-modules/junit-5-advanced/pom.xml +++ b/testing-modules/junit-5-advanced/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 junit-5-advanced 1.0-SNAPSHOT @@ -40,4 +40,4 @@ 5.4.2 - + \ No newline at end of file diff --git a/testing-modules/junit-5-basics/pom.xml b/testing-modules/junit-5-basics/pom.xml index cdb0c367ce..0358f0c29a 100644 --- a/testing-modules/junit-5-basics/pom.xml +++ b/testing-modules/junit-5-basics/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 junit-5-basics 1.0-SNAPSHOT @@ -154,4 +154,4 @@ 5.0.6.RELEASE - + \ No newline at end of file diff --git a/testing-modules/junit-5/pom.xml b/testing-modules/junit-5/pom.xml index 90898ebb3f..125fa77423 100644 --- a/testing-modules/junit-5/pom.xml +++ b/testing-modules/junit-5/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 junit-5 @@ -88,7 +89,6 @@ ${mockito.junit.jupiter.version} test - org.powermock powermock-api-mockito2 @@ -140,4 +140,4 @@ 3.0.0-M3 - + \ No newline at end of file diff --git a/testing-modules/junit5-annotations/pom.xml b/testing-modules/junit5-annotations/pom.xml index 7ffc17c69b..127a1bf33f 100644 --- a/testing-modules/junit5-annotations/pom.xml +++ b/testing-modules/junit5-annotations/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 junit5-annotations 1.0-SNAPSHOT @@ -61,4 +62,4 @@ 3.11.1 - + \ No newline at end of file diff --git a/testing-modules/junit5-migration/pom.xml b/testing-modules/junit5-migration/pom.xml index bab7bc0406..2e864f6434 100644 --- a/testing-modules/junit5-migration/pom.xml +++ b/testing-modules/junit5-migration/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 junit5-migration 1.0-SNAPSHOT @@ -56,4 +57,4 @@ 2.21.0 - + \ No newline at end of file diff --git a/testing-modules/load-testing-comparison/pom.xml b/testing-modules/load-testing-comparison/pom.xml index 4c237aeb75..63f2d9ce2f 100644 --- a/testing-modules/load-testing-comparison/pom.xml +++ b/testing-modules/load-testing-comparison/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 load-testing-comparison load-testing-comparison @@ -57,57 +57,57 @@ - - - - - - - - - - + + + + + + + + + + org.springframework.boot spring-boot-maven-plugin - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -122,4 +122,4 @@ 5.0 - + \ No newline at end of file diff --git a/testing-modules/mockito-2/pom.xml b/testing-modules/mockito-2/pom.xml index 055debe615..558ac59d08 100644 --- a/testing-modules/mockito-2/pom.xml +++ b/testing-modules/mockito-2/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 mockito-2 0.0.1-SNAPSHOT @@ -32,4 +33,4 @@ 2.21.0 - + \ No newline at end of file diff --git a/testing-modules/mockito-3/pom.xml b/testing-modules/mockito-3/pom.xml index 8d506561ed..5a150ccbf9 100644 --- a/testing-modules/mockito-3/pom.xml +++ b/testing-modules/mockito-3/pom.xml @@ -35,4 +35,4 @@ 3.8.0 - + \ No newline at end of file diff --git a/testing-modules/mockito/pom.xml b/testing-modules/mockito/pom.xml index ea5ef4c322..a159f609a5 100644 --- a/testing-modules/mockito/pom.xml +++ b/testing-modules/mockito/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 mockito 0.1-SNAPSHOT @@ -34,15 +35,12 @@ javax.persistence ${javax.persistence.version} - - org.apache.commons commons-lang3 ${commons-lang3.version} - org.springframework.boot @@ -74,7 +72,6 @@ 2.0.9.RELEASE 19.0 - 2.0.2 2.1.1 diff --git a/testing-modules/mocks/pom.xml b/testing-modules/mocks/pom.xml index abaf313dc5..17700a835e 100644 --- a/testing-modules/mocks/pom.xml +++ b/testing-modules/mocks/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 mocks mocks @@ -36,14 +37,12 @@ ${mockito.version} test - org.easymock easymock ${easymock.version} test - com.google.jimfs jimfs @@ -60,4 +59,4 @@ 1.1 - + \ No newline at end of file diff --git a/testing-modules/mockserver/pom.xml b/testing-modules/mockserver/pom.xml index 6d553f4b90..c039d6a0ab 100644 --- a/testing-modules/mockserver/pom.xml +++ b/testing-modules/mockserver/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 mockserver 1.0.0-SNAPSHOT diff --git a/testing-modules/parallel-tests-junit/math-test-functions/pom.xml b/testing-modules/parallel-tests-junit/math-test-functions/pom.xml index fdd45e19d6..39199834b9 100644 --- a/testing-modules/parallel-tests-junit/math-test-functions/pom.xml +++ b/testing-modules/parallel-tests-junit/math-test-functions/pom.xml @@ -1,7 +1,7 @@ - + 4.0.0 math-test-functions math-test-functions @@ -49,4 +49,4 @@ 2.22.0 - + \ No newline at end of file diff --git a/testing-modules/parallel-tests-junit/pom.xml b/testing-modules/parallel-tests-junit/pom.xml index f9c47c827c..f5a46b91e3 100644 --- a/testing-modules/parallel-tests-junit/pom.xml +++ b/testing-modules/parallel-tests-junit/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 parallel-tests-junit 0.0.1-SNAPSHOT @@ -19,4 +20,4 @@ string-test-functions - + \ No newline at end of file diff --git a/testing-modules/parallel-tests-junit/string-test-functions/pom.xml b/testing-modules/parallel-tests-junit/string-test-functions/pom.xml index 727a1f814a..39847444b5 100644 --- a/testing-modules/parallel-tests-junit/string-test-functions/pom.xml +++ b/testing-modules/parallel-tests-junit/string-test-functions/pom.xml @@ -1,7 +1,7 @@ - + 4.0.0 string-test-functions string-test-functions @@ -41,4 +41,4 @@ 2.22.0 - + \ No newline at end of file diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml index d2afd4ae70..28c743b2b3 100644 --- a/testing-modules/pom.xml +++ b/testing-modules/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 testing-modules testing-modules @@ -29,7 +30,7 @@ junit5-migration load-testing-comparison mockito-2 - mockito-3 + mockito-3 mockito mocks mockserver @@ -49,4 +50,4 @@ zerocode - + \ No newline at end of file diff --git a/testing-modules/powermock/pom.xml b/testing-modules/powermock/pom.xml index 39d5f96d0a..7179f3ffbe 100644 --- a/testing-modules/powermock/pom.xml +++ b/testing-modules/powermock/pom.xml @@ -1,15 +1,15 @@ + 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 + powermock + testing-modules com.baeldung 1.0.0-SNAPSHOT - 4.0.0 - - powermock @@ -30,4 +30,5 @@ 2.21.0 2.0.7 + \ No newline at end of file diff --git a/testing-modules/rest-assured/pom.xml b/testing-modules/rest-assured/pom.xml index eeb5389f49..bd4c1456c1 100644 --- a/testing-modules/rest-assured/pom.xml +++ b/testing-modules/rest-assured/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 rest-assured 1.0 @@ -70,41 +71,34 @@ org.eclipse.jetty jetty-util - org.apache.httpcomponents httpcore - org.apache.commons commons-lang3 - com.github.fge uri-template ${uri-template.version} - com.googlecode.libphonenumber libphonenumber ${libphonenumber.version} - javax.mail mail ${javax.mail.version} - joda-time joda-time ${joda-time.version} - com.fasterxml.jackson.core jackson-annotations @@ -113,36 +107,30 @@ com.fasterxml.jackson.core jackson-databind - com.github.fge msg-simple ${msg-simple.version} - com.github.fge jackson-coreutils ${jackson-coreutils.version} - com.github.fge btf ${btf.version} - org.apache.httpcomponents httpclient - org.codehaus.groovy groovy-all ${groovy.version} - com.github.tomakehurst wiremock @@ -153,8 +141,7 @@ commons-collections ${commons-collections.version} - - + io.rest-assured rest-assured @@ -185,12 +172,9 @@ 2.5 1.4.7 9.4.0.v20161208 - 3.2.2 - 4.4.5 4.5.2 - 0.9 8.0.0 2.9.6 @@ -198,8 +182,7 @@ 1.2 2.4.7 2.4.1 - 2.5.3 - + \ No newline at end of file diff --git a/testing-modules/rest-testing/pom.xml b/testing-modules/rest-testing/pom.xml index b3966c1b6a..42e15f5199 100644 --- a/testing-modules/rest-testing/pom.xml +++ b/testing-modules/rest-testing/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 rest-testing 0.1-SNAPSHOT @@ -14,23 +15,18 @@ - - commons-io commons-io ${commons-io.version} - org.apache.commons commons-lang3 ${commons-lang3.version} - - org.apache.httpcomponents httpclient @@ -47,15 +43,12 @@ httpcore ${httpcore.version} - - com.fasterxml.jackson.core jackson-databind ${jackson.version} - com.github.tomakehurst @@ -63,7 +56,6 @@ ${wiremock.version} test - io.cucumber cucumber-java @@ -75,20 +67,17 @@ cucumber-junit ${cucumber.version} - org.jbehave jbehave-core ${jbehave.version} test - com.intuit.karate karate-apache ${karate.version} - com.intuit.karate karate-junit4 @@ -139,16 +128,13 @@ 19.0 - 2.9.0 6.8.0 2.21.0 0.6.1 - 4.4.5 4.5.2 - 4.1 diff --git a/testing-modules/selenium-junit-testng/pom.xml b/testing-modules/selenium-junit-testng/pom.xml index 8d661997f8..f06d47247c 100644 --- a/testing-modules/selenium-junit-testng/pom.xml +++ b/testing-modules/selenium-junit-testng/pom.xml @@ -67,4 +67,4 @@ 1.5.4 - + \ No newline at end of file diff --git a/testing-modules/spring-testing-2/pom.xml b/testing-modules/spring-testing-2/pom.xml index 40b556732a..419b8d512a 100644 --- a/testing-modules/spring-testing-2/pom.xml +++ b/testing-modules/spring-testing-2/pom.xml @@ -1,9 +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-testing-2 0.1-SNAPSHOT @@ -21,24 +19,20 @@ org.springframework.boot spring-boot-starter-web - org.springframework.boot spring-boot-starter-data-jpa - com.h2database h2 ${h2.version} - org.postgresql postgresql runtime - org.testcontainers @@ -54,11 +48,10 @@ - + - + org.apache.maven.plugins maven-surefire-plugin @@ -74,4 +67,5 @@ 1.12.2 + \ No newline at end of file diff --git a/testing-modules/spring-testing/pom.xml b/testing-modules/spring-testing/pom.xml index 74d55d4c08..bf4c1e7a69 100644 --- a/testing-modules/spring-testing/pom.xml +++ b/testing-modules/spring-testing/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-testing 0.1-SNAPSHOT @@ -20,19 +20,16 @@ java-hamcrest ${java-hamcrest.version} - org.projectlombok lombok ${lombok.version} provided - org.springframework.boot spring-boot-starter - org.springframework.boot diff --git a/testing-modules/test-containers/pom.xml b/testing-modules/test-containers/pom.xml index 2280a89b4a..4a65611c7a 100644 --- a/testing-modules/test-containers/pom.xml +++ b/testing-modules/test-containers/pom.xml @@ -1,8 +1,8 @@ - + 4.0.0 - test-containers 1.0-SNAPSHOT @@ -92,4 +92,4 @@ 1.3.2 - + \ No newline at end of file diff --git a/testing-modules/testing-assertions/pom.xml b/testing-modules/testing-assertions/pom.xml index 8b8536462d..82a507a985 100644 --- a/testing-modules/testing-assertions/pom.xml +++ b/testing-modules/testing-assertions/pom.xml @@ -11,7 +11,7 @@ 0.0.1-SNAPSHOT ../../parent-java - + ch.qos.logback @@ -55,4 +55,5 @@ 4.4 5.6.2 - + + \ No newline at end of file diff --git a/testing-modules/testing-libraries-2/README.md b/testing-modules/testing-libraries-2/README.md index f8361904b8..868d8f307d 100644 --- a/testing-modules/testing-libraries-2/README.md +++ b/testing-modules/testing-libraries-2/README.md @@ -2,3 +2,4 @@ - [Guide to the System Rules Library](https://www.baeldung.com/java-system-rules-junit) - [Guide to the System Stubs Library](https://www.baeldung.com/java-system-stubs) +- [Code Coverage with SonarQube and JaCoCo](https://www.baeldung.com/sonarqube-jacoco-code-coverage) diff --git a/testing-modules/testing-libraries-2/lombok.config b/testing-modules/testing-libraries-2/lombok.config new file mode 100644 index 0000000000..7a21e88040 --- /dev/null +++ b/testing-modules/testing-libraries-2/lombok.config @@ -0,0 +1 @@ +lombok.addLombokGeneratedAnnotation = true diff --git a/testing-modules/testing-libraries-2/pom.xml b/testing-modules/testing-libraries-2/pom.xml index 7f96280cac..d914fcfb86 100644 --- a/testing-modules/testing-libraries-2/pom.xml +++ b/testing-modules/testing-libraries-2/pom.xml @@ -13,6 +13,12 @@ + + org.projectlombok + lombok + ${lombok.version} + provided + org.assertj assertj-core @@ -43,7 +49,6 @@ ${system-stubs.version} test - org.junit.jupiter @@ -72,7 +77,44 @@ - testing-libraries + testing-libraries-2 + + + maven-war-plugin + 2.4 + + false + + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + com/baeldung/**/ExcludedPOJO.class + com/baeldung/**/*DTO.* + **/config/* + + + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + package + + report + + + + + src/test/resources @@ -82,10 +124,12 @@ + 0.8.6 1.19.0 1.0.0 1.1.0 5.6.2 3.16.1 + diff --git a/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/config/AppConfig.java b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/config/AppConfig.java new file mode 100644 index 0000000000..26bfe7b196 --- /dev/null +++ b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/config/AppConfig.java @@ -0,0 +1,11 @@ +package com.baeldung.jacocoexclusions.config; + +import com.baeldung.jacocoexclusions.service.ProductService; + +public class AppConfig { + + public ProductService productService() { + return new ProductService(); + } + +} diff --git a/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/domain/Product.java b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/domain/Product.java new file mode 100644 index 0000000000..5606107371 --- /dev/null +++ b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/domain/Product.java @@ -0,0 +1,12 @@ +package com.baeldung.jacocoexclusions.domain; + +import lombok.Builder; +import lombok.Data; + +@Builder +@Data +public class Product { + private int id; + private String name; + +} diff --git a/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/dto/ExcludedPOJO.java b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/dto/ExcludedPOJO.java new file mode 100644 index 0000000000..27b461f70e --- /dev/null +++ b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/dto/ExcludedPOJO.java @@ -0,0 +1,4 @@ +package com.baeldung.jacocoexclusions.dto; + +public class ExcludedPOJO { +} diff --git a/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/dto/ProductDTO.java b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/dto/ProductDTO.java new file mode 100644 index 0000000000..fb0ec05621 --- /dev/null +++ b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/dto/ProductDTO.java @@ -0,0 +1,4 @@ +package com.baeldung.jacocoexclusions.dto; + +public class ProductDTO { +} diff --git a/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/generated/Customer.java b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/generated/Customer.java new file mode 100644 index 0000000000..cab70467e3 --- /dev/null +++ b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/generated/Customer.java @@ -0,0 +1,11 @@ +package com.baeldung.jacocoexclusions.generated; + +@Generated +public class Customer { + // everything in this class will be excluded from jacoco report because of @Generated + + @Override + public String toString() { + return "Customer{}"; + } +} diff --git a/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/generated/Generated.java b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/generated/Generated.java new file mode 100644 index 0000000000..93be21e32d --- /dev/null +++ b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/generated/Generated.java @@ -0,0 +1,15 @@ +package com.baeldung.jacocoexclusions.generated; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Documented +@Retention(RUNTIME) +@Target({TYPE, METHOD}) +public @interface Generated { +} \ No newline at end of file diff --git a/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/service/CustomerService.java b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/service/CustomerService.java new file mode 100644 index 0000000000..889153ba0a --- /dev/null +++ b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/service/CustomerService.java @@ -0,0 +1,16 @@ +package com.baeldung.jacocoexclusions.service; + +import com.baeldung.jacocoexclusions.generated.Generated; + +public class CustomerService { + + //this method will be excluded from coverage due to @Generated. + @Generated + public String getProductId() { + return "An ID"; + } + + public String getCustomerName() { + return "some name"; + } +} diff --git a/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/service/ProductService.java b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/service/ProductService.java new file mode 100644 index 0000000000..c87295e642 --- /dev/null +++ b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/service/ProductService.java @@ -0,0 +1,9 @@ +package com.baeldung.jacocoexclusions.service; + +public class ProductService { + private static final double DISCOUNT = 0.25; + + public double getSalePrice(double originalPrice) { + return originalPrice - originalPrice * DISCOUNT; + } +} diff --git a/testing-modules/testing-libraries-2/src/main/java/com/baeldung/sonarqubeandjacoco/product/Product.java b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/sonarqubeandjacoco/product/Product.java new file mode 100644 index 0000000000..42f103a317 --- /dev/null +++ b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/sonarqubeandjacoco/product/Product.java @@ -0,0 +1,54 @@ +package com.baeldung.sonarqubeandjacoco.product; + +public class Product { + + private int id; + private String name; + private int units; + private double price; + + public Product() { + super(); + } + + public Product(int id, String name, int units, double price) { + super(); + this.id = id; + this.name = name; + this.units = units; + this.price = price; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getUnits() { + return units; + } + + public void setUnits(int units) { + this.units = units; + } + + public double getPrice() { + return price; + } + + public void setPrice(double price) { + this.price = price; + } + +} \ No newline at end of file diff --git a/testing-modules/testing-libraries-2/src/test/java/com/baeldung/jacocoexclusions/service/CustomerServiceUnitTest.java b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/jacocoexclusions/service/CustomerServiceUnitTest.java new file mode 100644 index 0000000000..b35f92ca20 --- /dev/null +++ b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/jacocoexclusions/service/CustomerServiceUnitTest.java @@ -0,0 +1,14 @@ +package com.baeldung.jacocoexclusions.service; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class CustomerServiceUnitTest { + + @Test + public void givenCustomer_whenGetCustomer_thenReturnNewCustomer() { + CustomerService customerService = new CustomerService(); + assertNotNull(customerService.getCustomerName()); + } +} diff --git a/testing-modules/testing-libraries-2/src/test/java/com/baeldung/jacocoexclusions/service/ProductServiceUnitTest.java b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/jacocoexclusions/service/ProductServiceUnitTest.java new file mode 100644 index 0000000000..609be33640 --- /dev/null +++ b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/jacocoexclusions/service/ProductServiceUnitTest.java @@ -0,0 +1,15 @@ +package com.baeldung.jacocoexclusions.service; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ProductServiceUnitTest { + + @Test + public void givenOriginalPrice_whenGetSalePrice_thenReturnsDiscountedPrice() { + ProductService productService = new ProductService(); + double salePrice = productService.getSalePrice(100); + assertEquals(salePrice, 75); + } +} diff --git a/testing-modules/testing-libraries-2/src/test/java/com/baeldung/sonarqubeandjacoco/product/ProductUnitTest.java b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/sonarqubeandjacoco/product/ProductUnitTest.java new file mode 100644 index 0000000000..da649851e0 --- /dev/null +++ b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/sonarqubeandjacoco/product/ProductUnitTest.java @@ -0,0 +1,26 @@ +package com.baeldung.sonarqubeandjacoco.product; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import org.junit.Test; + +import com.baeldung.sonarqubeandjacoco.product.Product; + +public class ProductUnitTest { + + @Test + public void test() { + Product product = new Product(); + product.setId(1); + assertNull(product.getName()); + assert (product.getId() == 1); + } + + @Test + public void testProduct() { + Product product = new Product(1, "product", 1, 2.0); + assertNotNull(product.getName()); + } + +} diff --git a/testing-modules/testing-libraries/pom.xml b/testing-modules/testing-libraries/pom.xml index 4edd13fa30..4bbe56fc18 100644 --- a/testing-modules/testing-libraries/pom.xml +++ b/testing-modules/testing-libraries/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 testing-libraries testing-libraries @@ -29,7 +30,6 @@ ${cucumber.version} test - io.cucumber cucumber-java8 @@ -63,7 +63,6 @@ true - org.apache.maven.plugins @@ -105,4 +104,4 @@ 2.4.3 - + \ No newline at end of file diff --git a/testing-modules/testng/pom.xml b/testing-modules/testng/pom.xml index c4a1284b0e..8b6a46a694 100644 --- a/testing-modules/testng/pom.xml +++ b/testing-modules/testng/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 testng 0.1.0-SNAPSHOT diff --git a/testing-modules/xmlunit-2/pom.xml b/testing-modules/xmlunit-2/pom.xml index 5689e680e6..07153ab042 100644 --- a/testing-modules/xmlunit-2/pom.xml +++ b/testing-modules/xmlunit-2/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 xmlunit-2 xmlunit-2 @@ -30,4 +31,4 @@ 2.3.0 - + \ No newline at end of file diff --git a/testing-modules/zerocode/pom.xml b/testing-modules/zerocode/pom.xml index 63f0dc9cbb..48030166b5 100644 --- a/testing-modules/zerocode/pom.xml +++ b/testing-modules/zerocode/pom.xml @@ -1,30 +1,29 @@ - + 4.0.0 + zerocode + 1.0-SNAPSHOT + testing-modules com.baeldung 1.0.0-SNAPSHOT - zerocode - 1.0-SNAPSHOT - org.springframework.boot spring-boot-starter-web ${spring.boot.version} - org.springframework.boot spring-boot-starter-test ${spring.boot.version} test - - org.jsmart zerocode-tdd @@ -64,7 +63,6 @@ - org.apache.maven.plugins maven-failsafe-plugin @@ -101,4 +99,4 @@ 1.3.27 - + \ No newline at end of file diff --git a/twilio/pom.xml b/twilio/pom.xml index 76ad5faafb..327242749b 100644 --- a/twilio/pom.xml +++ b/twilio/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 twilio 1.0-SNAPSHOT @@ -24,4 +25,4 @@ 7.20.0 - + \ No newline at end of file diff --git a/twitter4j/pom.xml b/twitter4j/pom.xml index e2579bf73e..3e9bcd550a 100644 --- a/twitter4j/pom.xml +++ b/twitter4j/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 twitter4j twitter4j @@ -24,4 +25,4 @@ 4.0.6 - + \ No newline at end of file diff --git a/vaadin/pom.xml b/vaadin/pom.xml index 4814e70ae3..9025205527 100644 --- a/vaadin/pom.xml +++ b/vaadin/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 org.test vaadin @@ -107,7 +108,8 @@ - + org.eclipse.jetty jetty-maven-plugin @@ -189,4 +191,4 @@ 3.0.0 - + \ No newline at end of file diff --git a/vavr-2/pom.xml b/vavr-2/pom.xml index d20dd9afef..f3640d7c6e 100644 --- a/vavr-2/pom.xml +++ b/vavr-2/pom.xml @@ -1,17 +1,17 @@ + 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 + vavr-2 + vavr-2 + jar + parent-modules com.baeldung 1.0.0-SNAPSHOT - 4.0.0 - - vavr-2 - vavr-2 - jar @@ -24,4 +24,5 @@ 0.9.1 + \ No newline at end of file diff --git a/vavr/pom.xml b/vavr/pom.xml index 16097af848..1604ecc06e 100644 --- a/vavr/pom.xml +++ b/vavr/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 vavr 1.0 diff --git a/vertx-and-rxjava/pom.xml b/vertx-and-rxjava/pom.xml index 20b022a773..fb04ba784c 100644 --- a/vertx-and-rxjava/pom.xml +++ b/vertx-and-rxjava/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 vertx-and-rxjava vertx-and-rxjava diff --git a/vertx/pom.xml b/vertx/pom.xml index 81ede1ba0b..9a22e2dd72 100644 --- a/vertx/pom.xml +++ b/vertx/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 vertx 1.0-SNAPSHOT @@ -46,14 +47,15 @@ - + io.vertx.core.Starter com.baeldung.SimpleServerVerticle - + ${project.build.directory}/${project.artifactId}-${project.version}-app.jar @@ -67,4 +69,4 @@ 3.2.1 - + \ No newline at end of file diff --git a/video-tutorials/jackson-annotations/pom.xml b/video-tutorials/jackson-annotations/pom.xml index f396baf80b..827715fe5f 100644 --- a/video-tutorials/jackson-annotations/pom.xml +++ b/video-tutorials/jackson-annotations/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 jackson-annotations 1.0.0-SNAPSHOT @@ -13,73 +14,60 @@ - commons-io commons-io ${commons-io.version} - com.fasterxml.jackson.dataformat jackson-dataformat-xml ${jackson.version} - org.apache.commons commons-collections4 ${commons-collections4.version} - org.apache.commons commons-lang3 ${commons-lang3.version} - - - com.fasterxml.jackson.core jackson-databind ${jackson.version} - com.fasterxml.jackson.datatype jackson-datatype-jsr310 ${jackson.version} - com.fasterxml.jackson.datatype jackson-datatype-joda ${jackson.version} - com.fasterxml.jackson.module jackson-module-jsonSchema ${jackson.version} - joda-time joda-time ${joda-time.version} - com.google.code.gson gson ${gson.version} - io.rest-assured @@ -93,7 +81,6 @@ - io.rest-assured @@ -101,28 +88,24 @@ ${rest-assured-json-schema-validator.version} test - io.rest-assured json-path ${json-path.version} test - com.github.fge json-schema-validator ${json-schema-validator.version} test - org.assertj assertj-core ${assertj-core.version} test - @@ -140,7 +123,6 @@ 2.9.6 2.8.0 4.1 - 3.0.1 3.0.0 diff --git a/video-tutorials/pom.xml b/video-tutorials/pom.xml index 53ff0c6d89..52c4f2af2a 100644 --- a/video-tutorials/pom.xml +++ b/video-tutorials/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 video-tutorials 1.0.0-SNAPSHOT @@ -18,5 +19,4 @@ jackson-annotations - - + \ No newline at end of file diff --git a/vraptor/pom.xml b/vraptor/pom.xml index 9956305e98..ab78c0d97a 100644 --- a/vraptor/pom.xml +++ b/vraptor/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 vraptor 1.0.0 @@ -20,7 +21,6 @@ vraptor ${vraptor.version} - org.jboss.weld.servlet weld-servlet-core @@ -32,7 +32,6 @@ - org.jboss.weld weld-core-impl @@ -44,69 +43,58 @@ - javax.el el-api ${el.version} provided - org.hibernate hibernate-validator-cdi ${hibernate-validator.version} - javax.servlet jstl ${jstl.version} - javax.servlet javax.servlet-api ${javax.servlet-api.version} provided - org.slf4j slf4j-log4j12 ${slf4j-log4j12.version} - br.com.caelum.vraptor vraptor-freemarker ${vraptor-freemarker.version} - br.com.caelum.vraptor vraptor-hibernate ${vraptor-hibernate.version} - mysql mysql-connector-java ${mysql-connector.version} - org.mindrot jbcrypt ${jbcrypt.version} - org.freemarker freemarker ${freemarker.version} - diff --git a/webrtc/pom.xml b/webrtc/pom.xml index 191ff11dd6..9b238d75f2 100644 --- a/webrtc/pom.xml +++ b/webrtc/pom.xml @@ -1,10 +1,8 @@ - 4.0.0 - webrtc 0.0.1 @@ -31,4 +29,4 @@ - + \ No newline at end of file diff --git a/wicket/pom.xml b/wicket/pom.xml index 68bc2f3e6b..55baf64032 100644 --- a/wicket/pom.xml +++ b/wicket/pom.xml @@ -1,6 +1,5 @@ - 4.0.0 @@ -23,7 +22,6 @@ wicket-core ${wicket.version} - org.eclipse.jetty.aggregate @@ -89,4 +87,4 @@ 2.6 - + \ No newline at end of file diff --git a/wildfly/pom.xml b/wildfly/pom.xml index 6d823bb4c9..c5d9bce37a 100644 --- a/wildfly/pom.xml +++ b/wildfly/pom.xml @@ -1,6 +1,5 @@ - 4.0.0 @@ -76,4 +75,4 @@ - + \ No newline at end of file diff --git a/xml/pom.xml b/xml/pom.xml index d2fa5c0727..b4c78b514d 100644 --- a/xml/pom.xml +++ b/xml/pom.xml @@ -1,6 +1,5 @@ - 4.0.0 @@ -88,31 +87,26 @@ commons-io ${commons-io.version} - org.apache.commons commons-collections4 ${commons-collections4.version} - org.apache.commons commons-lang3 ${commons-lang3.version} - org.jibx jibx-run ${jibx-version} - commons-lang commons-lang ${commons-lang.version} - org.junit.jupiter junit-jupiter @@ -270,7 +264,6 @@ - bindGen @@ -327,7 +320,8 @@ - + maven-assembly-plugin ${project.basedir} @@ -378,10 +372,9 @@ 0.9.6 2.4 - 1.3.1 3.8.0 - + \ No newline at end of file diff --git a/xstream/pom.xml b/xstream/pom.xml index 618df1a7c2..c4104d29c4 100644 --- a/xstream/pom.xml +++ b/xstream/pom.xml @@ -1,6 +1,5 @@ - 4.0.0 @@ -35,4 +34,4 @@ 1.3.8 - + \ No newline at end of file