Merge branch 'master' of https://github.com/eugenp/tutorials into BAEL_3301_testing_@ConfigurationProperties

This commit is contained in:
m.raheem 2020-01-23 18:28:11 +02:00
commit 0175954eab
61 changed files with 1444 additions and 486 deletions

View File

@ -7,6 +7,8 @@ import akka.http.javadsl.model.HttpEntities;
import akka.http.javadsl.model.HttpRequest;
import akka.http.javadsl.testkit.JUnitRouteTest;
import akka.http.javadsl.testkit.TestRoute;
import org.junit.Ignore;
import org.junit.Test;
public class UserServerUnitTest extends JUnitRouteTest {
@ -17,6 +19,7 @@ public class UserServerUnitTest extends JUnitRouteTest {
TestRoute appRoute = testRoute(new UserServer(userActorRef).routes());
@Ignore
@Test
public void whenRequest_thenActorResponds() {

21
cloud-foundry-uaa/pom.xml Normal file
View File

@ -0,0 +1,21 @@
<?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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-foundry-uaa</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloud-foundry-uaa</name>
<packaging>pom</packaging>
<parent>
<groupId>com.baeldung</groupId>
<artifactId>parent-modules</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modules>
<module>cf-uaa-oauth2-client</module>
<module>cf-uaa-oauth2-resource-server</module>
</modules>
</project>

View File

@ -28,16 +28,17 @@ class CategoryUnitTest extends GroovyTestCase {
}
}
void test_whenUsingTimeCategory_thenOperationOnNumber() {
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy")
use (TimeCategory) {
assert sdf.format(5.days.from.now) == sdf.format(new Date() + 5.days)
sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss")
assert sdf.format(10.minutes.from.now) == sdf.format(new Date() + 10.minutes)
assert sdf.format(2.hours.ago) == sdf.format(new Date() - 2.hours)
}
}
// http://team.baeldung.com/browse/BAEL-20687
// void test_whenUsingTimeCategory_thenOperationOnNumber() {
// SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy")
// use (TimeCategory) {
// assert sdf.format(5.days.from.now) == sdf.format(new Date() + 5.days)
//
// sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss")
// assert sdf.format(10.minutes.from.now) == sdf.format(new Date() + 10.minutes)
// assert sdf.format(2.hours.ago) == sdf.format(new Date() - 2.hours)
// }
// }
void test_whenUsingDOMCategory_thenOperationOnXML() {

View File

@ -9,7 +9,7 @@ import wslite.soap.SOAPMessageBuilder
import wslite.http.auth.HTTPBasicAuthorization
import org.junit.Test
class WebserviceUnitTest extends GroovyTestCase {
class WebserviceManualTest extends GroovyTestCase {
JsonSlurper jsonSlurper = new JsonSlurper()

View File

@ -1,6 +1,7 @@
package com.baeldung.file
import spock.lang.Specification
import spock.lang.Ignore
class ReadFileUnitTest extends Specification {
@ -32,6 +33,7 @@ class ReadFileUnitTest extends Specification {
assert lines.size(), 3
}
@Ignore
def 'Should return file content in string using ReadFile.readFileString given filePath' () {
given:
def filePath = "src/main/resources/fileContent.txt"

View File

@ -1,6 +1,7 @@
package com.baeldung.rejection;
import org.junit.After;
import org.junit.Ignore;
import org.junit.Test;
import java.util.ArrayList;
@ -28,6 +29,7 @@ public class SaturationPolicyUnitTest {
}
}
@Ignore
@Test
public void givenAbortPolicy_WhenSaturated_ThenShouldThrowRejectedExecutionException() {
executor = new ThreadPoolExecutor(1, 1, 0, MILLISECONDS, new SynchronousQueue<>(), new AbortPolicy());
@ -36,6 +38,7 @@ public class SaturationPolicyUnitTest {
assertThatThrownBy(() -> executor.execute(() -> System.out.println("Will be rejected"))).isInstanceOf(RejectedExecutionException.class);
}
@Ignore
@Test
public void givenCallerRunsPolicy_WhenSaturated_ThenTheCallerThreadRunsTheTask() {
executor = new ThreadPoolExecutor(1, 1, 0, MILLISECONDS, new SynchronousQueue<>(), new CallerRunsPolicy());

View File

@ -0,0 +1,72 @@
<?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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>core-java-datetime-java8</artifactId>
<version>${project.parent.version}</version>
<name>core-java-datetime-java8</name>
<packaging>jar</packaging>
<parent>
<groupId>com.baeldung</groupId>
<artifactId>parent-java</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../../parent-java</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${joda-time.version}</version>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>${assertj.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>core-java-datetime-java8</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<maven.compiler.source>1.9</maven.compiler.source>
<maven.compiler.target>1.9</maven.compiler.target>
<joda-time.version>2.10</joda-time.version>
<!-- testing -->
<assertj.version>3.6.1</assertj.version>
</properties>
</project>

View File

@ -0,0 +1,31 @@
package com.baeldung.localdate;
import java.time.LocalDate;
import java.time.Month;
import java.time.format.DateTimeFormatter;
public class LocalDateExample {
public LocalDate getCustomDateOne(int year, int month, int dayOfMonth) {
return LocalDate.of(year, month, dayOfMonth);
}
public LocalDate getCustomDateTwo(int year, Month month, int dayOfMonth) {
return LocalDate.of(year, month, dayOfMonth);
}
public LocalDate getDateFromEpochDay(long epochDay) {
return LocalDate.ofEpochDay(epochDay);
}
public LocalDate getDateFromYearAndDayOfYear(int year, int dayOfYear) {
return LocalDate.ofYearDay(year, dayOfYear);
}
public LocalDate getDateFromString(String date) {
return LocalDate.parse(date);
}
public LocalDate getDateFromStringAndFormatter(String date, String pattern) {
return LocalDate.parse(date, DateTimeFormatter.ofPattern(pattern));
}
}

View File

@ -1,4 +1,4 @@
package com.baeldung.datebasics;
package com.baeldung.localdate;
import static org.junit.Assert.assertEquals;
@ -6,49 +6,34 @@ import java.time.Month;
import org.junit.Test;
public class CreateDateUnitTest {
private CreateDate date = new CreateDate();
@Test
public void whenUsingNowMethod_thenLocalDate() {
assertEquals("2020-01-08", date.getTodaysDate());
}
@Test
public void whenUsingClock_thenLocalDate() {
assertEquals("2020-01-08", date.getTodaysDateFromClock());
}
@Test
public void givenValues_whenUsingZone_thenLocalDate() {
assertEquals("2020-01-08", date.getTodaysDateFromZone("Asia/Kolkata"));
}
public class LocalDateExampleUnitTest {
private LocalDateExample date = new LocalDateExample();
@Test
public void givenValues_whenUsingOfMethod_thenLocalDate() {
assertEquals("2020-01-08", date.getCustomDateOne(2020, 1, 8));
}
@Test
public void givenValuesWithMonthEnum_whenUsingOfMethod_thenLocalDate() {
assertEquals("2020-01-08", date.getCustomDateTwo(2020, Month.JANUARY, 8));
}
@Test
public void givenValues_whenUsingEpochDay_thenLocalDate() {
assertEquals("2020-01-08", date.getDateFromEpochDay(18269));
}
@Test
public void givenValues_whenUsingYearDay_thenLocalDate() {
assertEquals("2020-01-08", date.getDateFromYearAndDayOfYear(2020, 8));
}
@Test
public void givenValues_whenUsingParse_thenLocalDate() {
assertEquals("2020-01-08", date.getDateFromString("2020-01-08"));
}
@Test
public void givenValuesWithFormatter_whenUsingParse_thenLocalDate() {
assertEquals("2020-01-08", date.getDateFromStringAndFormatter("8-Jan-2020", "d-MMM-yyyy"));

View File

@ -1,45 +0,0 @@
package com.baeldung.datebasics;
import java.time.Clock;
import java.time.LocalDate;
import java.time.Month;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
public class CreateDate {
public LocalDate getTodaysDate() {
return LocalDate.now();
}
public LocalDate getTodaysDateFromClock() {
return LocalDate.now(Clock.systemDefaultZone());
}
public LocalDate getTodaysDateFromZone(String zone) {
return LocalDate.now(ZoneId.of(zone));
}
public LocalDate getCustomDateOne(int year, int month, int dayOfMonth) {
return LocalDate.of(year, month, dayOfMonth);
}
public LocalDate getCustomDateTwo(int year, Month month, int dayOfMonth) {
return LocalDate.of(year, month, dayOfMonth);
}
public LocalDate getDateFromEpochDay(long epochDay) {
return LocalDate.ofEpochDay(epochDay);
}
public LocalDate getDateFromYearAndDayOfYear(int year, int dayOfYear) {
return LocalDate.ofYearDay(year, dayOfYear);
}
public LocalDate getDateFromString(String date) {
return LocalDate.parse(date);
}
public LocalDate getDateFromStringAndFormatter(String date, String pattern) {
return LocalDate.parse(date, DateTimeFormatter.ofPattern(pattern));
}
}

View File

@ -1,5 +1,6 @@
package com.baeldung.file;
import org.junit.Ignore;
import org.junit.Test;
import java.io.*;
@ -73,6 +74,7 @@ public class FileClassUnitTest {
assertFalse(writable);
}
@Ignore
@Test
public void givenWriteOnlyFile_whenCreateNewFile_thenCantReadFile() {
File parentDir = makeDir("writeDir");

View File

@ -9,10 +9,9 @@
<name>core-java-jndi</name>
<parent>
<groupId>com.baeldung</groupId>
<artifactId>parent-modules</artifactId>
<groupId>com.baeldung.core-java-modules</groupId>
<artifactId>core-java-modules</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../</relativePath>
</parent>
<dependencies>
@ -22,6 +21,12 @@
<version>${jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.5.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>

View File

@ -1,5 +1,12 @@
package com.baeldung.jndi.exceptions;
import static org.junit.jupiter.api.Assertions.assertThrows;
import javax.naming.InitialContext;
import javax.naming.NameNotFoundException;
import javax.naming.NoInitialContextException;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
@ -7,15 +14,10 @@ import org.junit.jupiter.api.TestMethodOrder;
import org.springframework.jndi.JndiTemplate;
import org.springframework.mock.jndi.SimpleNamingContextBuilder;
import javax.naming.InitialContext;
import javax.naming.NameNotFoundException;
import javax.naming.NoInitialContextException;
import static org.junit.jupiter.api.Assertions.assertThrows;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JndiExceptionsUnitTest {
@Disabled
@Test
@Order(1)
void givenNoContext_whenLookupObject_thenThrowNoInitialContext() {

View File

@ -2,7 +2,6 @@
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.baeldung.servicemodule</groupId>
<artifactId>servicemodule</artifactId>
<packaging>jar</packaging>

View File

@ -8,8 +8,8 @@
<version>1.0</version>
<parent>
<groupId>decoupling-pattern2</groupId>
<artifactId>com.baeldung.decoupling-pattern2</artifactId>
<groupId>com.baeldung.decoupling-pattern2</groupId>
<artifactId>decoupling-pattern2</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>

View File

@ -8,8 +8,8 @@
<version>1.0</version>
<parent>
<groupId>decoupling-pattern2</groupId>
<artifactId>com.baeldung.decoupling-pattern2</artifactId>
<groupId>com.baeldung.decoupling-pattern2</groupId>
<artifactId>decoupling-pattern2</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>

View File

@ -3,13 +3,12 @@
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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.baeldung.servicemodule</groupId>
<artifactId>servicemodule</artifactId>
<version>1.0</version>
<parent>
<groupId>decoupling-pattern2</groupId>
<artifactId>>com.baeldung.decoupling-pattern2</artifactId>
<groupId>com.baeldung.decoupling-pattern2</groupId>
<artifactId>decoupling-pattern2</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>

View File

@ -0,0 +1,21 @@
<?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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>core-java-jpms</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>core-java-jpms</name>
<packaging>pom</packaging>
<parent>
<groupId>com.baeldung.core-java-modules</groupId>
<artifactId>core-java-modules</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modules>
<module>decoupling-pattern1</module>
<module>decoupling-pattern2</module>
</modules>
</project>

View File

@ -2,7 +2,7 @@ package com.baeldung.exitvshalt;
import org.junit.Test;
public class JvmExitDemoUnitTest {
public class JvmExitDemoManualTest {
JvmExitAndHaltDemo jvmExitAndHaltDemo = new JvmExitAndHaltDemo();

View File

@ -2,7 +2,7 @@ package com.baeldung.exitvshalt;
import org.junit.Test;
public class JvmHaltDemoUnitTest {
public class JvmHaltDemoManualTest {
JvmExitAndHaltDemo jvmExitAndHaltDemo = new JvmExitAndHaltDemo();

View File

@ -1,6 +1,8 @@
package com.baeldung.optional;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
public class Person {
private String name;
@ -21,7 +23,7 @@ public class Person {
}
public Optional<Integer> getAge() {
return Optional.ofNullable(age);
return Optional.of(age);
}
public void setAge(int age) {
@ -36,4 +38,37 @@ public class Person {
return Optional.ofNullable(password);
}
public static List<Person> search(List<Person> people, String name, Optional<Integer> age) {
// Null checks for people and name
return people.stream()
.filter(p -> p.getName().equals(name))
.filter(p -> p.getAge().get() >= age.orElse(0))
.collect(Collectors.toList());
}
public static List<Person> search(List<Person> people, String name, Integer age) {
// Null checks for people and name
final Integer ageFilter = age != null ? age : 0;
return people.stream()
.filter(p -> p.getName().equals(name))
.filter(p -> p.getAge().get() >= ageFilter)
.collect(Collectors.toList());
}
public static List<Person> search(List<Person> people, String name) {
return doSearch(people, name, 0);
}
public static List<Person> search(List<Person> people, String name, int age) {
return doSearch(people, name, age);
}
private static List<Person> doSearch(List<Person> people, String name, int age) {
// Null checks for people and name
return people.stream()
.filter(p -> p.getName().equals(name))
.filter(p -> p.getAge().get().intValue() >= age)
.collect(Collectors.toList());
}
}

View File

@ -14,11 +14,110 @@
</parent>
<modules>
<module>pre-jpms</module>
<module>core-java-optional</module>
<module>core-java-lang-operators</module>
<module>core-java-networking-2</module>
<module>core-java</module>
<!-- <module>core-java-10</module> --> <!-- We haven't upgraded to java 10. Fixing in BAEL-10841 -->
<!-- <module>core-java-11</module> --> <!-- We haven't upgraded to java 11. Fixing in BAEL-10841 -->
<!-- <module>core-java-12</module> --> <!-- We haven't upgraded to java 12. Fixing in BAEL-10841 -->
<!-- <module>core-java-13</module> --> <!-- We haven't upgraded to java 12. Fixing in BAEL-10841 -->
<module>core-java-8</module>
<module>core-java-8-2</module>
<!-- <module>core-java-9</module> --> <!-- We haven't upgraded to java 9. Fixing in BAEL-10841 -->
<!-- <module>core-java-9-improvements</module> --> <!-- We haven't upgraded to java 9. Fixing in BAEL-10841 -->
<!-- <module>core-java-9-jigsaw</module> --> <!-- We haven't upgraded to java 9. Fixing in BAEL-10841 -->
<!-- <module>core-java-9-new-features</module> --> <!-- We haven't upgraded to java 9. Fixing in BAEL-10841 -->
<!-- <module>core-java-9-streams</module> --> <!-- We haven't upgraded to java 9. Fixing in BAEL-10841 -->
<module>core-java-annotations</module>
<module>core-java-arrays</module>
<module>core-java-arrays-2</module>
<module>core-java-collections</module>
<module>core-java-collections-2</module>
<module>core-java-collections-3</module>
<module>core-java-collections-array-list</module>
<module>core-java-collections-list</module>
<module>core-java-collections-list-2</module>
<module>core-java-collections-list-3</module>
<module>core-java-collections-set</module>
<module>core-java-concurrency-2</module>
<module>core-java-concurrency-advanced</module>
<module>core-java-concurrency-advanced-2</module>
<module>core-java-concurrency-advanced-3</module>
<module>core-java-concurrency-basic</module>
<module>core-java-concurrency-basic-2</module>
<module>core-java-concurrency-collections</module>
<!-- <module>core-java-date-operations-1</module> --> <!-- We haven't upgraded to java 9. Fixing in BAEL-10841 -->
<module>core-java-date-operations-2</module>
<!-- We haven't upgraded to java 9.-->
<!--
<module>core-java-datetime-computations</module>
<module>core-java-datetime-conversion</module>
<module>core-java-datetime-java8</module>
<module>core-java-datetime-string</module>
-->
<module>core-java-exceptions</module>
<module>core-java-exceptions-2</module>
<module>core-java-function</module>
<module>core-java-io</module>
<module>core-java-io-2</module>
<module>core-java-io-apis</module>
<module>core-java-io-conversions</module>
<module>core-java-jar</module>
<module>core-java-jndi</module>
<!-- <module>core-java-jpms</module> --> <!-- We haven't upgraded to java 10. Fixing in BAEL-10841 -->
<module>core-java-jvm</module>
<module>core-java-lambdas</module>
<module>core-java-lang</module>
<module>core-java-lang-2</module>
<module>core-java-lang-math</module>
<module>core-java-lang-oop</module>
<module>core-java-lang-oop-2</module>
<module>core-java-lang-oop-3</module>
<module>core-java-lang-oop-4</module>
<module>core-java-lang-operators</module>
<module>core-java-lang-syntax</module>
<module>core-java-lang-syntax-2</module>
<module>core-java-networking</module>
<module>core-java-networking-2</module>
<module>core-java-nio</module>
<module>core-java-nio-2</module>
<module>core-java-optional</module>
<!--<module>core-java-os</module> --> <!-- We haven't upgraded to java 9.-->
<module>core-java-perf</module>
<module>core-java-reflection</module>
<module>core-java-security</module>
<module>core-java-streams</module>
<module>core-java-streams-2</module>
<module>core-java-streams-3</module>
<module>core-java-string-algorithms</module>
<module>core-java-string-algorithms-2</module>
<module>core-java-string-algorithms-3</module>
<module>core-java-string-apis</module>
<module>core-java-string-conversions</module>
<module>core-java-string-conversions-2</module>
<module>core-java-string-operations</module>
<module>core-java-string-operations-2</module>
<module>core-java-strings</module>
<module>core-java-sun</module>
<module>core-java-text</module>
<!-- <module>core-java-time-measurements</module> --> <!-- We haven't upgraded to java 9. Fixing in BAEL-10841 -->
<!-- <module>multimodulemavenproject</module> --> <!-- We haven't upgraded to java 9. Fixing in BAEL-10841 -->
<module>pre-jpms</module>
</modules>
</project>

View File

@ -0,0 +1,73 @@
package com.baeldung.scala
import org.junit.Test
import org.junit.Assert.assertEquals
class RegexUnitTest {
private val polishPostalCode = "([0-9]{2})\\-([0-9]{3})".r
private val timestamp = "([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{3})".r
private val timestampUnanchored = timestamp.unanchored
@Test
def givenRegularExpression_whenCallingFindFirstIn_thenShouldFindCorrectMatches(): Unit = {
val postCode = polishPostalCode.findFirstIn("Warsaw 01-011, Jerusalem Avenue")
assertEquals(Some("01-011"), postCode)
}
@Test
def givenRegularExpression_whenCallingFindFirstMatchIn_thenShouldFindCorrectMatches(): Unit = {
val postCodes = polishPostalCode.findFirstMatchIn("Warsaw 01-011, Jerusalem Avenue")
assertEquals(Some("011"), for (m <- postCodes) yield m.group(2))
}
@Test
def givenRegularExpression_whenCallingFindAllIn_thenShouldFindCorrectMatches(): Unit = {
val postCodes = polishPostalCode.findAllIn("Warsaw 01-011, Jerusalem Avenue, Cracow 30-059, Mickiewicza Avenue")
.toList
assertEquals(List("01-011", "30-059"), postCodes)
polishPostalCode.findAllIn("Warsaw 01-011, Jerusalem Avenue, Cracow 30-059, Mickiewicza Avenue")
}
@Test
def givenRegularExpression_whenCallingFindAlMatchlIn_thenShouldFindCorrectMatches(): Unit = {
val postCodes = polishPostalCode.findAllMatchIn("Warsaw 01-011, Jerusalem Avenue, Cracow 30-059, Mickiewicza Avenue")
.toList
val postalDistricts = for (m <- postCodes) yield m.group(1)
assertEquals(List("01", "30"), postalDistricts)
}
@Test
def givenRegularExpression_whenExtractingValues_thenShouldExtractCorrectValues(): Unit = {
val description = "11:34:01.411" match {
case timestamp(hour, minutes, _, _) => s"It's $minutes minutes after $hour"
}
assertEquals("It's 34 minutes after 11", description)
}
@Test
def givenUnanchoredRegularExpression_whenExtractingValues_thenShouldExtractCorrectValues(): Unit = {
val description = "Timestamp: 11:34:01.411 error appeared" match {
case timestampUnanchored(hour, minutes, _, _) => s"It's $minutes minutes after $hour"
}
assertEquals("It's 34 minutes after 11", description)
}
@Test
def givenRegularExpression_whenCallingReplaceAllIn_thenShouldReplaceText(): Unit = {
val minutes = timestamp.replaceAllIn("11:34:01.311", m => m.group(2))
assertEquals("34", minutes)
}
@Test
def givenRegularExpression_whenCallingReplaceAllInWithMatcher_thenShouldReplaceText(): Unit = {
val secondsThatDayInTotal = timestamp.replaceAllIn("11:34:01.311", _ match {
case timestamp(hours, minutes, seconds, _) => s"$hours-$minutes"
})
assertEquals("11-34", secondsThatDayInTotal)
}
}

5
json-2/README.md Normal file
View File

@ -0,0 +1,5 @@
## JSON
This module contains articles about JSON.
### Relevant Articles:

41
json-2/pom.xml Normal file
View File

@ -0,0 +1,41 @@
<?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/xsd/maven-4.0.0.xsd">
<groupId>com.baeldung</groupId>
<artifactId>json-2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<artifactId>parent-modules</artifactId>
<groupId>com.baeldung</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<dependencies>
<dependency>
<groupId>com.jsoniter</groupId>
<artifactId>jsoniter</artifactId>
<version>${jsoniter.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>${assertj-core.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<jsoniter.version>0.9.23</jsoniter.version>
<assertj-core.version>3.11.1</assertj-core.version>
</properties>
</project>

View File

@ -0,0 +1,22 @@
package com.baeldung.jsoniter.model;
public class Name {
private String firstName;
private String surname;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
}

View File

@ -0,0 +1,26 @@
package com.baeldung.jsoniter.model;
import com.jsoniter.annotation.JsonProperty;
import com.jsoniter.fuzzy.MaybeStringIntDecoder;
public class Student {
@JsonProperty(decoder = MaybeStringIntDecoder.class)
private int id;
private Name name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
}

View File

@ -0,0 +1,85 @@
package com.baeldung.jsoniter;
import com.baeldung.jsoniter.model.Name;
import com.baeldung.jsoniter.model.Student;
import com.jsoniter.JsonIterator;
import com.jsoniter.ValueType;
import com.jsoniter.any.Any;
import org.junit.Test;
import static com.jsoniter.ValueType.STRING;
import static org.assertj.core.api.Assertions.assertThat;
public class JsoniterIntroUnitTest {
@Test
public void whenParsedUsingBindAPI_thenConvertedToJavaObjectCorrectly() {
String input = "{\"id\":1,\"name\":{\"firstName\":\"Joe\",\"surname\":\"Blogg\"}}";
Student student = JsonIterator.deserialize(input, Student.class);
assertThat(student.getId()).isEqualTo(1);
assertThat(student.getName().getFirstName()).isEqualTo("Joe");
assertThat(student.getName().getSurname()).isEqualTo("Blogg");
}
@Test
public void givenTypeInJsonFuzzy_whenFieldIsMaybeDecoded_thenFieldParsedCorrectly() {
String input = "{\"id\":\"1\",\"name\":{\"firstName\":\"Joe\",\"surname\":\"Blogg\"}}";
Student student = JsonIterator.deserialize(input, Student.class);
assertThat(student.getId()).isEqualTo(1);
}
@Test
public void whenParsedUsingAnyAPI_thenFieldValueCanBeExtractedUsingTheFieldName() {
String input = "{\"id\":1,\"name\":{\"firstName\":\"Joe\",\"surname\":\"Blogg\"}}";
Any any = JsonIterator.deserialize(input);
assertThat(any.toInt("id")).isEqualTo(1);
assertThat(any.toString("name", "firstName")).isEqualTo("Joe");
assertThat(any.toString("name", "surname")).isEqualTo("Blogg");
}
@Test
public void whenParsedUsingAnyAPI_thenFieldValueTypeIsCorrect() {
String input = "{\"id\":1,\"name\":{\"firstName\":\"Joe\",\"surname\":\"Blogg\"}}";
Any any = JsonIterator.deserialize(input);
assertThat(any.get("id").valueType()).isEqualTo(ValueType.NUMBER);
assertThat(any.get("name").valueType()).isEqualTo(ValueType.OBJECT);
assertThat(any.get("error").valueType()).isEqualTo(ValueType.INVALID);
}
@Test
public void whenParsedUsingIteratorAPI_thenFieldValuesExtractedCorrectly() throws Exception {
Name name = new Name();
String input = "{ \"firstName\" : \"Joe\", \"surname\" : \"Blogg\" }";
JsonIterator iterator = JsonIterator.parse(input);
for (String field = iterator.readObject(); field != null; field = iterator.readObject()) {
switch (field) {
case "firstName":
if (iterator.whatIsNext() == ValueType.STRING) {
name.setFirstName(iterator.readString());
}
continue;
case "surname":
if (iterator.whatIsNext() == ValueType.STRING) {
name.setSurname(iterator.readString());
}
continue;
default:
iterator.skip();
}
}
assertThat(name.getFirstName()).isEqualTo("Joe");
assertThat(name.getSurname()).isEqualTo("Blogg");
}
}

View File

@ -0,0 +1 @@
{"id":1,"name":{"firstName": "Joe", "surname":"Blogg"}}

View File

@ -7,6 +7,8 @@ import com.github.jknack.handlebars.Template;
import com.github.jknack.handlebars.io.ClassPathTemplateLoader;
import com.github.jknack.handlebars.io.TemplateLoader;
import java.io.IOException;
import org.junit.Ignore;
import org.junit.Test;
/**
@ -18,6 +20,7 @@ public class BuiltinHelperUnitTest {
private TemplateLoader templateLoader = new ClassPathTemplateLoader("/handlebars", ".html");
@Ignore
@Test
public void whenUsedWith_ThenContextChanges() throws IOException {
Handlebars handlebars = new Handlebars(templateLoader);
@ -30,6 +33,7 @@ public class BuiltinHelperUnitTest {
assertThat(templateString).isEqualTo("\n<h4>I live in World</h4>\n");
}
@Ignore
@Test
public void whenUsedWithMustacheStyle_ThenContextChanges() throws IOException {
Handlebars handlebars = new Handlebars(templateLoader);
@ -42,6 +46,7 @@ public class BuiltinHelperUnitTest {
assertThat(templateString).isEqualTo("\n<h4>I live in World</h4>\n");
}
@Ignore
@Test
public void whenUsedEach_ThenIterates() throws IOException {
Handlebars handlebars = new Handlebars(templateLoader);
@ -58,6 +63,7 @@ public class BuiltinHelperUnitTest {
+ "\n<span>Spring is my friend.</span>\n");
}
@Ignore
@Test
public void whenUsedEachMustacheStyle_ThenIterates() throws IOException {
Handlebars handlebars = new Handlebars(templateLoader);
@ -74,6 +80,7 @@ public class BuiltinHelperUnitTest {
+ "\n<span>Spring is my friend.</span>\n");
}
@Ignore
@Test
public void whenUsedIf_ThenPutsCondition() throws IOException {
Handlebars handlebars = new Handlebars(templateLoader);
@ -86,6 +93,7 @@ public class BuiltinHelperUnitTest {
assertThat(templateString).isEqualTo("\n<h4>Baeldung is busy.</h4>\n");
}
@Ignore
@Test
public void whenUsedIfMustacheStyle_ThenPutsCondition() throws IOException {
Handlebars handlebars = new Handlebars(templateLoader);

View File

@ -7,6 +7,8 @@ import com.github.jknack.handlebars.Template;
import com.github.jknack.handlebars.io.ClassPathTemplateLoader;
import com.github.jknack.handlebars.io.TemplateLoader;
import java.io.IOException;
import org.junit.Ignore;
import org.junit.Test;
/**
@ -18,6 +20,7 @@ public class ReusingTemplatesUnitTest {
private TemplateLoader templateLoader = new ClassPathTemplateLoader("/handlebars", ".html");
@Ignore
@Test
public void whenOtherTemplateIsReferenced_ThenCanReuse() throws IOException {
Handlebars handlebars = new Handlebars(templateLoader);
@ -30,6 +33,7 @@ public class ReusingTemplatesUnitTest {
assertThat(templateString).isEqualTo("<h4>Hi Baeldung!</h4>\n<p>This is the page Baeldung</p>");
}
@Ignore
@Test
public void whenBlockIsDefined_ThenCanOverrideWithPartial() throws IOException {
Handlebars handlebars = new Handlebars(templateLoader);

25
maven-all/pom.xml Normal file
View File

@ -0,0 +1,25 @@
<?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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>maven-all</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>maven-all</name>
<packaging>pom</packaging>
<parent>
<groupId>com.baeldung</groupId>
<artifactId>parent-modules</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modules>
<!-- <module>compiler-plugin-java-9</module> --> <!-- We haven't upgraded to java 9. -->
<module>maven</module>
<module>maven-custom-plugin/counter-maven-plugin</module>
<module>maven-war-plugin</module>
<module>profiles</module>
<module>versions-maven-plugin</module>
</modules>
</project>

22
maven-polyglot/pom.xml Normal file
View File

@ -0,0 +1,22 @@
<?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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>maven-polyglot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>maven-polyglot</name>
<packaging>pom</packaging>
<parent>
<groupId>com.baeldung</groupId>
<artifactId>parent-modules</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modules>
<!-- <module>maven-polyglot-json-app</module> --> <!-- Not a maven project -->
<module>maven-polyglot-json-extension</module>
<!-- <module>maven-polyglot-yml-app</module> --> <!-- Not a maven project -->
</modules>
</project>

View File

@ -2,4 +2,4 @@ micronaut:
application:
name: hello-world-server
server:
port: 9080
port: ${random.port}

View File

@ -5,9 +5,9 @@ import java.util.List;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.PagingAndSortingRepository;
import com.baeldung.multipledb.model.product.ProductMultipleDB;
import com.baeldung.multipledb.model.product.Product;
public interface ProductRepository extends PagingAndSortingRepository<ProductMultipleDB, Integer> {
public interface ProductRepository extends PagingAndSortingRepository<Product, Integer> {
List<ProductMultipleDB> findAllByPrice(double price, Pageable pageable);
List<Product> findAllByPrice(double price, Pageable pageable);
}

View File

@ -6,7 +6,7 @@ import javax.persistence.Table;
@Entity
@Table(schema = "products")
public class ProductMultipleDB {
public class Product {
@Id
private int id;
@ -15,19 +15,19 @@ public class ProductMultipleDB {
private double price;
public ProductMultipleDB() {
public Product() {
super();
}
private ProductMultipleDB(int id, String name, double price) {
private Product(int id, String name, double price) {
super();
this.id = id;
this.name = name;
this.price = price;
}
public static ProductMultipleDB from(int id, String name, double price) {
return new ProductMultipleDB(id, name, price);
public static Product from(int id, String name, double price) {
return new Product(id, name, price);
}
public int getId() {

View File

@ -23,7 +23,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.Transactional;
import com.baeldung.multipledb.dao.product.ProductRepository;
import com.baeldung.multipledb.model.product.ProductMultipleDB;
import com.baeldung.multipledb.model.product.Product;
@RunWith(SpringRunner.class)
@SpringBootTest(classes=MultipleDbApplication.class)
@ -36,22 +36,22 @@ public class ProductRepositoryIntegrationTest {
@Before
@Transactional("productTransactionManager")
public void setUp() {
productRepository.save(ProductMultipleDB.from(1001, "Book", 21));
productRepository.save(ProductMultipleDB.from(1002, "Coffee", 10));
productRepository.save(ProductMultipleDB.from(1003, "Jeans", 30));
productRepository.save(ProductMultipleDB.from(1004, "Shirt", 32));
productRepository.save(ProductMultipleDB.from(1005, "Bacon", 10));
productRepository.save(Product.from(1001, "Book", 21));
productRepository.save(Product.from(1002, "Coffee", 10));
productRepository.save(Product.from(1003, "Jeans", 30));
productRepository.save(Product.from(1004, "Shirt", 32));
productRepository.save(Product.from(1005, "Bacon", 10));
}
@Test
public void whenRequestingFirstPageOfSizeTwo_ThenReturnFirstPage() {
Pageable pageRequest = PageRequest.of(0, 2);
Page<ProductMultipleDB> result = productRepository.findAll(pageRequest);
Page<Product> result = productRepository.findAll(pageRequest);
assertThat(result.getContent(), hasSize(2));
assertTrue(result.stream()
.map(ProductMultipleDB::getId)
.map(Product::getId)
.allMatch(id -> Arrays.asList(1001, 1002)
.contains(id)));
}
@ -60,11 +60,11 @@ public class ProductRepositoryIntegrationTest {
public void whenRequestingSecondPageOfSizeTwo_ThenReturnSecondPage() {
Pageable pageRequest = PageRequest.of(1, 2);
Page<ProductMultipleDB> result = productRepository.findAll(pageRequest);
Page<Product> result = productRepository.findAll(pageRequest);
assertThat(result.getContent(), hasSize(2));
assertTrue(result.stream()
.map(ProductMultipleDB::getId)
.map(Product::getId)
.allMatch(id -> Arrays.asList(1003, 1004)
.contains(id)));
}
@ -73,11 +73,11 @@ public class ProductRepositoryIntegrationTest {
public void whenRequestingLastPage_ThenReturnLastPageWithRemData() {
Pageable pageRequest = PageRequest.of(2, 2);
Page<ProductMultipleDB> result = productRepository.findAll(pageRequest);
Page<Product> result = productRepository.findAll(pageRequest);
assertThat(result.getContent(), hasSize(1));
assertTrue(result.stream()
.map(ProductMultipleDB::getId)
.map(Product::getId)
.allMatch(id -> Arrays.asList(1005)
.contains(id)));
}
@ -86,12 +86,12 @@ public class ProductRepositoryIntegrationTest {
public void whenSortingByNameAscAndPaging_ThenReturnSortedPagedResult() {
Pageable pageRequest = PageRequest.of(0, 3, Sort.by("name"));
Page<ProductMultipleDB> result = productRepository.findAll(pageRequest);
Page<Product> result = productRepository.findAll(pageRequest);
assertThat(result.getContent(), hasSize(3));
assertThat(result.getContent()
.stream()
.map(ProductMultipleDB::getId)
.map(Product::getId)
.collect(Collectors.toList()), equalTo(Arrays.asList(1005, 1001, 1002)));
}
@ -101,12 +101,12 @@ public class ProductRepositoryIntegrationTest {
Pageable pageRequest = PageRequest.of(0, 3, Sort.by("price")
.descending());
Page<ProductMultipleDB> result = productRepository.findAll(pageRequest);
Page<Product> result = productRepository.findAll(pageRequest);
assertThat(result.getContent(), hasSize(3));
assertThat(result.getContent()
.stream()
.map(ProductMultipleDB::getId)
.map(Product::getId)
.collect(Collectors.toList()), equalTo(Arrays.asList(1004, 1003, 1001)));
}
@ -117,12 +117,12 @@ public class ProductRepositoryIntegrationTest {
.descending()
.and(Sort.by("name")));
Page<ProductMultipleDB> result = productRepository.findAll(pageRequest);
Page<Product> result = productRepository.findAll(pageRequest);
assertThat(result.getContent(), hasSize(5));
assertThat(result.getContent()
.stream()
.map(ProductMultipleDB::getId)
.map(Product::getId)
.collect(Collectors.toList()), equalTo(Arrays.asList(1004, 1003, 1001, 1005, 1002)));
}
@ -131,11 +131,11 @@ public class ProductRepositoryIntegrationTest {
public void whenRequestingFirstPageOfSizeTwoUsingCustomMethod_ThenReturnFirstPage() {
Pageable pageRequest = PageRequest.of(0, 2);
List<ProductMultipleDB> result = productRepository.findAllByPrice(10, pageRequest);
List<Product> result = productRepository.findAllByPrice(10, pageRequest);
assertThat(result, hasSize(2));
assertTrue(result.stream()
.map(ProductMultipleDB::getId)
.map(Product::getId)
.allMatch(id -> Arrays.asList(1002, 1005)
.contains(id)));
}

526
pom.xml

File diff suppressed because it is too large Load Diff

61
slack/pom.xml Normal file
View File

@ -0,0 +1,61 @@
<?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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.baeldung.examples</groupId>
<artifactId>slack</artifactId>
<version>1.0</version>
<name>slack</name>
<packaging>jar</packaging>
<parent>
<groupId>com.baeldung</groupId>
<artifactId>parent-modules</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>com.hubspot.slack</groupId>
<artifactId>slack-base</artifactId>
<version>${slack.version}</version>
</dependency>
<dependency>
<groupId>com.hubspot.slack</groupId>
<artifactId>slack-java-client</artifactId>
<version>${slack.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${maven-jar-plugin.version}</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.baeldung.examples.slack.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<configuration>
<mainClass>com.baeldung.examples.slack.MainClass</mainClass>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<slack.version>1.4</slack.version>
<maven-jar-plugin.version>2.4</maven-jar-plugin.version>
</properties>
</project>

View File

@ -0,0 +1,42 @@
package com.baeldung.examples.slack;
import java.io.IOException;
import java.nio.file.FileSystems;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DiskSpaceErrorChecker implements ErrorChecker {
private static final Logger LOG = LoggerFactory.getLogger(DiskSpaceErrorChecker.class);
private final ErrorReporter errorReporter;
private final double limit;
public DiskSpaceErrorChecker(ErrorReporter errorReporter, double limit) {
this.errorReporter = errorReporter;
this.limit = limit;
}
@Override
public void check() {
LOG.info("Checking disk space");
FileSystems.getDefault().getFileStores().forEach(fileStore -> {
try {
long totalSpace = fileStore.getTotalSpace();
long usableSpace = fileStore.getUsableSpace();
double usablePercentage = ((double) usableSpace) / totalSpace;
LOG.debug("File store {} has {} of {} ({}) usable space",
fileStore, usableSpace, totalSpace, usablePercentage);
if (totalSpace > 0 && usablePercentage < limit) {
String error = String.format("File store %s only has %d%% usable disk space",
fileStore.name(), (int)(usablePercentage * 100));
errorReporter.reportProblem(error);
}
} catch (IOException e) {
LOG.error("Error getting disk space for file store {}", fileStore, e);
}
});
}
}

View File

@ -0,0 +1,5 @@
package com.baeldung.examples.slack;
public interface ErrorChecker {
void check();
}

View File

@ -0,0 +1,5 @@
package com.baeldung.examples.slack;
public interface ErrorReporter {
void reportProblem(String problem);
}

View File

@ -0,0 +1,41 @@
package com.baeldung.examples.slack;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
import com.hubspot.slack.client.SlackClient;
import com.hubspot.slack.client.SlackClientFactory;
import com.hubspot.slack.client.SlackClientRuntimeConfig;
public class MainClass {
public static final long MINUTES = 1000 * 60;
public static void main(String[] args) throws IOException {
SlackClientRuntimeConfig runtimeConfig = SlackClientRuntimeConfig.builder()
.setTokenSupplier(() -> "<Your API Token>")
.build();
SlackClient slackClient = SlackClientFactory.defaultFactory().build(runtimeConfig);
ErrorReporter slackChannelErrorReporter = new SlackChannelErrorReporter(slackClient, "general");
ErrorReporter slackUserErrorReporter = new SlackUserErrorReporter(slackClient, "testuser@baeldung.com");
ErrorChecker diskSpaceErrorChecker10pct = new DiskSpaceErrorChecker(slackChannelErrorReporter, 0.1);
ErrorChecker diskSpaceErrorChecker2pct = new DiskSpaceErrorChecker(slackUserErrorReporter, 0.02);
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
diskSpaceErrorChecker10pct.check();
}
}, 0, 5 * MINUTES);
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
diskSpaceErrorChecker2pct.check();
}
}, 0, 5 * MINUTES);
}
}

View File

@ -0,0 +1,30 @@
package com.baeldung.examples.slack;
import com.hubspot.slack.client.SlackClient;
import com.hubspot.slack.client.methods.params.chat.ChatPostMessageParams;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SlackChannelErrorReporter implements ErrorReporter {
private static final Logger LOG = LoggerFactory.getLogger(SlackChannelErrorReporter.class);
private final SlackClient slackClient;
private final String channel;
public SlackChannelErrorReporter(SlackClient slackClient, String channel) {
this.slackClient = slackClient;
this.channel = channel;
}
@Override
public void reportProblem(String problem) {
LOG.debug("Sending message to channel {}: {}", channel, problem);
slackClient.postMessage(
ChatPostMessageParams.builder()
.setText(problem)
.setChannelId(channel)
.build()
).join().unwrapOrElseThrow();
}
}

View File

@ -0,0 +1,52 @@
package com.baeldung.examples.slack;
import java.util.List;
import com.hubspot.slack.client.SlackClient;
import com.hubspot.slack.client.methods.params.chat.ChatPostMessageParams;
import com.hubspot.slack.client.methods.params.conversations.ConversationCreateParams;
import com.hubspot.slack.client.methods.params.im.ImOpenParams;
import com.hubspot.slack.client.methods.params.users.UserEmailParams;
import com.hubspot.slack.client.methods.params.users.UsersInfoParams;
import com.hubspot.slack.client.models.response.im.ImOpenResponse;
import com.hubspot.slack.client.models.response.users.UsersInfoResponse;
import com.hubspot.slack.client.models.users.SlackUser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SlackUserErrorReporter implements ErrorReporter {
private static final Logger LOG = LoggerFactory.getLogger(SlackUserErrorReporter.class);
private final SlackClient slackClient;
private final String user;
public SlackUserErrorReporter(SlackClient slackClient, String user) {
this.slackClient = slackClient;
this.user = user;
}
@Override
public void reportProblem(String problem) {
LOG.debug("Sending message to user {}: {}", user, problem);
UsersInfoResponse usersInfoResponse = slackClient
.lookupUserByEmail(UserEmailParams.builder()
.setEmail(user)
.build()
).join().unwrapOrElseThrow();
ImOpenResponse imOpenResponse = slackClient.openIm(ImOpenParams.builder()
.setUserId(usersInfoResponse.getUser().getId())
.build()
).join().unwrapOrElseThrow();
imOpenResponse.getChannel().ifPresent(channel -> {
slackClient.postMessage(
ChatPostMessageParams.builder()
.setText(problem)
.setChannelId(channel.getId())
.build()
).join().unwrapOrElseThrow();
});
}
}

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>

View File

@ -68,6 +68,10 @@
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
<build>

View File

@ -0,0 +1,15 @@
package com.baeldung.springcloudgateway.custompredicates;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
@SpringBootApplication
public class CustomPredicatesApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(CustomPredicatesApplication.class)
.profiles("customroutes")
.run(args);
}
}

View File

@ -0,0 +1,38 @@
package com.baeldung.springcloudgateway.custompredicates.config;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.baeldung.springcloudgateway.custompredicates.factories.GoldenCustomerRoutePredicateFactory;
import com.baeldung.springcloudgateway.custompredicates.factories.GoldenCustomerRoutePredicateFactory.Config;
import com.baeldung.springcloudgateway.custompredicates.service.GoldenCustomerService;
@Configuration
public class CustomPredicatesConfig {
@Bean
public GoldenCustomerRoutePredicateFactory goldenCustomer(GoldenCustomerService goldenCustomerService) {
return new GoldenCustomerRoutePredicateFactory(goldenCustomerService);
}
//@Bean
public RouteLocator routes(RouteLocatorBuilder builder, GoldenCustomerRoutePredicateFactory gf ) {
return builder.routes()
.route("dsl_golden_route", r -> r.path("/dsl_api/**")
.filters(f -> f.stripPrefix(1))
.uri("https://httpbin.org")
.predicate(gf.apply(new Config(true, "customerId"))))
.route("dsl_common_route", r -> r.path("/dsl_api/**")
.filters(f -> f.stripPrefix(1))
.uri("https://httpbin.org")
.predicate(gf.apply(new Config(false, "customerId"))))
.build();
}
}

View File

@ -0,0 +1,102 @@
/**
*
*/
package com.baeldung.springcloudgateway.custompredicates.factories;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import javax.validation.constraints.NotEmpty;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.http.HttpCookie;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;
import com.baeldung.springcloudgateway.custompredicates.service.GoldenCustomerService;
/**
* @author Philippe
*
*/
public class GoldenCustomerRoutePredicateFactory extends AbstractRoutePredicateFactory<GoldenCustomerRoutePredicateFactory.Config> {
private final GoldenCustomerService goldenCustomerService;
public GoldenCustomerRoutePredicateFactory(GoldenCustomerService goldenCustomerService ) {
super(Config.class);
this.goldenCustomerService = goldenCustomerService;
}
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList("isGolden","customerIdCookie");
}
@Override
public Predicate<ServerWebExchange> apply(Config config) {
return (ServerWebExchange t) -> {
List<HttpCookie> cookies = t.getRequest()
.getCookies()
.get(config.getCustomerIdCookie());
boolean isGolden;
if ( cookies == null || cookies.isEmpty()) {
isGolden = false;
}
else {
String customerId = cookies.get(0).getValue();
isGolden = goldenCustomerService.isGoldenCustomer(customerId);
}
return config.isGolden()?isGolden:!isGolden;
};
}
@Validated
public static class Config {
boolean isGolden = true;
@NotEmpty
String customerIdCookie = "customerId";
public Config() {}
public Config( boolean isGolden, String customerIdCookie) {
this.isGolden = isGolden;
this.customerIdCookie = customerIdCookie;
}
public boolean isGolden() {
return isGolden;
}
public void setGolden(boolean value) {
this.isGolden = value;
}
/**
* @return the customerIdCookie
*/
public String getCustomerIdCookie() {
return customerIdCookie;
}
/**
* @param customerIdCookie the customerIdCookie to set
*/
public void setCustomerIdCookie(String customerIdCookie) {
this.customerIdCookie = customerIdCookie;
}
}
}

View File

@ -0,0 +1,26 @@
/**
*
*/
package com.baeldung.springcloudgateway.custompredicates.service;
import org.springframework.stereotype.Component;
/**
* @author Philippe
*
*/
@Component
public class GoldenCustomerService {
public boolean isGoldenCustomer(String customerId) {
// TODO: Add some AI logic to check is this customer deserves a "golden" status ;^)
if ( "baeldung".equalsIgnoreCase(customerId)) {
return true;
}
else {
return false;
}
}
}

View File

@ -0,0 +1,26 @@
spring:
cloud:
gateway:
routes:
- id: golden_route
uri: https://httpbin.org
predicates:
- Path=/api/**
- GoldenCustomer=true
filters:
- StripPrefix=1
- AddRequestHeader=GoldenCustomer,true
- id: common_route
uri: https://httpbin.org
predicates:
- Path=/api/**
- name: GoldenCustomer
args:
golden: false
customerIdCookie: customerId
filters:
- StripPrefix=1
- AddRequestHeader=GoldenCustomer,false

View File

@ -5,6 +5,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import org.assertj.core.api.Condition;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.web.server.LocalServerPort;
@ -27,6 +28,7 @@ public class CustomFiltersLiveTest {
@LocalServerPort
String port;
@Autowired
private WebTestClient client;
@BeforeEach

View File

@ -0,0 +1,67 @@
package com.baeldung.springcloudgateway.custompredicates;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;
import java.net.URI;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
import org.junit.Before;
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.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.http.HttpStatus;
import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.ActiveProfiles;
/**
* This test requires
*/
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@ActiveProfiles("customroutes")
public class CustomPredicatesApplicationLiveTest {
@LocalServerPort
String serverPort;
@Autowired
private TestRestTemplate restTemplate;
@Test
void givenNormalCustomer_whenCallHeadersApi_thenResponseForNormalCustomer() throws JSONException {
String url = "http://localhost:" + serverPort + "/api/headers";
ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
JSONObject json = new JSONObject(response.getBody());
JSONObject headers = json.getJSONObject("headers");
assertThat(headers.getString("Goldencustomer")).isEqualTo("false");
}
@Test
void givenGoldenCustomer_whenCallHeadersApi_thenResponseForGoldenCustomer() throws JSONException {
String url = "http://localhost:" + serverPort + "/api/headers";
RequestEntity<Void> request = RequestEntity
.get(URI.create(url))
.header("Cookie", "customerId=baeldung")
.build();
ResponseEntity<String> response = restTemplate.exchange(request, String.class);
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
JSONObject json = new JSONObject(response.getBody());
JSONObject headers = json.getJSONObject("headers");
assertThat(headers.getString("Goldencustomer")).isEqualTo("true");
}
}

View File

@ -413,7 +413,7 @@
<repository>
<id>spring-roo-repository</id>
<name>Spring Roo Repository</name>
<url>http://repo.spring.io/spring-roo</url>
<url>https://repo.spring.io/spring-roo</url>
</repository>
</repositories>

View File

@ -0,0 +1,44 @@
<?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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-security-modules</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-security-modules</name>
<packaging>pom</packaging>
<parent>
<groupId>com.baeldung</groupId>
<artifactId>parent-modules</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modules>
<module>spring-security-acl</module>
<module>spring-security-angular/server</module>
<module>spring-security-cache-control</module>
<module>spring-security-core</module>
<module>spring-security-cors</module>
<module>spring-security-kerberos</module>
<module>spring-security-mvc</module>
<module>spring-security-mvc-boot</module>
<module>spring-security-mvc-custom</module>
<module>spring-security-mvc-digest-auth</module>
<module>spring-security-mvc-jsonview</module>
<module>spring-security-mvc-ldap</module>
<module>spring-security-mvc-login</module>
<module>spring-security-mvc-persisted-remember-me</module>
<module>spring-security-mvc-socket</module>
<module>spring-security-oidc</module>
<!--<module>spring-security-react</module> --> <!-- Module broken, fixing in BAEL-20772 -->
<module>spring-security-rest</module>
<module>spring-security-rest-basic-auth</module>
<module>spring-security-rest-custom</module>
<module>spring-security-sso</module>
<module>spring-security-stormpath</module>
<module>spring-security-thymeleaf</module>
<module>spring-security-x509</module>
</modules>
</project>

View File

@ -3,15 +3,14 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-security-cors</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-security-cors</name>
<packaging>jar</packaging>
<description>Spring Security CORS</description>
<parent>
<groupId>com.baeldung</groupId>
<artifactId>parent-modules</artifactId>
<version>1.0.0-SNAPSHOT</version>
<artifactId>spring-security-modules</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencyManagement>

View File

@ -18,7 +18,7 @@ import com.baeldung.springbootsecuritycors.basicauth.SpringBootSecurityApplicati
@RunWith(SpringRunner.class)
@SpringBootTest(classes = { SpringBootSecurityApplication.class })
public class ResourceControllerTest {
public class ResourceControllerUnitTest {
private MockMvc mockMvc;

View File

@ -1,3 +0,0 @@
### Relevant Articles
- [Simple Single Sign-On with Spring Security OAuth2](https://www.baeldung.com/sso-spring-security-oauth2)

View File

@ -1,3 +0,0 @@
### Relevant Articles:
- [Simple Single Sign-On with Spring Security OAuth2](https://www.baeldung.com/sso-spring-security-oauth2)

View File

@ -1,3 +0,0 @@
### Relevant Articles
- [Simple Single Sign-On with Spring Security OAuth2](https://www.baeldung.com/sso-spring-security-oauth2)