Merge branch 'eugenp:master' into master
This commit is contained in:
commit
77df952c87
3181
apache-libraries/src/main/resources/models/en-lemmatizer.dict
Normal file
3181
apache-libraries/src/main/resources/models/en-lemmatizer.dict
Normal file
File diff suppressed because it is too large
Load Diff
@ -2,3 +2,4 @@
|
||||
|
||||
- [String API Updates in Java 12](https://www.baeldung.com/java12-string-api)
|
||||
- [New Features in Java 12](https://www.baeldung.com/java-12-new-features)
|
||||
- [Compare the Content of Two Files in Java](https://www.baeldung.com/java-compare-files)
|
||||
|
@ -1,5 +1,8 @@
|
||||
package com.baeldung.java_16_features.groupingby;
|
||||
|
||||
import java.util.IntSummaryStatistics;
|
||||
|
||||
|
||||
public class BlogPost {
|
||||
|
||||
private String title;
|
||||
@ -7,6 +10,8 @@ public class BlogPost {
|
||||
private BlogPostType type;
|
||||
private int likes;
|
||||
record AuthPostTypesLikes(String author, BlogPostType type, int likes) {};
|
||||
record PostcountTitlesLikesStats(long postCount, String titles, IntSummaryStatistics likesStats){};
|
||||
record TitlesBoundedSumOfLikes(String titles, int boundedSumOfLikes) {};
|
||||
|
||||
public BlogPost(String title, String author, BlogPostType type, int likes) {
|
||||
this.title = title;
|
||||
|
@ -5,6 +5,8 @@ import static java.util.stream.Collectors.averagingInt;
|
||||
import static java.util.stream.Collectors.counting;
|
||||
import static java.util.stream.Collectors.groupingBy;
|
||||
import static java.util.stream.Collectors.groupingByConcurrent;
|
||||
import static java.util.stream.Collectors.collectingAndThen;
|
||||
import static java.util.stream.Collectors.toMap;
|
||||
import static java.util.stream.Collectors.joining;
|
||||
import static java.util.stream.Collectors.mapping;
|
||||
import static java.util.stream.Collectors.maxBy;
|
||||
@ -13,6 +15,7 @@ import static java.util.stream.Collectors.summingInt;
|
||||
import static java.util.stream.Collectors.toList;
|
||||
import static java.util.stream.Collectors.toSet;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.offset;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
@ -203,7 +206,7 @@ public class JavaGroupingByCollectorUnitTest {
|
||||
public void givenAListOfPosts_whenGroupedByComplexMapPairKeyType_thenGetAMapBetweenPairAndList() {
|
||||
|
||||
Map<Pair<BlogPostType, String>, List<BlogPost>> postsPerTypeAndAuthor = posts.stream()
|
||||
.collect(groupingBy(post -> new ImmutablePair<>(post.getType(), post.getAuthor())));
|
||||
.collect(groupingBy(post -> new ImmutablePair<>(post.getType(), post.getAuthor())));
|
||||
|
||||
List<BlogPost> result = postsPerTypeAndAuthor.get(new ImmutablePair<>(BlogPostType.GUIDE, "Author 1"));
|
||||
|
||||
@ -237,7 +240,7 @@ public class JavaGroupingByCollectorUnitTest {
|
||||
public void givenAListOfPosts_whenGroupedByRecord_thenGetAMapBetweenRecordAndList() {
|
||||
|
||||
Map<BlogPost.AuthPostTypesLikes, List<BlogPost>> postsPerTypeAndAuthor = posts.stream()
|
||||
.collect(groupingBy(post -> new BlogPost.AuthPostTypesLikes(post.getAuthor(), post.getType(), post.getLikes())));
|
||||
.collect(groupingBy(post -> new BlogPost.AuthPostTypesLikes(post.getAuthor(), post.getType(), post.getLikes())));
|
||||
|
||||
List<BlogPost> result = postsPerTypeAndAuthor.get(new BlogPost.AuthPostTypesLikes("Author 1", BlogPostType.GUIDE, 20));
|
||||
|
||||
@ -251,4 +254,49 @@ public class JavaGroupingByCollectorUnitTest {
|
||||
assertThat(blogPost.getLikes()).isEqualTo(20);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenListOfPosts_whenGroupedByAuthor_thenGetAMapUsingCollectingAndThen() {
|
||||
|
||||
Map<String, BlogPost.PostcountTitlesLikesStats> postsPerAuthor = posts.stream()
|
||||
.collect(groupingBy(BlogPost::getAuthor, collectingAndThen(toList(), list -> {
|
||||
long count = list.stream()
|
||||
.map(BlogPost::getTitle)
|
||||
.collect(counting());
|
||||
String titles = list.stream()
|
||||
.map(BlogPost::getTitle)
|
||||
.collect(joining(" : "));
|
||||
IntSummaryStatistics summary = list.stream()
|
||||
.collect(summarizingInt(BlogPost::getLikes));
|
||||
return new BlogPost.PostcountTitlesLikesStats(count, titles, summary);
|
||||
})));
|
||||
|
||||
BlogPost.PostcountTitlesLikesStats result = postsPerAuthor.get("Author 1");
|
||||
assertThat(result.postCount()).isEqualTo(3L);
|
||||
assertThat(result.titles()).isEqualTo("News item 1 : Programming guide : Tech review 2");
|
||||
assertThat(result.likesStats().getMax()).isEqualTo(20);
|
||||
assertThat(result.likesStats().getMin()).isEqualTo(15);
|
||||
assertThat(result.likesStats().getAverage()).isEqualTo(16.666d, offset(0.001d));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenListOfPosts_whenGroupedByAuthor_thenGetAMapUsingToMap() {
|
||||
|
||||
int maxValLikes = 17;
|
||||
Map<String, BlogPost.TitlesBoundedSumOfLikes> postsPerAuthor = posts.stream()
|
||||
.collect(toMap(BlogPost::getAuthor, post -> {
|
||||
int likes = (post.getLikes() > maxValLikes) ? maxValLikes : post.getLikes();
|
||||
return new BlogPost.TitlesBoundedSumOfLikes(post.getTitle(), likes);
|
||||
}, (u1, u2) -> {
|
||||
int likes = (u2.boundedSumOfLikes() > maxValLikes) ? maxValLikes : u2.boundedSumOfLikes();
|
||||
return new BlogPost.TitlesBoundedSumOfLikes(u1.titles()
|
||||
.toUpperCase() + " : "
|
||||
+ u2.titles()
|
||||
.toUpperCase(),
|
||||
u1.boundedSumOfLikes() + likes);
|
||||
}));
|
||||
|
||||
BlogPost.TitlesBoundedSumOfLikes result = postsPerAuthor.get("Author 1");
|
||||
assertThat(result.titles()).isEqualTo("NEWS ITEM 1 : PROGRAMMING GUIDE : TECH REVIEW 2");
|
||||
assertThat(result.boundedSumOfLikes()).isEqualTo(47);
|
||||
}
|
||||
}
|
||||
|
@ -3,5 +3,6 @@
|
||||
This module contains articles about JavaFX.
|
||||
|
||||
### Relevant Articles:
|
||||
-[Introduction to JavaFX](https://www.baeldung.com/javafx)
|
||||
- [Introduction to JavaFX](https://www.baeldung.com/javafx)
|
||||
- [Display Custom Items in JavaFX ListView](https://www.baeldung.com/javafx-listview-display-custom-items)
|
||||
|
||||
|
@ -17,7 +17,6 @@
|
||||
</prerequisites>
|
||||
|
||||
<properties>
|
||||
<lifecycle.mapping.version>1.0.0</lifecycle.mapping.version>
|
||||
<argLine>-Djava.security.egd=file:/dev/./urandom -Xmx256m</argLine>
|
||||
<assertj.version>3.6.2</assertj.version>
|
||||
<awaitility.version>2.0.0</awaitility.version>
|
||||
@ -31,6 +30,7 @@
|
||||
<jcache.version>1.0.0</jcache.version>
|
||||
<jhipster.server.version>1.1.0</jhipster.server.version>
|
||||
<jjwt.version>0.7.0</jjwt.version>
|
||||
<lifecycle.mapping.version>1.0.0</lifecycle.mapping.version>
|
||||
<liquibase-hibernate5.version>3.6</liquibase-hibernate5.version>
|
||||
<liquibase-slf4j.version>2.0.0</liquibase-slf4j.version>
|
||||
<liquibase.version>3.6.2</liquibase.version>
|
||||
@ -349,7 +349,6 @@
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
@ -365,11 +364,6 @@
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<!-- Spring Cloud -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
@ -580,14 +574,6 @@
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<configuration>
|
||||
<!-- Force alphabetical order to have a reproducible build -->
|
||||
<runOrder>alphabetical</runOrder>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.jacoco</groupId>
|
||||
<artifactId>jacoco-maven-plugin</artifactId>
|
||||
|
@ -21,6 +21,8 @@ eureka:
|
||||
instanceId: carapp:${spring.application.instance_id:${random.value}}
|
||||
|
||||
spring:
|
||||
main:
|
||||
banner-mode: "off"
|
||||
application:
|
||||
name: carapp
|
||||
jackson:
|
||||
@ -37,7 +39,7 @@ spring:
|
||||
database-platform: io.github.jhipster.domain.util.FixedH2Dialect
|
||||
database: H2
|
||||
open-in-view: false
|
||||
show-sql: true
|
||||
show-sql: false
|
||||
hibernate:
|
||||
ddl-auto: none
|
||||
naming:
|
||||
|
@ -3,7 +3,7 @@
|
||||
<configuration scan="true">
|
||||
<include resource="org/springframework/boot/logging/logback/base.xml"/>
|
||||
|
||||
<logger name="com.car.app" level="DEBUG"/>
|
||||
<logger name="com.car.app" level="INFO"/>
|
||||
<logger name="org.hibernate" level="WARN"/>
|
||||
<logger name="org.hibernate.ejb.HibernatePersistence" level="OFF"/>
|
||||
<logger name="org.apache.catalina.startup.DigesterFactory" level="OFF"/>
|
||||
|
@ -29,6 +29,7 @@
|
||||
<jcache.version>1.0.0</jcache.version>
|
||||
<jhipster.server.version>1.1.0</jhipster.server.version>
|
||||
<jjwt.version>0.7.0</jjwt.version>
|
||||
<lifecycle.mapping.version>1.0.0</lifecycle.mapping.version>
|
||||
<liquibase-hibernate5.version>3.6</liquibase-hibernate5.version>
|
||||
<liquibase-slf4j.version>2.0.0</liquibase-slf4j.version>
|
||||
<liquibase.version>3.6.2</liquibase.version>
|
||||
@ -90,7 +91,6 @@
|
||||
<undertow.version>1.4.10.Final</undertow.version>
|
||||
<validation-api.version>1.1.0.Final</validation-api.version>
|
||||
<yarn.version>v0.21.3</yarn.version>
|
||||
<lifecycle.mapping.version>1.0.0</lifecycle.mapping.version>
|
||||
</properties>
|
||||
|
||||
<dependencyManagement>
|
||||
@ -345,6 +345,10 @@
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-security</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-thymeleaf</artifactId>
|
||||
@ -359,11 +363,6 @@
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<!-- Spring Cloud -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
@ -574,14 +573,6 @@
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<configuration>
|
||||
<!-- Force alphabetical order to have a reproducible build -->
|
||||
<runOrder>alphabetical</runOrder>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.jacoco</groupId>
|
||||
<artifactId>jacoco-maven-plugin</artifactId>
|
||||
|
@ -21,6 +21,8 @@ eureka:
|
||||
instanceId: dealerapp:${spring.application.instance_id:${random.value}}
|
||||
|
||||
spring:
|
||||
main:
|
||||
banner-mode: "off"
|
||||
application:
|
||||
name: dealerapp
|
||||
jackson:
|
||||
@ -37,7 +39,7 @@ spring:
|
||||
database-platform: io.github.jhipster.domain.util.FixedH2Dialect
|
||||
database: H2
|
||||
open-in-view: false
|
||||
show-sql: true
|
||||
show-sql: false
|
||||
hibernate:
|
||||
ddl-auto: none
|
||||
naming:
|
||||
|
@ -3,7 +3,7 @@
|
||||
<configuration scan="true">
|
||||
<include resource="org/springframework/boot/logging/logback/base.xml"/>
|
||||
|
||||
<logger name="com.dealer.app" level="DEBUG"/>
|
||||
<logger name="com.dealer.app" level="INFO"/>
|
||||
<logger name="org.hibernate" level="WARN"/>
|
||||
<logger name="org.hibernate.ejb.HibernatePersistence" level="OFF"/>
|
||||
<logger name="org.apache.catalina.startup.DigesterFactory" level="OFF"/>
|
||||
|
@ -32,6 +32,7 @@
|
||||
<jcache.version>1.0.0</jcache.version>
|
||||
<jhipster.server.version>1.1.0</jhipster.server.version>
|
||||
<jjwt.version>0.7.0</jjwt.version>
|
||||
<lifecycle.mapping.version>1.0.0</lifecycle.mapping.version>
|
||||
<liquibase-hibernate5.version>3.6</liquibase-hibernate5.version>
|
||||
<liquibase-slf4j.version>2.0.0</liquibase-slf4j.version>
|
||||
<liquibase.version>3.6.2</liquibase.version>
|
||||
@ -94,7 +95,6 @@
|
||||
<undertow.version>1.4.10.Final</undertow.version>
|
||||
<validation-api.version>1.1.0.Final</validation-api.version>
|
||||
<yarn.version>v0.21.3</yarn.version>
|
||||
<lifecycle.mapping.version>1.0.0</lifecycle.mapping.version>
|
||||
</properties>
|
||||
|
||||
<dependencyManagement>
|
||||
@ -383,6 +383,10 @@
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-thymeleaf</artifactId>
|
||||
@ -397,11 +401,6 @@
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter</artifactId>
|
||||
@ -632,14 +631,6 @@
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<configuration>
|
||||
<!-- Force alphabetical order to have a reproducible build -->
|
||||
<runOrder>alphabetical</runOrder>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.jacoco</groupId>
|
||||
<artifactId>jacoco-maven-plugin</artifactId>
|
||||
|
@ -49,7 +49,7 @@ public class LogsResourceIntegrationTest {
|
||||
public void changeLogs()throws Exception {
|
||||
LoggerVM logger = new LoggerVM();
|
||||
logger.setLevel("INFO");
|
||||
logger.setName("ROOT");
|
||||
logger.setName("some.test.logger");
|
||||
|
||||
restLogsMockMvc.perform(put("/management/logs")
|
||||
.contentType(TestUtil.APPLICATION_JSON_UTF8)
|
||||
|
@ -21,6 +21,8 @@ eureka:
|
||||
instanceId: gateway:${spring.application.instance_id:${random.value}}
|
||||
|
||||
spring:
|
||||
main:
|
||||
banner-mode: "off"
|
||||
application:
|
||||
name: gateway
|
||||
autoconfigure:
|
||||
@ -39,7 +41,7 @@ spring:
|
||||
database-platform: io.github.jhipster.domain.util.FixedH2Dialect
|
||||
database: H2
|
||||
open-in-view: false
|
||||
show-sql: true
|
||||
show-sql: false
|
||||
hibernate:
|
||||
ddl-auto: none
|
||||
naming:
|
||||
|
@ -3,7 +3,7 @@
|
||||
<configuration scan="true">
|
||||
<include resource="org/springframework/boot/logging/logback/base.xml"/>
|
||||
|
||||
<logger name="com.gateway" level="DEBUG"/>
|
||||
<logger name="com.gateway" level="INFO"/>
|
||||
<logger name="org.hibernate" level="WARN"/>
|
||||
<logger name="org.hibernate.ejb.HibernatePersistence" level="OFF"/>
|
||||
<logger name="org.apache.catalina.startup.DigesterFactory" level="OFF"/>
|
||||
|
@ -277,8 +277,7 @@
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-test</artifactId>
|
||||
<scope>test</scope>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
</dependency>
|
||||
<!-- security -->
|
||||
<dependency>
|
||||
|
@ -49,7 +49,7 @@ public class LogsResourceIntegrationTest {
|
||||
public void changeLogs()throws Exception {
|
||||
LoggerVM logger = new LoggerVM();
|
||||
logger.setLevel("INFO");
|
||||
logger.setName("ROOT");
|
||||
logger.setName("some.test.logger");
|
||||
|
||||
restLogsMockMvc.perform(put("/management/logs")
|
||||
.contentType(TestUtil.APPLICATION_JSON_UTF8)
|
||||
|
@ -15,6 +15,8 @@
|
||||
|
||||
|
||||
spring:
|
||||
main:
|
||||
banner-mode: "off"
|
||||
application:
|
||||
name: baeldung
|
||||
jackson:
|
||||
@ -31,7 +33,7 @@ spring:
|
||||
database-platform: io.github.jhipster.domain.util.FixedH2Dialect
|
||||
database: H2
|
||||
open-in-view: false
|
||||
show-sql: true
|
||||
show-sql: false
|
||||
hibernate:
|
||||
ddl-auto: none
|
||||
naming:
|
||||
|
@ -3,7 +3,7 @@
|
||||
<configuration scan="true">
|
||||
<include resource="org/springframework/boot/logging/logback/base.xml"/>
|
||||
|
||||
<logger name="com.baeldung" level="DEBUG"/>
|
||||
<logger name="com.baeldung" level="INFO"/>
|
||||
<logger name="org.hibernate" level="WARN"/>
|
||||
<logger name="org.hibernate.ejb.HibernatePersistence" level="OFF"/>
|
||||
<logger name="org.apache.catalina.startup.DigesterFactory" level="OFF"/>
|
||||
|
@ -1,6 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<artifactId>jhipster-uaa</artifactId>
|
||||
<groupId>com.baeldung.jhipster</groupId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<groupId>com.baeldung.jhipster.gateway</groupId>
|
||||
<artifactId>gateway</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
@ -415,15 +422,6 @@
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>${maven-surefire-plugin.version}</version>
|
||||
<configuration>
|
||||
<!-- Force alphabetical order to have a reproducible build -->
|
||||
<runOrder>alphabetical</runOrder>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.jacoco</groupId>
|
||||
<artifactId>jacoco-maven-plugin</artifactId>
|
||||
|
@ -40,7 +40,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
|
||||
*
|
||||
* @see WebConfigurer
|
||||
*/
|
||||
public class WebConfigurerTest {
|
||||
public class WebConfigurerUnitTest {
|
||||
|
||||
private WebConfigurer webConfigurer;
|
||||
|
@ -18,7 +18,7 @@ import static springfox.documentation.swagger2.web.Swagger2Controller.DEFAULT_UR
|
||||
/**
|
||||
* Tests SwaggerBasePathRewritingFilter class.
|
||||
*/
|
||||
public class SwaggerBasePathRewritingFilterTest {
|
||||
public class SwaggerBasePathRewritingFilterUnitTest {
|
||||
|
||||
private SwaggerBasePathRewritingFilter filter = new SwaggerBasePathRewritingFilter();
|
||||
|
@ -16,7 +16,7 @@ import java.util.List;
|
||||
*
|
||||
* @see CookieCollection
|
||||
*/
|
||||
public class CookieCollectionTest {
|
||||
public class CookieCollectionUnitTest {
|
||||
public static final String COOKIE_NAME = "chocolate";
|
||||
public static final String COOKIE_VALUE = "yummy";
|
||||
public static final String BROWNIE_NAME = "brownie";
|
@ -12,7 +12,7 @@ import org.springframework.security.oauth2.common.OAuth2AccessToken;
|
||||
* Test whether the CookieTokenExtractor can properly extract access tokens from
|
||||
* Cookies and Headers.
|
||||
*/
|
||||
public class CookieTokenExtractorTest {
|
||||
public class CookieTokenExtractorUnitTest {
|
||||
private CookieTokenExtractor cookieTokenExtractor;
|
||||
|
||||
@Before
|
||||
@ -22,24 +22,24 @@ public class CookieTokenExtractorTest {
|
||||
|
||||
@Test
|
||||
public void testExtractTokenCookie() {
|
||||
MockHttpServletRequest request = OAuth2AuthenticationServiceTest.createMockHttpServletRequest();
|
||||
MockHttpServletRequest request = OAuth2AuthenticationServiceUnitTest.createMockHttpServletRequest();
|
||||
Authentication authentication = cookieTokenExtractor.extract(request);
|
||||
Assert.assertEquals(OAuth2AuthenticationServiceTest.ACCESS_TOKEN_VALUE, authentication.getPrincipal().toString());
|
||||
Assert.assertEquals(OAuth2AuthenticationServiceUnitTest.ACCESS_TOKEN_VALUE, authentication.getPrincipal().toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testExtractTokenHeader() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest(HttpMethod.GET.name(), "http://www.test.com");
|
||||
request.addHeader("Authorization", OAuth2AccessToken.BEARER_TYPE + " " + OAuth2AuthenticationServiceTest.ACCESS_TOKEN_VALUE);
|
||||
request.addHeader("Authorization", OAuth2AccessToken.BEARER_TYPE + " " + OAuth2AuthenticationServiceUnitTest.ACCESS_TOKEN_VALUE);
|
||||
Authentication authentication = cookieTokenExtractor.extract(request);
|
||||
Assert.assertEquals(OAuth2AuthenticationServiceTest.ACCESS_TOKEN_VALUE, authentication.getPrincipal().toString());
|
||||
Assert.assertEquals(OAuth2AuthenticationServiceUnitTest.ACCESS_TOKEN_VALUE, authentication.getPrincipal().toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testExtractTokenParam() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest(HttpMethod.GET.name(), "http://www.test.com");
|
||||
request.addParameter(OAuth2AccessToken.ACCESS_TOKEN, OAuth2AuthenticationServiceTest.ACCESS_TOKEN_VALUE);
|
||||
request.addParameter(OAuth2AccessToken.ACCESS_TOKEN, OAuth2AuthenticationServiceUnitTest.ACCESS_TOKEN_VALUE);
|
||||
Authentication authentication = cookieTokenExtractor.extract(request);
|
||||
Assert.assertEquals(OAuth2AuthenticationServiceTest.ACCESS_TOKEN_VALUE, authentication.getPrincipal().toString());
|
||||
Assert.assertEquals(OAuth2AuthenticationServiceUnitTest.ACCESS_TOKEN_VALUE, authentication.getPrincipal().toString());
|
||||
}
|
||||
}
|
@ -39,7 +39,7 @@ import static org.mockito.Mockito.when;
|
||||
* @see OAuth2AuthenticationService
|
||||
*/
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
public class OAuth2AuthenticationServiceTest {
|
||||
public class OAuth2AuthenticationServiceUnitTest {
|
||||
public static final String CLIENT_AUTHORIZATION = "Basic d2ViX2FwcDpjaGFuZ2VpdA==";
|
||||
public static final String ACCESS_TOKEN_VALUE = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQyNzI4NDQsInVzZXJfbmFtZSI6InVzZXIiLCJhdXRob3JpdGllcyI6WyJST0xFX1VTRVIiXSwianRpIjoiNzc1ZTJkYWUtYWYzZi00YTdhLWExOTktNzNiZTU1MmIxZDVkIiwiY2xpZW50X2lkIjoid2ViX2FwcCIsInNjb3BlIjpbIm9wZW5pZCJdfQ.gEK0YcX2IpkpxnkxXXHQ4I0xzTjcy7edqb89ukYE0LPe7xUcZVwkkCJF_nBxsGJh2jtA6NzNLfY5zuL6nP7uoAq3fmvsyrcyR2qPk8JuuNzGtSkICx3kPDRjAT4ST8SZdeh7XCbPVbySJ7ZmPlRWHyedzLA1wXN0NUf8yZYS4ELdUwVBYIXSjkNoKqfWm88cwuNr0g0teypjPtjDqCnXFt1pibwdfIXn479Y1neNAdvSpHcI4Ost-c7APCNxW2gqX-0BItZQearxRgKDdBQ7CGPAIky7dA0gPuKUpp_VCoqowKCXqkE9yKtRQGIISewtj2UkDRZePmzmYrUBXRzfYw";
|
||||
public static final String REFRESH_TOKEN_VALUE = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJ1c2VyIiwic2NvcGUiOlsib3BlbmlkIl0sImF0aSI6Ijc3NWUyZGFlLWFmM2YtNGE3YS1hMTk5LTczYmU1NTJiMWQ1ZCIsImV4cCI6MTQ5Njg2NDc0MywiYXV0aG9yaXRpZXMiOlsiUk9MRV9VU0VSIl0sImp0aSI6IjhmYjI2YTllLTdjYzQtNDFlMi1hNzBjLTk4MDc0N2U2YWFiOSIsImNsaWVudF9pZCI6IndlYl9hcHAifQ.q1-Df9_AFO6TJNiLKV2YwTjRbnd7qcXv52skXYnog5siHYRoR6cPtm6TNQ04iDAoIHljTSTNnD6DS3bHk41mV55gsSVxGReL8VCb_R8ZmhVL4-5yr90sfms0wFp6lgD2bPmZ-TXiS2Oe9wcbNWagy5RsEplZ-sbXu3tjmDao4FN35ojPsXmUs84XnNQH3Y_-PY9GjZG0JEfLQIvE0J5BkXS18Z015GKyA6GBIoLhAGBQQYyG9m10ld_a9fD5SmCyCF72Jad_pfP1u8Z_WyvO-wrlBvm2x-zBthreVrXU5mOb9795wJEP-xaw3dXYGjht_grcW4vKUFtj61JgZk98CQ";
|
@ -12,7 +12,7 @@ import org.springframework.test.util.ReflectionTestUtils;
|
||||
*
|
||||
* @see OAuth2CookieHelper
|
||||
*/
|
||||
public class OAuth2CookieHelperTest {
|
||||
public class OAuth2CookieHelperUnitTest {
|
||||
public static final String GET_COOKIE_DOMAIN_METHOD = "getCookieDomain";
|
||||
private OAuth2Properties oAuth2Properties;
|
||||
private OAuth2CookieHelper cookieHelper;
|
@ -51,7 +51,7 @@ public class LogsResourceIntTest {
|
||||
public void changeLogs() throws Exception {
|
||||
LoggerVM logger = new LoggerVM();
|
||||
logger.setLevel("INFO");
|
||||
logger.setName("ROOT");
|
||||
logger.setName("some.test.logger");
|
||||
|
||||
restLogsMockMvc.perform(put("/management/logs")
|
||||
.contentType(TestUtil.APPLICATION_JSON_UTF8)
|
||||
|
@ -21,6 +21,8 @@ eureka:
|
||||
instanceId: gateway:${spring.application.instance-id:${random.value}}
|
||||
|
||||
spring:
|
||||
main:
|
||||
banner-mode: "off"
|
||||
application:
|
||||
name: gateway
|
||||
cache:
|
||||
|
@ -1,6 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<artifactId>jhipster-uaa</artifactId>
|
||||
<groupId>com.baeldung.jhipster</groupId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<groupId>com.baeldung.jhipster.quotes</groupId>
|
||||
<artifactId>quotes</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
@ -399,15 +406,6 @@
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>${maven-surefire-plugin.version}</version>
|
||||
<configuration>
|
||||
<!-- Force alphabetical order to have a reproducible build -->
|
||||
<runOrder>alphabetical</runOrder>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.jacoco</groupId>
|
||||
<artifactId>jacoco-maven-plugin</artifactId>
|
||||
|
@ -38,7 +38,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
|
||||
*
|
||||
* @see WebConfigurer
|
||||
*/
|
||||
public class WebConfigurerTest {
|
||||
public class WebConfigurerUnitTest {
|
||||
|
||||
private WebConfigurer webConfigurer;
|
||||
|
@ -51,7 +51,7 @@ public class LogsResourceIntTest {
|
||||
public void changeLogs() throws Exception {
|
||||
LoggerVM logger = new LoggerVM();
|
||||
logger.setLevel("INFO");
|
||||
logger.setName("ROOT");
|
||||
logger.setName("some.test.logger");
|
||||
|
||||
restLogsMockMvc.perform(put("/management/logs")
|
||||
.contentType(TestUtil.APPLICATION_JSON_UTF8)
|
||||
|
@ -21,6 +21,8 @@ eureka:
|
||||
instanceId: quotes:${spring.application.instance-id:${random.value}}
|
||||
|
||||
spring:
|
||||
main:
|
||||
banner-mode: "off"
|
||||
application:
|
||||
name: quotes
|
||||
cache:
|
||||
|
@ -1,6 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<artifactId>jhipster-uaa</artifactId>
|
||||
<groupId>com.baeldung.jhipster</groupId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<groupId>com.baeldung.jhipster.uaa</groupId>
|
||||
<artifactId>uaa</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
@ -399,15 +405,6 @@
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>${maven-surefire-plugin.version}</version>
|
||||
<configuration>
|
||||
<!-- Force alphabetical order to have a reproducible build -->
|
||||
<runOrder>alphabetical</runOrder>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.jacoco</groupId>
|
||||
<artifactId>jacoco-maven-plugin</artifactId>
|
||||
|
@ -38,7 +38,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
|
||||
*
|
||||
* @see WebConfigurer
|
||||
*/
|
||||
public class WebConfigurerTest {
|
||||
public class WebConfigurerUnitTest {
|
||||
|
||||
private WebConfigurer webConfigurer;
|
||||
|
@ -51,7 +51,7 @@ public class LogsResourceIntTest {
|
||||
public void changeLogs() throws Exception {
|
||||
LoggerVM logger = new LoggerVM();
|
||||
logger.setLevel("INFO");
|
||||
logger.setName("ROOT");
|
||||
logger.setName("some.test.logger");
|
||||
|
||||
restLogsMockMvc.perform(put("/management/logs")
|
||||
.contentType(TestUtil.APPLICATION_JSON_UTF8)
|
||||
|
@ -21,6 +21,8 @@ eureka:
|
||||
instanceId: uaa:${spring.application.instance-id:${random.value}}
|
||||
|
||||
spring:
|
||||
main:
|
||||
banner-mode: "off"
|
||||
application:
|
||||
name: uaa
|
||||
cache:
|
||||
|
@ -17,11 +17,39 @@
|
||||
<relativePath>../parent-boot-1</relativePath>
|
||||
</parent>
|
||||
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<version>${spring-boot.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>com.vaadin.external.google</groupId>
|
||||
<artifactId>android-json</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>org.json</groupId>
|
||||
<artifactId>json</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.hibernate</groupId>
|
||||
<artifactId>hibernate-java8</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>net.bytebuddy</groupId>
|
||||
<artifactId>byte-buddy</artifactId>
|
||||
<version>${byte-buddy.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<modules>
|
||||
|
3
ksqldb/README.md
Normal file
3
ksqldb/README.md
Normal file
@ -0,0 +1,3 @@
|
||||
### Relevant Articles:
|
||||
|
||||
- [Introduction to ksqlDB](https://www.baeldung.com/ksqldb)
|
@ -40,6 +40,11 @@
|
||||
<artifactId>javatuples</artifactId>
|
||||
<version>${javatuples.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.javassist</groupId>
|
||||
<artifactId>javassist</artifactId>
|
||||
<version>${javaassist.version}</version>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/org.assertj/assertj-core -->
|
||||
<dependency>
|
||||
<groupId>org.assertj</groupId>
|
||||
@ -51,42 +56,6 @@
|
||||
<artifactId>javers-core</artifactId>
|
||||
<version>${javers.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.serenity-bdd</groupId>
|
||||
<artifactId>serenity-core</artifactId>
|
||||
<version>${serenity.version}</version>
|
||||
<scope>test</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.asciidoctor</groupId>
|
||||
<artifactId>asciidoctorj</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.serenity-bdd</groupId>
|
||||
<artifactId>serenity-junit</artifactId>
|
||||
<version>${serenity.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.serenity-bdd</groupId>
|
||||
<artifactId>serenity-jbehave</artifactId>
|
||||
<version>${serenity.jbehave.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.serenity-bdd</groupId>
|
||||
<artifactId>serenity-rest-assured</artifactId>
|
||||
<version>${serenity.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.serenity-bdd</groupId>
|
||||
<artifactId>serenity-jira-requirements-provider</artifactId>
|
||||
<version>${serenity.jira.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<!-- JDO -->
|
||||
<dependency>
|
||||
<groupId>org.datanucleus</groupId>
|
||||
@ -139,30 +108,6 @@
|
||||
<artifactId>spring-web</artifactId>
|
||||
<version>${spring.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.serenity-bdd</groupId>
|
||||
<artifactId>serenity-spring</artifactId>
|
||||
<version>${serenity.version}</version>
|
||||
<scope>test</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-test</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.serenity-bdd</groupId>
|
||||
<artifactId>serenity-screenplay</artifactId>
|
||||
<version>${serenity.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.serenity-bdd</groupId>
|
||||
<artifactId>serenity-screenplay-webdriver</artifactId>
|
||||
<version>${serenity.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<!-- JetS3t -->
|
||||
<dependency>
|
||||
<groupId>org.lucee</groupId>
|
||||
@ -253,29 +198,6 @@
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>maven-failsafe-plugin</artifactId>
|
||||
<version>${maven-failsafe-plugin.version}</version>
|
||||
<configuration>
|
||||
<systemProperties>
|
||||
<webdriver.chrome.driver>chromedriver</webdriver.chrome.driver>
|
||||
</systemProperties>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>net.serenity-bdd.maven.plugins</groupId>
|
||||
<artifactId>serenity-maven-plugin</artifactId>
|
||||
<version>${serenity.plugin.version}</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>serenity-reports</id>
|
||||
<phase>post-integration-test</phase>
|
||||
<goals>
|
||||
<goal>aggregate</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<!-- JDO Plugin -->
|
||||
<plugin>
|
||||
<groupId>org.datanucleus</groupId>
|
||||
@ -380,6 +302,7 @@
|
||||
<spring.version>4.3.8.RELEASE</spring.version>
|
||||
<spring-mock-mvc.version>3.0.3</spring-mock-mvc.version>
|
||||
<quartz.version>2.3.0</quartz.version>
|
||||
<javaassist.version>3.21.0-GA</javaassist.version>
|
||||
<jool.version>0.9.12</jool.version>
|
||||
<maven-jar-plugin.version>3.0.2</maven-jar-plugin.version>
|
||||
<commons-net.version>3.6</commons-net.version>
|
||||
|
@ -1,4 +0,0 @@
|
||||
jira.url=<jira-url>
|
||||
jira.project=<jira-project>
|
||||
jira.username=<jira-username>
|
||||
jira.password=<jira-password>
|
@ -18,7 +18,7 @@
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.13</version>
|
||||
<version>${junit.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
@ -46,6 +46,7 @@
|
||||
<properties>
|
||||
<name>${project.name}</name>
|
||||
<my.awesome.property>property-from-pom</my.awesome.property>
|
||||
<junit.version>4.13</junit.version>
|
||||
</properties>
|
||||
|
||||
</project>
|
3
maven-modules/maven-surefire-plugin/README.md
Normal file
3
maven-modules/maven-surefire-plugin/README.md
Normal file
@ -0,0 +1,3 @@
|
||||
## Relevant Articles:
|
||||
|
||||
- [Running a Single Test or Method With Maven](https://www.baeldung.com/maven-run-single-test)
|
@ -30,7 +30,7 @@
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
<spring.version>5.3.7</spring.version>
|
||||
<spring.version>5.3.9</spring.version>
|
||||
<spring-security.version>5.2.3.RELEASE</spring-security.version>
|
||||
<spring-boot-starter-test.version>1.5.10.RELEASE</spring-boot-starter-test.version>
|
||||
</properties>
|
||||
|
@ -15,6 +15,21 @@
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
<version>${spring-boot.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<version>${spring-boot.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.rest-assured</groupId>
|
||||
<artifactId>rest-assured</artifactId>
|
||||
<version>${rest-assured.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.assertj</groupId>
|
||||
<artifactId>assertj-core</artifactId>
|
||||
@ -38,6 +53,9 @@
|
||||
<assertj-core.version>3.9.1</assertj-core.version>
|
||||
<hibernate-core.version>5.2.16.Final</hibernate-core.version>
|
||||
<mysql-connector.version>6.0.6</mysql-connector.version>
|
||||
<spring-boot.version>2.5.3</spring-boot.version>
|
||||
<rest-assured.version>3.3.0</rest-assured.version>
|
||||
|
||||
</properties>
|
||||
|
||||
</project>
|
@ -0,0 +1,12 @@
|
||||
package com.baeldung.dtopattern;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(Main.class, args);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,28 @@
|
||||
package com.baeldung.dtopattern.api;
|
||||
|
||||
import com.baeldung.dtopattern.domain.Role;
|
||||
import com.baeldung.dtopattern.domain.User;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static java.util.stream.Collectors.toList;
|
||||
|
||||
@Component
|
||||
class Mapper {
|
||||
public UserDTO toDto(User user) {
|
||||
String name = user.getName();
|
||||
List<String> roles = user
|
||||
.getRoles()
|
||||
.stream()
|
||||
.map(Role::getName)
|
||||
.collect(toList());
|
||||
|
||||
return new UserDTO(name, roles);
|
||||
}
|
||||
|
||||
public User toUser(UserCreationDTO userDTO) {
|
||||
return new User(userDTO.getName(), userDTO.getPassword(), new ArrayList<>());
|
||||
}
|
||||
}
|
@ -0,0 +1,51 @@
|
||||
package com.baeldung.dtopattern.api;
|
||||
|
||||
import com.baeldung.dtopattern.domain.RoleService;
|
||||
import com.baeldung.dtopattern.domain.User;
|
||||
import com.baeldung.dtopattern.domain.UserService;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static java.util.stream.Collectors.toList;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/users")
|
||||
class UserController {
|
||||
|
||||
private UserService userService;
|
||||
private RoleService roleService;
|
||||
private Mapper mapper;
|
||||
|
||||
public UserController(UserService userService, RoleService roleService, Mapper mapper) {
|
||||
this.userService = userService;
|
||||
this.roleService = roleService;
|
||||
this.mapper = mapper;
|
||||
}
|
||||
|
||||
@GetMapping
|
||||
@ResponseBody
|
||||
public List<UserDTO> getUsers() {
|
||||
return userService.getAll()
|
||||
.stream()
|
||||
.map(mapper::toDto)
|
||||
.collect(toList());
|
||||
}
|
||||
|
||||
|
||||
@PostMapping
|
||||
@ResponseBody
|
||||
public UserIdDTO create(@RequestBody UserCreationDTO userDTO) {
|
||||
User user = mapper.toUser(userDTO);
|
||||
|
||||
userDTO.getRoles()
|
||||
.stream()
|
||||
.map(role -> roleService.getOrCreate(role))
|
||||
.forEach(user::addRole);
|
||||
|
||||
userService.save(user);
|
||||
|
||||
return new UserIdDTO(user.getId());
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
package com.baeldung.dtopattern.api;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class UserCreationDTO {
|
||||
|
||||
private String name;
|
||||
private String password;
|
||||
private List<String> roles;
|
||||
|
||||
UserCreationDTO() {}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
|
||||
public List<String> getRoles() {
|
||||
return roles;
|
||||
}
|
||||
|
||||
void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
void setPassword(String password) {
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
void setRoles(List<String> roles) {
|
||||
this.roles = roles;
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package com.baeldung.dtopattern.api;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class UserDTO {
|
||||
private String name;
|
||||
private List<String> roles;
|
||||
|
||||
public UserDTO(String name, List<String> roles) {
|
||||
this.name = name;
|
||||
this.roles = roles;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public List<String> getRoles() {
|
||||
return roles;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package com.baeldung.dtopattern.api;
|
||||
|
||||
public class UserIdDTO {
|
||||
|
||||
private String id;
|
||||
|
||||
public UserIdDTO(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
package com.baeldung.dtopattern.domain;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@Service
|
||||
class InMemoryRepository implements UserRepository, RoleRepository {
|
||||
|
||||
private Map<String, User> users = new LinkedHashMap<>();
|
||||
private Map<String, Role> roles = new LinkedHashMap<>();
|
||||
|
||||
@Override
|
||||
public List<User> getAll() {
|
||||
return new ArrayList<>(users.values());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save(User user) {
|
||||
user.setId(UUID.randomUUID().toString());
|
||||
users.put(user.getId(), user);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save(Role role) {
|
||||
role.setId(UUID.randomUUID().toString());
|
||||
roles.put(role.getId(), role);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Role getRoleById(String id) {
|
||||
return roles.get(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Role getRoleByName(String name) {
|
||||
return roles.values()
|
||||
.stream()
|
||||
.filter(role -> role.getName().equalsIgnoreCase(name))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteAll() {
|
||||
users.clear();
|
||||
roles.clear();
|
||||
}
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package com.baeldung.dtopattern.domain;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class Role {
|
||||
private String id;
|
||||
private String name;
|
||||
|
||||
public Role(String name) {
|
||||
this.name = Objects.requireNonNull(name);
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
void setId(String id) {
|
||||
this.id = Objects.requireNonNull(id);
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = Objects.requireNonNull(name);
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package com.baeldung.dtopattern.domain;
|
||||
|
||||
public interface RoleRepository {
|
||||
Role getRoleById(String id);
|
||||
Role getRoleByName(String name);
|
||||
void save(Role role);
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package com.baeldung.dtopattern.domain;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
@Service
|
||||
public class RoleService {
|
||||
|
||||
private RoleRepository repository;
|
||||
|
||||
public RoleService(RoleRepository repository) {
|
||||
this.repository = repository;
|
||||
}
|
||||
|
||||
public Role getOrCreate(String name) {
|
||||
Role role = repository.getRoleByName(name);
|
||||
|
||||
if (role == null) {
|
||||
role = new Role(name);
|
||||
repository.save(role);
|
||||
}
|
||||
|
||||
return role;
|
||||
}
|
||||
|
||||
public void save(Role role) {
|
||||
Objects.requireNonNull(role);
|
||||
repository.save(role);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,80 @@
|
||||
package com.baeldung.dtopattern.domain;
|
||||
|
||||
import javax.crypto.*;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
public class User {
|
||||
|
||||
private static SecretKeySpec KEY = initKey();
|
||||
|
||||
static SecretKeySpec initKey(){
|
||||
try {
|
||||
SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey();
|
||||
return new SecretKeySpec(secretKey.getEncoded(), "AES");
|
||||
} catch (NoSuchAlgorithmException ex) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private String id;
|
||||
private String name;
|
||||
private String password;
|
||||
private List<Role> roles;
|
||||
|
||||
public User(String name, String password, List<Role> roles) {
|
||||
this.name = Objects.requireNonNull(name);
|
||||
this.password = this.encrypt(password);
|
||||
this.roles = Objects.requireNonNull(roles);
|
||||
}
|
||||
|
||||
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 void addRole(Role role) {
|
||||
roles.add(role);
|
||||
}
|
||||
|
||||
public List<Role> getRoles() {
|
||||
return Collections.unmodifiableList(roles);
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
String encrypt(String password) {
|
||||
Objects.requireNonNull(password);
|
||||
try {
|
||||
Cipher cipher = Cipher.getInstance("AES");
|
||||
cipher.init(Cipher.ENCRYPT_MODE, KEY);
|
||||
final byte[] encryptedBytes = cipher.doFinal(password.getBytes(StandardCharsets.UTF_8));
|
||||
return new String(encryptedBytes, StandardCharsets.UTF_8);
|
||||
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {
|
||||
// do nothing
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
package com.baeldung.dtopattern.domain;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface UserRepository {
|
||||
List<User> getAll();
|
||||
void save(User user);
|
||||
void deleteAll();
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package com.baeldung.dtopattern.domain;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
@Service
|
||||
public class UserService {
|
||||
|
||||
private UserRepository repository;
|
||||
|
||||
public UserService(UserRepository repository) {
|
||||
this.repository = repository;
|
||||
}
|
||||
|
||||
public List<User> getAll() {
|
||||
return repository.getAll();
|
||||
}
|
||||
|
||||
public void save(User user) {
|
||||
Objects.requireNonNull(user);
|
||||
repository.save(user);
|
||||
}
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
package com.baeldung.dtopattern.api;
|
||||
|
||||
import com.baeldung.dtopattern.domain.Role;
|
||||
import com.baeldung.dtopattern.domain.User;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
class MapperUnitTest {
|
||||
|
||||
@Test
|
||||
void toDto_shouldMapFromDomainToDTO() {
|
||||
String name = "Test";
|
||||
String password = "test";
|
||||
Role admin = new Role("admin");
|
||||
List<String> expectedRoles = Collections.singletonList("admin");
|
||||
|
||||
List<Role> roles = new ArrayList<>();
|
||||
roles.add(admin);
|
||||
|
||||
User user = new User(name, password, roles);
|
||||
Mapper mapper = new Mapper();
|
||||
|
||||
UserDTO dto = mapper.toDto(user);
|
||||
|
||||
assertEquals(name, dto.getName());
|
||||
assertEquals(expectedRoles, dto.getRoles());
|
||||
}
|
||||
|
||||
@Test
|
||||
void toUser_shouldMapFromDTOToDomain() {
|
||||
String name = "Test";
|
||||
String password = "test";
|
||||
String role = "admin";
|
||||
|
||||
UserCreationDTO dto = new UserCreationDTO();
|
||||
dto.setName(name);
|
||||
dto.setPassword(password);
|
||||
dto.setRoles(Collections.singletonList("admin"));
|
||||
|
||||
User expectedUser = new User(name, password, new ArrayList<>());
|
||||
|
||||
Mapper mapper = new Mapper();
|
||||
|
||||
User user = mapper.toUser(dto);
|
||||
|
||||
assertEquals(name, user.getName());
|
||||
assertEquals(expectedUser.getPassword(), user.getPassword());
|
||||
assertEquals(Collections.emptyList(), user.getRoles());
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,80 @@
|
||||
package com.baeldung.dtopattern.api;
|
||||
|
||||
import com.baeldung.dtopattern.domain.Role;
|
||||
import com.baeldung.dtopattern.domain.RoleRepository;
|
||||
import com.baeldung.dtopattern.domain.User;
|
||||
import com.baeldung.dtopattern.domain.UserRepository;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import io.restassured.http.ContentType;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.boot.test.web.client.TestRestTemplate;
|
||||
import org.springframework.boot.web.server.LocalServerPort;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
import static io.restassured.RestAssured.given;
|
||||
import static org.hamcrest.CoreMatchers.*;
|
||||
import static org.springframework.http.HttpStatus.OK;
|
||||
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
||||
class UserControllerIntegrationTest {
|
||||
|
||||
@Autowired
|
||||
private TestRestTemplate restTemplate;
|
||||
|
||||
@Autowired
|
||||
private UserRepository userRepository;
|
||||
|
||||
@Autowired
|
||||
private RoleRepository roleRepository;
|
||||
|
||||
@LocalServerPort
|
||||
int port;
|
||||
|
||||
@Autowired
|
||||
private ObjectMapper objectMapper;
|
||||
|
||||
@Test
|
||||
void create_shouldReturnUseId() throws Exception {
|
||||
UserCreationDTO request = new UserCreationDTO();
|
||||
request.setName("User 1");
|
||||
request.setPassword("Test@123456");
|
||||
request.setRoles(Collections.singletonList("admin"));
|
||||
|
||||
given()
|
||||
.contentType(ContentType.JSON)
|
||||
.body(objectMapper.writeValueAsString(request))
|
||||
.when()
|
||||
.port(port)
|
||||
.post("/users")
|
||||
.then()
|
||||
.statusCode(OK.value())
|
||||
.body("id", notNullValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
void getAll_shouldReturnUseDTO() {
|
||||
|
||||
userRepository.deleteAll();
|
||||
|
||||
String roleName = "admin";
|
||||
Role admin = new Role(roleName);
|
||||
roleRepository.save(admin);
|
||||
|
||||
String name = "User 1";
|
||||
User user = new User(name, "Test@123456", Collections.singletonList(admin));
|
||||
userRepository.save(user);
|
||||
|
||||
given()
|
||||
.port(port)
|
||||
.when()
|
||||
.get("/users")
|
||||
.then()
|
||||
.statusCode(OK.value())
|
||||
.body("size()", is(1))
|
||||
.body("[0].name", equalTo(name))
|
||||
.body("[0].roles", hasItem(roleName));
|
||||
}
|
||||
}
|
@ -0,0 +1,83 @@
|
||||
package com.baeldung.dtopattern.domain;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
|
||||
class InMemoryRepositoryUnitTest {
|
||||
|
||||
@Test
|
||||
void getAll_shouldReturnAllUsers() {
|
||||
|
||||
String name = "Test";
|
||||
String password = "test123";
|
||||
List<Role> roles = new ArrayList<>();
|
||||
|
||||
User user = new User(name, password, roles);
|
||||
List<User> expectedUsers = Collections.singletonList(user);
|
||||
|
||||
InMemoryRepository repository = new InMemoryRepository();
|
||||
repository.save(user);
|
||||
|
||||
List<User> users = repository.getAll();
|
||||
|
||||
assertEquals(expectedUsers, users);
|
||||
}
|
||||
|
||||
@Test
|
||||
void save_whenSavingUser_shouldSetId() {
|
||||
String name = "Test";
|
||||
String password = "test123";
|
||||
List<Role> roles = new ArrayList<>();
|
||||
|
||||
User user = new User(name, password, roles);
|
||||
|
||||
InMemoryRepository repository = new InMemoryRepository();
|
||||
repository.save(user);
|
||||
|
||||
assertNotNull(user.getId());
|
||||
}
|
||||
|
||||
@Test
|
||||
void save_whenSavingRole_shouldSetId() {
|
||||
String name = "Test";
|
||||
Role role = new Role(name);
|
||||
|
||||
InMemoryRepository repository = new InMemoryRepository();
|
||||
repository.save(role);
|
||||
|
||||
assertNotNull(role.getId());
|
||||
}
|
||||
|
||||
@Test
|
||||
void getRoleById_shouldReturnRoleById() {
|
||||
String name = "Test";
|
||||
Role expectedRole = new Role(name);
|
||||
|
||||
InMemoryRepository repository = new InMemoryRepository();
|
||||
repository.save(expectedRole);
|
||||
|
||||
Role role = repository.getRoleById(expectedRole.getId());
|
||||
|
||||
assertEquals(expectedRole, role);
|
||||
}
|
||||
|
||||
@Test
|
||||
void getRoleByName_shouldReturnRoleByName() {
|
||||
String name = "Test";
|
||||
Role expectedRole = new Role(name);
|
||||
|
||||
InMemoryRepository repository = new InMemoryRepository();
|
||||
repository.save(expectedRole);
|
||||
|
||||
Role role = repository.getRoleByName(name);
|
||||
|
||||
assertEquals(expectedRole, role);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package com.baeldung.dtopattern.domain;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
class UserUnitTest {
|
||||
|
||||
|
||||
@Test
|
||||
void whenUserIsCreated_shouldEncryptPassword() {
|
||||
User user = new User("Test", "test", new ArrayList<>());
|
||||
|
||||
assertEquals(user.encrypt("test"), user.getPassword());
|
||||
assertNotEquals(user.encrypt("Test"), user.getPassword());
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenUserIsCreated_shouldFailIfNameIsNull() {
|
||||
assertThrows(NullPointerException.class, () ->
|
||||
new User(null, "test", new ArrayList<>()));
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenUserIsCreated_shouldFailIfPasswordIsNull() {
|
||||
assertThrows(NullPointerException.class, () ->
|
||||
new User("Test", null, new ArrayList<>()));
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenUserIsCreated_shouldFailIfRolesIsNull() {
|
||||
assertThrows(NullPointerException.class, () ->
|
||||
new User("Test", "Test", null));
|
||||
}
|
||||
|
||||
}
|
@ -33,7 +33,7 @@
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
<mongo.version>3.10.1</mongo.version>
|
||||
<mongo.version>3.12.1</mongo.version>
|
||||
<flapdoodle.version>1.11</flapdoodle.version>
|
||||
<morphia.version>1.5.3</morphia.version>
|
||||
</properties>
|
||||
|
@ -0,0 +1,50 @@
|
||||
package com.baeldung.existence.field;
|
||||
|
||||
import com.mongodb.BasicDBObject;
|
||||
import com.mongodb.MongoClient;
|
||||
import com.mongodb.client.MongoCollection;
|
||||
import com.mongodb.client.MongoDatabase;
|
||||
import com.mongodb.client.model.Filters;
|
||||
import org.bson.Document;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
public class FieldExistenceLiveTest {
|
||||
private MongoClient mongoClient;
|
||||
private MongoDatabase db;
|
||||
private MongoCollection<Document> collection;
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
if (mongoClient == null) {
|
||||
mongoClient = new MongoClient();
|
||||
db = mongoClient.getDatabase("existence");
|
||||
collection = db.getCollection("users");
|
||||
collection.insertOne(Document.parse("{'name':'Ben','surname': 'Big'}"));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenMongoCollection_whenUsingFilters_thenCheckingForExistingFieldWorks() {
|
||||
Document nameDoc = collection.find(Filters.exists("name")).first();
|
||||
assertNotNull(nameDoc);
|
||||
assertFalse(nameDoc.isEmpty());
|
||||
|
||||
nameDoc = collection.find(Filters.exists("non_existing")).first();
|
||||
assertNull(nameDoc);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenMongoCollection_whenUsingStandardDocumentQuery_thenCheckingForExistingFieldWorks() {
|
||||
Document query = new Document("name", new BasicDBObject("$exists", true));
|
||||
Document doc = collection.find(query).first();
|
||||
assertNotNull(doc);
|
||||
assertFalse(doc.isEmpty());
|
||||
|
||||
query = new Document("non_existing", new BasicDBObject("$exists", true));
|
||||
doc = collection.find(query).first();
|
||||
assertNull(doc);
|
||||
}
|
||||
}
|
@ -41,7 +41,7 @@
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
<reactor.version>3.3.9.RELEASE</reactor.version>
|
||||
<reactor.version>3.4.9</reactor.version>
|
||||
<assertj.version>3.6.1</assertj.version>
|
||||
</properties>
|
||||
|
||||
|
@ -0,0 +1,89 @@
|
||||
package com.baeldung.reactor.exception;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.reactivestreams.Publisher;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
import reactor.core.publisher.SynchronousSink;
|
||||
import reactor.test.StepVerifier;
|
||||
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Function;
|
||||
|
||||
public class ExceptionUnitTest {
|
||||
@Test
|
||||
public void givenInvalidElement_whenPipelineThrowsException_thenErrorIsSentDownstream() {
|
||||
Function<String, Integer> mapper = input -> {
|
||||
if (input.matches("\\D")) {
|
||||
throw new NumberFormatException();
|
||||
} else {
|
||||
return Integer.parseInt(input);
|
||||
}
|
||||
};
|
||||
|
||||
Flux<String> inFlux = Flux.just("1", "1.5", "2");
|
||||
Flux<Integer> outFlux = inFlux.map(mapper);
|
||||
|
||||
StepVerifier.create(outFlux)
|
||||
.expectNext(1)
|
||||
.expectError(NumberFormatException.class)
|
||||
.verify();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenInvalidElement_whenHandleCallsSinkErrorMethod_thenErrorIsSentDownstream() {
|
||||
BiConsumer<String, SynchronousSink<Integer>> handler = (input, sink) -> {
|
||||
if (input.matches("\\D")) {
|
||||
sink.error(new NumberFormatException());
|
||||
} else {
|
||||
sink.next(Integer.parseInt(input));
|
||||
}
|
||||
};
|
||||
|
||||
Flux<String> inFlux = Flux.just("1", "1.5", "2");
|
||||
Flux<Integer> outFlux = inFlux.handle(handler);
|
||||
|
||||
StepVerifier.create(outFlux)
|
||||
.expectNext(1)
|
||||
.expectError(NumberFormatException.class)
|
||||
.verify();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenInvalidElement_whenFlatMapCallsMonoErrorMethod_thenErrorIsSentDownstream() {
|
||||
Function<String, Publisher<Integer>> mapper = input -> {
|
||||
if (input.matches("\\D")) {
|
||||
return Mono.error(new NumberFormatException());
|
||||
} else {
|
||||
return Mono.just(Integer.parseInt(input));
|
||||
}
|
||||
};
|
||||
|
||||
Flux<String> inFlux = Flux.just("1", "1.5", "2");
|
||||
Flux<Integer> outFlux = inFlux.flatMap(mapper);
|
||||
|
||||
StepVerifier.create(outFlux)
|
||||
.expectNext(1)
|
||||
.expectError(NumberFormatException.class)
|
||||
.verify();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenNullElement_whenPipelineOperatorExecutes_thenNpeIsSentDownstream() {
|
||||
Function<String, Integer> mapper = input -> {
|
||||
if (input == null) {
|
||||
return 0;
|
||||
} else {
|
||||
return Integer.parseInt(input);
|
||||
}
|
||||
};
|
||||
|
||||
Flux<String> inFlux = Flux.just("1", null, "2");
|
||||
Flux<Integer> outFlux = inFlux.map(mapper);
|
||||
|
||||
StepVerifier.create(outFlux)
|
||||
.expectNext(1)
|
||||
.expectError(NullPointerException.class)
|
||||
.verify();
|
||||
}
|
||||
}
|
@ -28,6 +28,10 @@
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.kafka</groupId>
|
||||
<artifactId>spring-kafka-test</artifactId>
|
||||
@ -41,9 +45,15 @@
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-collections</groupId>
|
||||
<artifactId>commons-collections</artifactId>
|
||||
<version>3.2.1</version>
|
||||
<groupId>org.testcontainers</groupId>
|
||||
<artifactId>junit-jupiter</artifactId>
|
||||
<version>${testcontainers-kafka.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.awaitility</groupId>
|
||||
<artifactId>awaitility</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
@ -0,0 +1,25 @@
|
||||
package com.baeldung.kafka.ssl;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.kafka.clients.consumer.ConsumerRecord;
|
||||
import org.springframework.kafka.annotation.KafkaListener;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class KafkaConsumer {
|
||||
|
||||
public static final String TOPIC = "test-topic";
|
||||
|
||||
public final List<String> messages = new ArrayList<>();
|
||||
|
||||
@KafkaListener(topics = TOPIC)
|
||||
public void receive(ConsumerRecord<String, String> consumerRecord) {
|
||||
log.info("Received payload: '{}'", consumerRecord.toString());
|
||||
messages.add(consumerRecord.value());
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
package com.baeldung.kafka.ssl;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.kafka.core.KafkaTemplate;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Slf4j
|
||||
@AllArgsConstructor
|
||||
@Component
|
||||
public class KafkaProducer {
|
||||
|
||||
private final KafkaTemplate<String, String> kafkaTemplate;
|
||||
|
||||
public void sendMessage(String message, String topic) {
|
||||
log.info("Producing message: {}", message);
|
||||
kafkaTemplate.send(topic, "key", message)
|
||||
.addCallback(
|
||||
result -> log.info("Message sent to topic: {}", message),
|
||||
ex -> log.error("Failed to send message", ex)
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package com.baeldung.kafka.ssl;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
@EnableAutoConfiguration
|
||||
public class KafkaSslApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(KafkaSslApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
18
spring-kafka/src/main/resources/application-ssl.yml
Normal file
18
spring-kafka/src/main/resources/application-ssl.yml
Normal file
@ -0,0 +1,18 @@
|
||||
spring:
|
||||
kafka:
|
||||
security:
|
||||
protocol: "SSL"
|
||||
bootstrap-servers: localhost:9093
|
||||
ssl:
|
||||
trust-store-location: classpath:/client-certs/kafka.client.truststore.jks
|
||||
trust-store-password: password
|
||||
key-store-location: classpath:/client-certs/kafka.client.keystore.jks
|
||||
key-store-password: password
|
||||
consumer:
|
||||
group-id: demo-group-id
|
||||
auto-offset-reset: earliest
|
||||
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
|
||||
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
|
||||
producer:
|
||||
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
|
||||
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
|
@ -0,0 +1,54 @@
|
||||
package com.baeldung.kafka.ssl;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.ActiveProfiles;
|
||||
import org.testcontainers.containers.DockerComposeContainer;
|
||||
import org.testcontainers.containers.wait.strategy.Wait;
|
||||
import org.testcontainers.junit.jupiter.Container;
|
||||
import org.testcontainers.junit.jupiter.Testcontainers;
|
||||
|
||||
import java.io.File;
|
||||
import java.time.Duration;
|
||||
import java.util.UUID;
|
||||
|
||||
import static com.baeldung.kafka.ssl.KafkaConsumer.TOPIC;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.awaitility.Awaitility.await;
|
||||
|
||||
@Slf4j
|
||||
@ActiveProfiles("ssl")
|
||||
@Testcontainers
|
||||
@SpringBootTest(classes = KafkaSslApplication.class)
|
||||
class KafkaSslApplicationLiveTest {
|
||||
|
||||
private static final File KAFKA_COMPOSE_FILE = new File("src/test/resources/docker/docker-compose.yml");
|
||||
private static final String KAFKA_SERVICE = "kafka";
|
||||
private static final int SSL_PORT = 9093;
|
||||
|
||||
@Container
|
||||
public DockerComposeContainer<?> container =
|
||||
new DockerComposeContainer<>(KAFKA_COMPOSE_FILE)
|
||||
.withExposedService(KAFKA_SERVICE, SSL_PORT, Wait.forListeningPort());
|
||||
|
||||
@Autowired
|
||||
private KafkaProducer kafkaProducer;
|
||||
|
||||
@Autowired
|
||||
private KafkaConsumer kafkaConsumer;
|
||||
|
||||
@Test
|
||||
void givenSslIsConfigured_whenProducerSendsMessageOverSsl_thenConsumerReceivesOverSsl() {
|
||||
String message = generateSampleMessage();
|
||||
kafkaProducer.sendMessage(message, TOPIC);
|
||||
|
||||
await().atMost(Duration.ofMinutes(2))
|
||||
.untilAsserted(() -> assertThat(kafkaConsumer.messages).containsExactly(message));
|
||||
}
|
||||
|
||||
private static String generateSampleMessage() {
|
||||
return UUID.randomUUID().toString();
|
||||
}
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
||||
password
|
@ -0,0 +1 @@
|
||||
password
|
@ -0,0 +1 @@
|
||||
password
|
30
spring-kafka/src/test/resources/docker/docker-compose.yml
Normal file
30
spring-kafka/src/test/resources/docker/docker-compose.yml
Normal file
@ -0,0 +1,30 @@
|
||||
---
|
||||
version: '2'
|
||||
services:
|
||||
zookeeper:
|
||||
image: confluentinc/cp-zookeeper:6.2.0
|
||||
environment:
|
||||
ZOOKEEPER_CLIENT_PORT: 2181
|
||||
ZOOKEEPER_TICK_TIME: 2000
|
||||
|
||||
kafka:
|
||||
image: confluentinc/cp-kafka:6.2.0
|
||||
depends_on:
|
||||
- zookeeper
|
||||
ports:
|
||||
- 9092:9092
|
||||
- 9093:9093
|
||||
environment:
|
||||
KAFKA_BROKER_ID: 1
|
||||
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
|
||||
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,SSL://localhost:9093
|
||||
KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'true'
|
||||
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
|
||||
KAFKA_SSL_CLIENT_AUTH: "required"
|
||||
KAFKA_SSL_KEYSTORE_FILENAME: '/certs/kafka.server.keystore.jks'
|
||||
KAFKA_SSL_KEYSTORE_CREDENTIALS: '/certs/kafka_keystore_credentials'
|
||||
KAFKA_SSL_KEY_CREDENTIALS: '/certs/kafka_sslkey_credentials'
|
||||
KAFKA_SSL_TRUSTSTORE_FILENAME: '/certs/kafka.server.truststore.jks'
|
||||
KAFKA_SSL_TRUSTSTORE_CREDENTIALS: '/certs/kafka_truststore_credentials'
|
||||
volumes:
|
||||
- ./certs/:/etc/kafka/secrets/certs
|
@ -10,4 +10,10 @@
|
||||
<root level="INFO">
|
||||
<appender-ref ref="STDOUT" />
|
||||
</root>
|
||||
|
||||
<!-- Reduce the noise as the consumer keeps trying to connect until the Kafka instance is available -->
|
||||
<springProfile name="ssl">
|
||||
<logger name="org.apache.kafka.clients.NetworkClient" level="ERROR" additivity="false"/>
|
||||
</springProfile>
|
||||
|
||||
</configuration>
|
@ -3,3 +3,4 @@
|
||||
- [JUnit 5 TestWatcher API](https://www.baeldung.com/junit-testwatcher)
|
||||
- [JUnit Custom Display Name Generator API](https://www.baeldung.com/junit-custom-display-name-generator)
|
||||
- [@TestInstance Annotation in JUnit 5](https://www.baeldung.com/junit-testinstance-annotation)
|
||||
- [Run JUnit Test Cases From the Command Line](https://www.baeldung.com/junit-run-from-command-line)
|
||||
|
@ -0,0 +1,27 @@
|
||||
package com.baeldung.commandline;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
public class FirstUnitTest {
|
||||
|
||||
|
||||
|
||||
@Test
|
||||
void whenThis_thenThat() {
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenSomething_thenSomething() {
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenSomethingElse_thenSomethingElse() {
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,19 @@
|
||||
package com.baeldung.commandline;
|
||||
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
class SecondUnitTest {
|
||||
|
||||
@Test
|
||||
void whenSomething_thenSomething() {
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenSomethingElse_thenSomethingElse() {
|
||||
assertTrue(true);
|
||||
}
|
||||
}
|
@ -38,6 +38,14 @@
|
||||
<version>${junit.platform.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-console-standalone -->
|
||||
<dependency>
|
||||
<groupId>org.junit.platform</groupId>
|
||||
<artifactId>junit-platform-console-standalone</artifactId>
|
||||
<version>1.7.0</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.junit.vintage</groupId>
|
||||
<artifactId>junit-vintage-engine</artifactId>
|
||||
|
@ -19,7 +19,7 @@ public class MemoryAppender extends ListAppender<ILoggingEvent> {
|
||||
|
||||
public boolean contains(String string, Level level) {
|
||||
return this.list.stream()
|
||||
.anyMatch(event -> event.getMessage().toString().contains(string)
|
||||
.anyMatch(event -> event.toString().contains(string)
|
||||
&& event.getLevel().equals(level));
|
||||
}
|
||||
|
||||
@ -30,13 +30,13 @@ public class MemoryAppender extends ListAppender<ILoggingEvent> {
|
||||
|
||||
public List<ILoggingEvent> search(String string) {
|
||||
return this.list.stream()
|
||||
.filter(event -> event.getMessage().toString().contains(string))
|
||||
.filter(event -> event.toString().contains(string))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public List<ILoggingEvent> search(String string, Level level) {
|
||||
return this.list.stream()
|
||||
.filter(event -> event.getMessage().toString().contains(string)
|
||||
.filter(event -> event.toString().contains(string)
|
||||
&& event.getLevel().equals(level))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user